效果展示

主要代码
拖动代码
import {
Directive,
ElementRef,
HostListener,
Input,
Renderer2,
} from "@angular/core";
import { DragDropService } from "./drag-drop.service";
@Directive({
selector: "[appDrag]",
})
export class DragDirective {
private _isDraggable = false;
@Input() dragTag: string;
@Input() dragData: any;
@Input() isClone = true;
@Input() dragClass = "dragging";
constructor(
private el: ElementRef,
private rd: Renderer2,
private service: DragDropService
) {}
@Input("appDrag")
set isDraggable(val) {
this._isDraggable = val;
this.rd.setAttribute(this.el.nativeElement, "draggable", `${val}`);
}
get isDraggable() {
return this._isDraggable;
}
@HostListener("dragstart", ["$event"])
ondragStart(ev: Event) {
if (this.el.nativeElement === ev.target) {
this.service.setDragData({
tag: this.dragTag,
data: Object.assign({}, this.dragData),
el: this.el,
});
this.rd.addClass(this.el.nativeElement, this.dragClass);
}
}
@HostListener("dragend", ["$event"])
onDragEnd(ev: Event) {
if (this.el.nativeElement === ev.target) {
this.service.setDragData({
tag: this.dragTag,
data: Object.assign({}, this.dragData),
el: this.el,
});
this.rd.removeClass(this.el.nativeElement, this.dragClass);
}
}
}
放代码
import {
Directive,
ElementRef,
EventEmitter,
HostListener,
Input,
Output,
Renderer2,
} from "@angular/core";
import { take } from "rxjs/operators";
import { DragData, DragDropService } from "./drag-drop.service";
@Directive({
selector: "[appDrop]",
})
export class DropDirective {
@Input() dropTags: string[] = [];
@Output() dropend = new EventEmitter<DragData>();
private _datas;
private x;
private y;
constructor(
private el: ElementRef,
private rd: Renderer2,
private service: DragDropService
) {
this._datas = this.service.getDragData().pipe(take(1));
}
@HostListener("dragenter", ["$event"])
onDragEnter(ev: Event) {
ev.preventDefault();
ev.stopPropagation();
if (ev.target === this.el.nativeElement) {
console.log(ev, 1);
}
}
@HostListener("dragover", ["$event"])
onDragOver(ev: Event) {
ev.preventDefault();
ev.stopPropagation();
console.log("000");
this._datas.subscribe((datas) => {
if (datas && this.dropTags.indexOf(datas.tag) > -1) {
this.rd.setProperty(ev, "dataTransfer.effectAllowed", "all");
this.rd.setProperty(ev, "dataTransfer.fropEffect", "move");
} else {
this.rd.setProperty(ev, "dataTransfer.effectAllowed", "none");
this.rd.setProperty(ev, "dataTransfer.dropEffect", "none");
}
});
}
@HostListener("dragleave", ["$event"])
onDragLeave(ev: Event) {
ev.preventDefault();
ev.stopPropagation();
}
@HostListener("drop", ["$event"])
onDrop(ev: Event) {
ev.preventDefault();
ev.stopPropagation();
if (ev.target === this.el.nativeElement) {
this._datas.subscribe((datas) => {
if (datas && this.dropTags.indexOf(datas.tag) > -1) {
const rectInfo = this.el.nativeElement.getBoundingClientRect();
datas.x =
ev["pageX"] -
rectInfo.left -
datas.el.nativeElement.offsetWidth / 2;
datas.y =
ev["pageY"] -
rectInfo.top -
datas.el.nativeElement.offsetHeight / 2;
datas.width = datas.el.nativeElement.offsetWidth;
datas.height = datas.el.nativeElement.offsetHeight;
datas.rotate = 0;
this.dropend.emit(datas);
this.service.clearDragData();
}
});
}
}
}
使用
<com-container class="contain" [title]="item.key" [config]="item.value" [appDrag]="true" [dragTag]="'left'"
[dragData]="item.value.data">
</com-container>
<div class="container" appDrop [dropTags]="tags" (dropend)="dropend($event)">
<div *ngFor="let item of listData;let i=index " class="cont">
<com-container class="contain" [attr.index]="i" [ngStyle]="{'left': item.x+'px','top':item.y+'px'}" [title]=""
[config]="{'index':i,'data':item}" [appDrag]="true" [dragTag]="'main'" [dragData]="item.data"
[isActive]="i===selectedIndex" (click)="setProp(i,item,$event)">
</com-container>
</div>
完整代码