对google个性主页的拖拽效果的js的完整注释-2

// 初始化可以拖拽的Element的函数,与拖拽无关的我去掉了
  draggable(el) {
     // 公用的开始拖拽的函数
     this ._dragStart  =  start_Drag;
     // 公用的正在拖拽的函数
     this ._drag  =  when_Drag;
     // 公用的拖拽结束的函数
     this ._dragEnd  =  end_Drag;
     // 这个函数主要用来进行拖拽结束后的dom处理
     this ._afterDrag  =  after_Drag;
     // 是否正在被拖动,一开始当然没有被拖动
     this .isDragging  =   false ;
     // 将这个Element的this指针注册在elm这个变量里面,方便在自己的上下文以外调用自己的函数等,很常用的方法
     this .elm  =  el;
     // 触发拖拽的Element,在这里就是这个div上显示标题的那个div
     this .header  =  getElementById(el.id  +   " _h " );
     // 对于有i的element拖拽不同,这里检测一下并记录
     this .hasI  =   this .elm.getElementsByTagName( " I " ).length  >   0 ;
     // 如果找到了header就绑定drag相关的event
     if  ( this .header) {
         // 拖拽时的叉子鼠标指针
         this .header.style.cursor  =   " move " ;
         // 将函数绑定到header和element的this上,参照那个函数的说明
        Drag.init( this .header,  this .elm);
         // 下面三个语句将写好的三个函数绑定给这个elemnt的三个函数钩子上,也就实现了element从draggable继承可拖拽的函数
         this .elm.onDragStart  =  Util.bind( this ,  " _dragStart " );
         this .elm.onDrag  =  Util.bind( this ,  " _drag " );
         this .elm.onDragEnd  =  Util.bind( this ,  " _dragEnd " );
    }
};

// 下面就是draggable里面用到的那4个
// 公用的开始拖拽的函数
  start_Drag() {
     // 重置坐标,实现拖拽以后自己的位置马上会被填充的效果
    Util.re_calcOff( this );
     // 记录原先的邻居节点,用来对比是否被移动到新的位置
     this .origNextSibling  =   this .elm.nextSibling;
     // 获取移动的时候那个灰色的虚线框
     var  _ghostElement  =  getGhostElement();
     // 获取正在移动的这个对象的高度
     var  offH  =   this .elm.offsetHeight;
     if  (Util.isGecko) {
         // 修正gecko引擎的怪癖吧
        offH  -=  parseInt(_ghostElement.style.borderTopWidth)  *   2 ;
    }
     // 获取正在移动的这个对象的宽度
     var  offW  =   this .elm.offsetWidth;
     // 获取left和top的坐标
     var  offLeft  =  Util.getOffset( this .elm,  true );
     var  offTop  =  Util.getOffset( this .elm,  false );
     // 防止闪烁,现隐藏
    Util.hide();
     // 将自己的宽度记录在style属性里面
     this .elm.style.width  =  offW  +   " px " ;
     // 将那个灰框设定得与正在拖动的对象一样高,比较形象
    _ghostElement.style.height  =  offH  +   " px " ;
     // 把灰框放到这个对象原先的位置上
     this .elm.parentNode.insertBefore(_ghostElement,  this .elm.nextSibling);
     // 由于要拖动必须将被拖动的对象从原先的盒子模型里面抽出来,所以设定position为absolute,这个可以参考一下css布局方面的知识
     this .elm.style.position  =   " absolute " ;
     // 设置zIndex,让它处在最前面一层,当然其实zIndex=100是让它很靠前,如果页面里有zIndex>100的,那……
     this .elm.style.zIndex  =   100 ;
     // 由于position=absolute了,所以left和top实现绝对坐标定位,这就是先前计算坐标的作用,不让这个模型乱跑,要从开始拖动的地方开始移动
     this .elm.style.left  =  offLeft  +   " px " ;
     this .elm.style.top  =  offTop  +   " px " ;
     // 坐标设定完毕,可以显示了,这样就不会闪烁了
    Util.show();
     // 这里本来有个ig_d.G,没搞明白干什么用的,不过没有也可以用,谁知道麻烦告诉我一声,不好意思
     // 还没有开始拖拽,这里做个记号
     this .isDragging  =   false ;
     return   false ;
};

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Element-UI` 的 `el-tree-v2` 是一个基于 Vue.js 开发的树形组件,它提供了丰富的功能,包括拖拽节点(draggable nodes)的支持,使得用户能够灵活地调整树结构。在 `el-tree-v2` 中,拖拽功能通常通过组件的内置 API 和事件处理来实现。 以下是 `el-tree-v2` 拖拽节点的基本步骤和关键点: 1. **启用拖拽**: 首先,在组件选项中设置 `draggable` 为 `true`,并可能需要配置 `allow-drag` 和 `drop-ok-props` 来指定哪些节点允许拖拽和接受目标。 ```javascript <el-tree :data="treeData" :props="defaultProps" :draggable="true" :allow-drag="{ disabled: node.disabled }" :drop-ok-props="{ children: true }" /> ``` 2. **定义拖拽事件**: 使用组件提供的 `@drop`、`@drag-over` 和 `@drag-start` 事件来处理拖拽过程中的交互。例如,`@drop` 会在节点放下时触发,`@drag-over` 则处理拖动节点在目标上移动时的状态。 ```javascript <el-tree @drop="handleDrop" @drag-over="handleDragOver" @drag-start="handleDragStart" /> ``` 3. **处理拖拽操作**: 在这些事件处理器中,你可以读取拖动节点 (`event.dragNode`) 和目标节点 (`event.target`),进行判断和操作。比如检查目标节点是否可以接受拖入,然后更新数据模型(通常是通过 `this.$set` 或者 `this.$refs.tree.$emit('node-drop', ...)`)。 ```javascript methods: { handleDrop(event) { const { draggedNode, targetNode } = event; // 更新节点位置或合并/拆分节点 this.updateTreeNode(draggedNode, targetNode); }, handleDragOver(event) { event.preventDefault(); // 阻止默认行为,防止自动滚动 // 根据目标节点的属性决定是否允许放置 }, handleDragStart() { // 初始化拖拽状态 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值