vue中的可拖拽宽度div的实现示例


Posted in Vue.js onApril 08, 2022

主要思路

  • 在需要拖拽宽度的区域设置一个div,高度设为 100%,宽度尽量窄一些(也不要太窄,3~6px左右)
  • 在此div上绑定当“鼠标按下”时,触发document绑定“鼠标移动”方法和"鼠标抬起"方法
  • 通过鼠标移动方法不断获取当前鼠标位置,设置需要变化大小div的宽高。
  • 鼠标抬起时取消鼠标移动方法和鼠标抬起方法的绑定。
<template>
  <div class="container" id="content_box">
    <div class="tab">左侧Tab</div>
    <div class="menu" ref="menu">
      左侧菜单
      <div class="menu-resize" ref="menuResize"></div>
    </div>
    <div class="content">
      中心区域
      <div class="opera" ref="opera">
        <div class="opera-resize" ref="operaResize"></div>
        操作区域
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "dropWidth",
  mounted() {
    this.$nextTick(() => {
      this.dropSize();
    })
  },
  methods: {
    dropSize() {
      let that = this,
          menuWidth = 200,
          operaHeight = 200;
      this.$refs.menuResize.onmousedown = function () {
        document.onmousemove = function (e) {
          let clientX = e.clientX;
          // 最大宽度
          if(clientX>=330){
            clientX = 330;
          }
          // 最小宽度
          if(clientX<=230){
            clientX = 230;
          }
          // TODO 这里减的是最左侧tab的宽度
          menuWidth = clientX - 30;
          that.$refs.menu.style.width = clientX - 30 +"px";
        }

        document.onmouseup = function () {
          console.log('当前宽度', menuWidth);
          document.onmousemove = null;
          document.onmouseup = null;
          that.releaseCapture && that.releaseCapture()
        }
      }

      this.$refs.operaResize.onmousedown = function () {
        document.onmousemove = function (e) {
          let clientY = e.clientY;
          console.log(clientY)
          // 最大宽度
          if(clientY<=100){
            clientY = 100;
          }
          // 最小宽度
          if(clientY>=300){
            clientY = 300;
          }
          operaHeight = clientY;
          // TODO 这里需要取反向
          that.$refs.opera.style.height = 400 - clientY +"px";
        }

        document.onmouseup = function () {
          console.log('当前宽度', operaHeight);
          document.onmousemove = null;
          document.onmouseup = null;
          that.releaseCapture && that.releaseCapture()
        }
      }
    }
  }
}
</script>

<style scoped>
.container {
  width: 1000px;
  height: 400px;
  border: 2px solid #dddddd;

  display: flex;
  justify-content: center;
}

.tab {
  width: 30px;
  height: 100%;
  background-color: #EC8C32;

  flex-shrink: 0;
  flex-grow: 0;
}

.menu {
  width: 200px;
  background-color: #AAB6E0;

  flex-shrink: 0;
  flex-grow: 0;
  position: relative;
}

.content {
  width: 100%;
  position: relative;
}

.opera {
  width: 100%;
  height: 200px;
  position: absolute;
  bottom: 0;
  background-color: #F2BE25;
}

.menu-resize {
  width: 5px;
  height: 100%;

  position: absolute;
  top: 0;
  right: 0;
  cursor: col-resize;
}

.opera-resize {
  width: 100%;
  height: 5px;
  position: absolute;
  top: 0;
  left: 0;
  cursor: row-resize;
}
</style>

实现效果

vue中的可拖拽宽度div的实现示例

到此这篇关于vue中的可拖拽宽度div的实现示例的文章就介绍到这了,更多相关vue 可拖拽宽度div内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
vue watch监控对象的简单方法示例
Jan 07 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
vue 自定义组件添加原生事件
Apr 21 Vue.js
vue实现简易音乐播放器
Aug 14 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 #Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 #Vue.js
vue实现书本翻页动画效果实例详解
Apr 08 #Vue.js
vue实现列表拖拽排序的示例代码
vue实现可以快进后退的跑马灯组件
Apr 08 #Vue.js
Axios代理配置及封装响应拦截处理方式
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 #Vue.js
You might like
用PHP读取IMAP邮件
2006/10/09 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php实现购物车功能(下)
2016/01/05 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
广告显示判断
2006/08/31 Javascript
document.compatMode介绍
2009/05/21 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
分析python切片原理和方法
2017/12/19 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
文明礼仪倡议书
2015/04/28 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python