vue 限制在指定容器内可拖拽的div

简介: vue 限制在指定容器内可拖拽的div

<template>
  <div class="container" id="container">
    <div class="drag-box center" v-drag v-if="isShowDrag">
      <div>无法拖拽出容器的div浮窗</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isShowDrag: true,
    };
  },
  //自定义指令
  directives: {
    drag: {
      // 指令的定义
      bind: function (drag_dom) {
        drag_dom.onmousedown = (e) => {
          // 按下鼠标时,鼠标相对于被拖拽元素的坐标
          let disX = e.clientX - drag_dom.offsetLeft;
          let disY = e.clientY - drag_dom.offsetTop;

          // 获取容器dom
          let container_dom = document.getElementById("container");

          document.onmousemove = (e) => {
            // 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
            let left = e.clientX - disX;
            let top = e.clientY - disY;

            // 在容器范围内移动时,被拖拽元素的最大left值
            let leftMax =
              container_dom.offsetLeft +
              (container_dom.clientWidth - drag_dom.clientWidth);

            // 在容器范围内移动时,被拖拽元素的最小left值
            let leftMin = container_dom.offsetLeft + 1; //此处+1为容器的边框1px

            if (left > leftMax) {
              drag_dom.style.left = leftMax + "px";
            } else if (left < leftMin) {
              drag_dom.style.left = leftMin + "px";
            } else {
              drag_dom.style.left = left + "px";
            }

            // 在容器范围内移动时,被拖拽元素的最大left值
            let topMax =
              container_dom.offsetTop +
              (container_dom.clientHeight - drag_dom.clientHeight);

            // 在容器范围内移动时,被拖拽元素的最小left值
            let topMin = container_dom.offsetTop + 1; //此处+1为容器的边框1px

            if (top > topMax) {
              drag_dom.style.top = topMax + "px";
            } else if (top < topMin) {
              drag_dom.style.top = leftMin + "px";
            } else {
              drag_dom.style.top = top + "px";
            }
          };

          document.onmouseup = () => {
            document.onmousemove = null;
            document.onmouseup = null;
          };
        };
      },
    },
  },
};
</script>

<style lang="scss" scoped>
.drag-box {
  position: absolute;
  top: 100px;
  left: 100px;
  width: 300px;
  height: 100px;
  background: #fff;
  border-radius: 5px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  padding: 10px;
  // 改变鼠标样式为移动图标
  cursor: move;
  // 禁止文字被选中
  user-select: none;
}

.container {
  border: 1px solid red;
  width: 600px;
  height: 300px;
  margin: 30px;
}

.center {
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>
目录
相关文章
|
4月前
|
JavaScript 前端开发 容器
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
189 2
|
前端开发 JavaScript 容器
如何保持容器(div)固定宽高比
在前端界面中播放视频和图片的时候,为了保持其内容不变形,就需要保持容器的固定宽高比
113 1
|
6月前
|
JavaScript 容器
vue element plus Container 布局容器
vue element plus Container 布局容器
216 0
|
6月前
|
Web App开发 小程序 Android开发
Uniapp 视图容器 随机拖拽滑动 放大缩小 movable-view movable-area
Uniapp 视图容器 随机拖拽滑动 放大缩小 movable-view movable-area
197 0
|
运维 前端开发 容器
一文剖析HTML块和内联元素以及DIV容器,运维开发必备前端技能,基本功强化训练。
一文剖析HTML块和内联元素以及DIV容器,运维开发必备前端技能,基本功强化训练。
116 0
|
容器
echarts如何让图表占满整个div容器
echarts如何让图表占满整个div容器
1554 0
echarts如何让图表占满整个div容器
|
JavaScript 前端开发 开发者
在 Vue 中结合 render 函数渲染指定的组件到容器中| 学习笔记
快速学习在 Vue 中结合 render 函数渲染指定的组件到容器中
在 Vue 中结合 render 函数渲染指定的组件到容器中| 学习笔记
|
前端开发 JavaScript 算法
Vue封装一个瀑布流图片容器组件
🎈最近在捣鼓自己的个人博客网站,有一个模块需要用到瀑布流图片🖼展示,于是我就将其封装成了一个组件,以后可以导入就能使用,具体效果如下👇
281 0
Vue封装一个瀑布流图片容器组件
|
前端开发 JavaScript 应用服务中间件
Docker-Nginx 容器部署前端Vue项目
Docker nginx 容器运行命令,命令参数--name 容器名称 -d 容器后台运行 -p 映射端口,默认80 为前端项目首页,8088端口预留 -v 映射目录,把系统 /etc/nginx/nginx.conf 目录文件映射到容器中的/etc/nginx/nginx.conf 位置, /root 为前端代码上一级目录 --rm 容器停止后删除
483 0
Docker-Nginx 容器部署前端Vue项目
|
容器 前端开发
div中的内容超过容器宽度的问题
问题描述:     排名    参赛选手    月收益    月收益率 在一个div中横向放置了4个inline-block,宽度为百分比,加起来总共是100%。当其中一个inline-block的文字内容超过元素本身的宽度时,发现其他3个inline-block位置会发生改变,但是如果这个inline-block的内容如果为数字或者一整个连续的英文字符串,其他3个inline-block的位置不会发生改变,不过如果这个inline-block的内容为英文段落(单词之间有空格)并且内容超过元素本身的宽度时,其他3个inline-block的位置还是会发生改变。
1335 0