Angular6 drag指令实现拖拽实例详解

作者:技术拾光

时间:2026-06-12

浏览:221

1. 指令代码 首先呈现核心指令代码。通过自定义指令 appDrag 实现元素拖拽,利用 @HostListener 绑定事件,逻辑清晰且简洁。 import { Directive, ElementRef, OnInit, HostListener } from '@angular/core';

文章目录

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 该指令可用。

Angular6 drag指令实现拖拽实例详解

随后直接在需要拖拽的组件标签上添加 appDrag 属性指令即可。例如一个

,按以上逻辑,该 div 即具备鼠标拖拽移动的能力。

整体流程简单明了:先定义指令,再注册,最后挂载到元素上。日后其他组件如需拖拽功能,只需复用同一指令,无需重复编写事件绑定逻辑。这正是 Angular 指令的正确使用方式。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章