1. 指令代码 首先呈现核心指令代码。通过自定义指令 appDrag 实现元素拖拽,利用 @HostListener 绑定事件,逻辑清晰且简洁。 import { Directive, ElementRef, OnInit, HostListener } from '@angular/core';
Angular6 drag指令实现拖拽实例详解
作者:技术拾光
时间:2026-06-12
浏览:221
文章目录
1. 指令代码
首先呈现核心指令代码。通过自定义指令 appDrag 实现元素拖拽,利用 @HostListener 绑定事件,逻辑清晰且简洁。
import { Directive, ElementRef, OnInit, HostListener } from '@angular/core';
@Directive({
selector: '[appDrag]'
})
export class DragDirective implements OnInit {
constructor(public el: ElementRef) {
}
public isDown = false;
public disX; // 记录鼠标点击事件的位置 X
public disY; // 记录鼠标点击事件的位置 Y
private totalOffsetX = 0; // 记录总偏移量 X轴
private totalOffsetY = 0; // 记录总偏移量 Y轴
// 点击事件
@HostListener('mousedown', ['$event']) onMousedown(event) {
this.isDown = true;
this.disX = event.clientX;
this.disY = event.clientY;
}
// 监听document移动事件事件
@HostListener('document:mousemove', ['$event']) onMousemove(event) {
// 判断该元素是否被点击了。
if (this.isDown) {
this.el.nativeElement.style.left = this.totalOffsetX + event.clientX - this.disX + 'px';
this.el.nativeElement.style.top = this.totalOffsetY + event.clientY - this.disY + 'px';
}
}
// 监听document离开事件
@HostListener('document:mouseup', ['$event']) onMouseup(event) {
// 只用当元素移动过了,离开函数体才会触发。
if (this.isDown) {
console.log('fail');
this.totalOffsetX += event.clientX - this.disX;
this.totalOffsetY += event.clientY - this.disY;
this.isDown = false;
}
}
ngOnInit() {
this.el.nativeElement.style.position = 'relative';
}
}
指令核心思路:鼠标按下时记录起始位置,移动时计算偏移并实时修改元素位置,松开时更新累计偏移量并重置按下状态。其中 totalOffsetX 和 totalOffsetY 用于解决多次拖拽的位置累加问题——否则每次松开后重新拖拽,元素会跳回初始位置。这一细节在多数初版实现中容易被忽略,值得留意。
2. 使用
指令编写完成后,如何使用?首先在对应的 NgModule 中将其注册到 declarations 数组里,告知 Angular 该指令可用。

随后直接在需要拖拽的组件标签上添加 整体流程简单明了:先定义指令,再注册,最后挂载到元素上。日后其他组件如需拖拽功能,只需复用同一指令,无需重复编写事件绑定逻辑。这正是 Angular 指令的正确使用方式。appDrag 属性指令即可。例如一个 ,按以上逻辑,该 div 即具备鼠标拖拽移动的能力。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章