前端弹窗可拖拽功能实现

       前端弹窗可拖拽功能主要实现思路就是监听鼠标移动事件,根据鼠标位置实时修改弹窗距离父级窗口(或者屏幕,根据需求设置)的left和right,但是考虑到鼠标拖拽一般都是在div的标题栏处发生,鼠标按下的位置不可能是弹窗的左上角位置,为此需要计算鼠标按下的位置距离弹窗左上角的距离,这样才可以保存后续鼠标移动位置可以加上这个距离从而保证与弹窗左上角的位置保持一致性。

      还需要注意的地方在于style.left 返回的是字符串,如28px,offsetLeft返回的是数值28,如果需要对取得的值进行计算,用offsetLeft比较方便。但是offsetLeft是只读的,为此修改弹窗位置都是修改style.left和style.top,还有一个就是style.left的值需要事先定义在html里,否则style.left取不到值。

// titleID, boxID分别为div的header.id和div.id
export function dropWindow(titleID, boxID) {
  let title = document.getElementById(titleID);
  let boxContent = document.getElementById(boxID);
  if (!title || !boxContent) return;
  let x = 0;
  let y = 0;
  title.onmousedown = function (ev) {
    let oEvent = ev;
    //x、y分别代表,鼠标点击处与div左上角之间的横坐标和纵坐标之差
    x = oEvent.clientX - boxContent.offsetLeft;
    y = oEvent.clientY - boxContent.offsetTop;
    document.onmousemove = function (ev) {
      let oEvent = ev;
      //   加上这句代码可以保证拖拽过程中文本不被选中
      oEvent.preventDefault();
      //m、n分别代表div左上角的横、纵坐标
      let left = oEvent.clientX - x;
      let top = oEvent.clientY - y;
      //   控制div超出屏幕外的位置
      //  如果div左上角超出屏幕左上角则div左上角固定在0,0屏幕坐标上
      top = top < 0 ? 0 : top;
      left = left < 0 ? 0 : left;
      //  如果div右下角超出屏幕右下角则div右下角固定在(div.width,div.height)屏幕坐标上
      left =
        left + boxContent.offsetWidth > window.innerWidth
          ? window.innerWidth - boxContent.offsetWidth
          : left;
      top =
        top + boxContent.offsetHeight > window.innerHeight
          ? window.innerHeight - boxContent.offsetHeight
          : top;
      //设置div左上角的坐标
      boxContent.style.left = left + "px";
      boxContent.style.top = top + "px";
    };
    document.onmouseup = function (ev) {
      //释放move事件,如果不释放,放开鼠标后,div仍然会跟随鼠标移动
      document.onmousemove = null;
      document.onmouseup = null;
    };
  };
}

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现这个功能,你可以使用第三方库来帮助你完成。以下是一个示例,使用了Vue.js和Draggable.js: 1. 首先,使用npm安装Draggable.js:`npm install draggable --save` 2. 在你的Vue组件中引入Draggable.js:`import Draggable from 'draggable'` 3. 在Vue组件的mounted()生命周期钩子函数中初始化Draggable.js: ```javascript mounted() { const that = this; Draggable.create(this.$refs.popup, { type: 'x,y', bounds: 'body', edgeResistance: 0.65, onClick: function() { that.$emit('popup-click'); } }); } ``` 在这个示例中,我们创建了一个可动的元素,它的范围限制为整个页面,水平和垂直方向都可以移动。`edgeResistance`属性用于控制放边缘的阻力,`onClick`回调函数用于在点击时触发Vue组件的自定义事件。 4. 为了实现的放大和缩小功能,你可以使用Vue的动态样式绑定。例如,你可以添加一个按钮来触发放大和缩小: ```html <template> <div ref="popup" class="popup" :style="{ width: width + 'px', height: height + 'px' }"> <div class="popup-header"> <span class="popup-title">{{ title }}</span> <button class="popup-btn" @click="toggleSize">{{ icon }}</button> </div> <div class="popup-body"> <slot></slot> </div> </div> </template> <script> export default { data() { return { title: '', icon: '放大', width: 400, height: 300 } }, methods: { toggleSize() { if (this.width === 400) { this.width = 800; this.height = 600; this.icon = '缩小'; } else { this.width = 400; this.height = 300; this.icon = '放大'; } } } } </script> ``` 在这个示例中,我们添加了一个按钮,通过点击按钮来切换的大小。我们使用`data`属性来控制的宽度和高度,当点击按钮时,我们更新这些属性,从而实现的放大和缩小。 综上所述,你可以使用上述步骤来实现Vue中的可以放大缩小放的功能

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要随地大便

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值