游乐游手机版
首页/前端开发/文章详情

Angular6拖拽指令Drag实例详解

时间:2026-06-13 06:45
1 指令代码 首先展示核心指令代码。这段实现中,我们通过自定义指令 appDrag 让元素具备拖拽能力,逻辑清晰,并使用 @HostListener 绑定事件,代码简洁高效。 import { Directive, ElementRef, OnInit, HostListener } from

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';
  }
}

指令的核心逻辑:鼠标按下时记录初始坐标,移动时计算偏移量并实时更新元素位置,松开鼠标时累加总偏移量并重置按下状态。其中 totalOffsetXtotalOffsetY 用于解决多次拖拽的位置累积问题——否则每次松开后重新拖拽,元素会跳回起始位置。这一细节在初版实现中容易被忽略,值得特别注意。

2. 使用

指令编写完成后,如何应用到项目中?首先,在对应的 NgModule 中将其注册到 declarations 数组里,告知 Angular 该指令可供使用。

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

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

,按照上述逻辑,该 div 瞬间就拥有了鼠标拖拽移动的能力。

整体流程非常简单:先定义指令,再注册,最后挂载到元素上。以后其他组件若需要拖拽功能,只需复用同一个指令,无需重复编写事件绑定逻辑。这才是 Angular 指令的正确用法与最佳实践。

来源:https://www.jb51.net/javascript/303470t1n.htm
上一篇Angular6中Debug Failure at typeToString错误的完整解决方法与原因深度分析 下一篇Angular路由从入门到实战详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Layui弹出层监听子页面键盘快捷键实现方法
前端开发 · 2026-07-06

Layui弹出层监听子页面键盘快捷键实现方法

子页面键盘事件监听需在DOM加载完成后绑定,父页无法直接监听子页按键,必须由子页自身监听后通过parent或postMessage通知父页。典型写法为子页调用父页已定义的关闭函数。需注意焦点状态、输入法及layui版本兼容性等陷阱。

Layui表单提交时携带当前页面Meta信息的实现方法
前端开发 · 2026-07-06

Layui表单提交时携带当前页面Meta信息的实现方法

Layui表单提交不会自动携带页面Meta信息,需在form on( submit )回调中手动读取meta内容并拼接到表单数据,注意后端字段映射及特殊字符编码,多meta时按需选取。

HTML5拖拽事件流状态转移监控调试
前端开发 · 2026-07-06

HTML5拖拽事件流状态转移监控调试

HTML5拖拽事件流易因漏监听或未调用preventDefault而中断。需掌握dragstart设置数据、dragover接受放置、drop触发条件等关键点。通过统一日志捕获事件上下文、识别常见状态丢失场景并配合可视化面板,可清晰定位拖拽过程断点。

uni-app实现小红书商品详情图卡片切换
前端开发 · 2026-07-06

uni-app实现小红书商品详情图卡片切换

通过手写touch事件与transform控制五张卡片,动态计算translateX、scale、opacity及z-index模拟层叠滑动效果。滑动距离超过80rpx触发切换,否则复位。图片仅渲染当前及前后两张,有效优化加载性能与渲染效率。

图像旋转倾斜与扭曲的Canvas像素矩阵变换
前端开发 · 2026-07-06

图像旋转倾斜与扭曲的Canvas像素矩阵变换

Canvas图像变形本质是操作坐标系,图像被动跟随。旋转需先平移原点至目标中心再旋转后复位;倾斜通过仿射变换矩阵实现;扭曲无原生API,可用分块模拟或转用WebGL。每次变换前保存状态,完成后恢复,避免坐标系偏移。