vue自定义指令----pc端拖拽和移动端拖拽行为

代码注意:
1、VUE自定义指令实现的方式,Vue.directive();
2、自定义指令使用的方式必须加v-;
3、拖拽功能思路:是把要拖拽的DOM的position:设置为absolute,这样就可以基于父窗口,或者根元素进行展示;
4、先在自定义指令中获取DOM元素,然后设置onmousedown事件,获取点击的位置坐标,然后就是小算法计算位置的问题;
5、移动使用document.onmousemove,不要使用el.onmousemove
6、移动结束后,即鼠标弹起后,要把onmousemove和onmouseup事件清除;

实现拖拽用到的属性

offsetLeft:距离参照元素左边界偏移量
offsetTop:距离参照元素上边界偏移量
clientWidth:此属性可以返回指定元素客户区宽度
clientHeight: 此属性可以返回指定元素客户区高度
clientX:事件被触发时鼠标指针相对于浏览器页面(或客户区)的水平坐标
clientY: 事件被触发时鼠标指针相对于浏览器页面(或客户区)的垂直坐标
onmousedown:鼠标按下事件
onmousemove: 鼠标滑动事件
onmouseup: 鼠标松开事件

pc端实现拖拽,看代码

<template>
  <div class="about" v-drag></div>
</template>

<script>
export default {
  name: "About",
  directives: {
    drag: {
      inserted: el => {
        console.log(el);
        el.onmousedown = e => {
          //按下鼠标事件
          let ex = e.clientX - el.offsetLeft;
          let ey = e.clientY - el.offsetTop;
          el.onmousemove = e => {
            //移动鼠标事件
            let ex1 = e.clientX - ex;
            let ey1 = e.clientY - ey;
            el.style.left = ex1 + "px";
            el.style.top = ey1 + "px";
          };
        };
        el.onmouseup = function() {
          //松开鼠标事件
          el.onmousemove = null;
        };
      }
    }
  }
};
</script>

<style lang="scss" scoped>
.about {
  width: 100px;
  height: 100px;
  background: blue;
  position: absolute; //脱离文档流
}
</style>

移动端拖拽

<template>
  <div class="about" v-drag></div>
</template>

<script>
export default {
  name: "About",
  directives: {
    drag: {
      inserted: el => {
        var touch, disX, disY;
        el.ontouchstart = e => {
          if (e.touches) {
            //有可能对象在e上也有可能对象在e.touches[0]上
            touch = e.touches[0];
          } else {
            touch = e;
          }
          disX = touch.clientX - el.offsetLeft; //鼠标位置X减去元素距离左边距离(鼠标到元素左边的距离)
          disY = touch.clientY - el.offsetTop; //鼠标位置Y减去距离顶部距离(鼠标到元素顶部的高度)
        };
        el.ontouchmove = e => {
          if (e.touches) {
            //有可能对象在e上也有可能对象在e.touches[0]上
            touch = e.touches[0];
          } else {
            touch = e;
          }
          //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
          let left = touch.clientX - disX;
          let top = touch.clientY - disY;

          //移动当前元素
          el.style.left = left + "px";
          el.style.top = top + "px";
          e.preventDefault(); //阻止页面的滑动默认事件
        };
        el.ontouchend = function() {
          // el.ontouchmove = null;
          // el.ontouchend = null;
        };
      }
    }
  }
};
</script>

<style lang="scss" scoped>
.about {
  width: 100px;
  height: 100px;
  background: blue;
  position: absolute; //脱离文档流
}
</style>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue自定义指令(Custom Directive)可以用来扩展元素的行为或提供一些特殊的交互功能。如果你想在`el-table-column`使用自定义指令来设置`label`属性,首先你需要创建一个Vue自定义指令,然后将其应用到`el-table-column`的`label`属性上。 以下是一个简单的步骤说明: 1. **创建自定义指令**: 首先,定义一个名为`set-label`的自定义指令,例如: ```javascript Vue.directive('set-label', { bind: function (el, binding, vnode) { // 绑定指令时执行的逻辑 el.setAttribute('data-label', binding.value); // 将传递的值存储在DOM元素的data属性 }, update: function (el, binding) { // 当绑定值变化时更新DOM el.textContent = binding.value; // 更新label文本 } }); ``` 2. **在模板使用**: 在你的Vue组件,将这个指令应用到`el-table-column`的`label`属性上: ```html <template> <el-table-column v-for="column in tableColumns" :key="column.field" :set-label="column.label" <!-- 使用自定义指令 --> :prop="column.field" :label="getCustomLabel(column.field)" <!-- 获取实际显示的label,可能从数据源动态计算 --> ></el-table-column> </template> ``` 3. **处理数据和逻辑**: 在组件内部,你需要有一个方法如`getCustomLabel`来根据实际情况返回正确的标签文本,可能需要查询数据源或者处理动态内容: ```javascript methods: { getCustomLabel(field) { // 根据字段名从数据源获取正确的标签文本,或者做其他处理 let label = this.data[field] || field; return label; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值