vue2自定义指令实现可拖动弹框

思路

主要使用directives自定义拖动指令,指令内部主要有关于拖动的3个事件,鼠标按下,鼠标移动,鼠标抬起。事件内部的回调函数有鼠标点击的坐标,根据三个事件的坐标计算弹框的最终位置坐标,然后将坐标转化为css样式赋值给弹框。

效果

代码
<template>
  <div class="draggable-modal" v-draggable>
    <div class="modal-content">
      {{ formattedDate }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      date: new Date(),
    };
  },
  computed: {
    formattedDate() {
      return this.moment(this.date).format("YYYY-MM-DD HH:mm:ss");
    },
  },
  directives: {
    // 自定义指令
    draggable: {
      bind(el) {
        const modal = el;
        let drag = false;
        let startX, startY, initialX, initialY;
        let finalX, finalY;
        modal.addEventListener("mousedown", function (event) {
          drag = true;
          startX = event.clientX;
          startY = event.clientY;
          initialX = parseFloat(modal.style.left || "0");
          initialY = parseFloat(modal.style.top || "0");
        });
        window.addEventListener("mousemove", function (event) {
          if (drag) {
            finalX = initialX + (event.clientX - startX);
            finalY = initialY + (event.clientY - startY);
            modal.style.left = finalX + "px";
            modal.style.top = finalY + "px";
          }
        });
        window.addEventListener("mouseup", function () {
          drag = false;
        });
      },
    },
  },
};
</script>
<style>
.draggable-modal {
  position: relative;
  width: 300px;
  height: 200px;
  background-color: rgba(0, 0, 0, 0.5);
  border: 1px solid #ccc;
  cursor: move;
}
.modal-content {
  padding: 20px;
  background-color: #fff;
}
</style>
// 全局指令
Vue.directive("draggable", {
  bind(el) {
    const modal = el;
    let drag = false;
    let startX, startY, initialX, initialY;
    let finalX, finalY;
    modal.addEventListener("mousedown", function (event) {
      drag = true;
      startX = event.clientX;
      startY = event.clientY;
      initialX = parseFloat(modal.style.left || "0");
      initialY = parseFloat(modal.style.top || "0");
    });
    window.addEventListener("mousemove", function (event) {
      if (drag) {
        finalX = initialX + (event.clientX - startX);
        finalY = initialY + (event.clientY - startY);
        modal.style.left = finalX + "px";
        modal.style.top = finalY + "px";
      }
    });
    window.addEventListener("mouseup", function () {
      drag = false;
    });
  },
});

 

 
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现图片懒加载的自定义指令,你可以按照以下步骤进行: 1. 创建一个自定义指令文件,比如 `lazyload.js`。 2. 在 `lazyload.js` 文件中,定义一个全局自定义指令 `v-lazyload`,并添加相应的逻辑。 ```javascript // lazyload.js // 判断元素是否在可视区域内 function isInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } // 加载图片 function loadImage(el) { if (el.getAttribute('data-src')) { el.src = el.getAttribute('data-src'); el.removeAttribute('data-src'); } } // Vue 自定义指令 Vue.directive('lazyload', { inserted: function(el) { // 初始状态先将图片设置为占位图 el.src = 'placeholder.jpg'; // 判断图片是否在可视区域内,如果在则加载图片 if (isInViewport(el)) { loadImage(el); } }, bind: function(el) { if (isInViewport(el)) { loadImage(el); } }, scroll: function(el) { if (isInViewport(el)) { loadImage(el); } } }); ``` 3. 在主文件中引入自定义指令文件。 ```javascript // main.js import Vue from 'vue'; import './lazyload.js'; // 引入自定义指令文件 new Vue({ // ... }).$mount('#app'); ``` 4. 在需要懒加载的图片上使用自定义指令 `v-lazyload`。 ```html <template> <div> <img v-lazyload data-src="image.jpg" alt="Lazy loaded image"> </div> </template> ``` 这样,当图片进入可视区域时,即可加载对应的图片。记得替换 `placeholder.jpg` 和 `image.jpg` 为你自己的图片路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值