Vuejs通过拖动改变元素宽度实现自适应


Posted in Javascript onSeptember 02, 2020

需求:

Vuejs通过拖动改变元素宽度实现自适应

原理:

拖动效果的实现基本都是dom操作来实现的,通过拖动分隔线,计算分隔线与浏览器边框的距离(left),来实现拖动之后的不同宽度的计算;当拖动分隔线1时,计算元素框left和mid;当拖动分隔线2时,计算元素框mid和right;同时设置元素框最小值以防止元素框拖没了(其实是被遮住了)。使用SetCapture() 和 ReleaseCapture()的函数功能指定窗口里设置鼠标捕获。

html部分代码:

<template>
<div>
 <ul class="box" ref="box">
  <li class="left" ref="left">西瓜</li>
  <li class="resize" ref="resize"></li>
  <li class="mid" ref="mid">备注2</li>
  <li class="resize2" ref="resize2"></li>
   <li class="right" ref="right">test</li>
 </ul>
 <ul class="box" ref="box">
  <li class="left" ref="left">芒果</li>
  <li class="resize" ref="resize"></li>
  <li class="mid" ref="mid">备注</li>
  <li class="resize2" ref="resize2"></li>
  <li class="right" ref="right">test</li>
 </ul>
</div>
</template>

js部分代码:

<script>
export default {
 mounted () {
  this.dragControllerDiv();
 },
 methods: {
  dragControllerDiv: function () {
   var resize = document.getElementsByClassName('resize');
   var resize2 = document.getElementsByClassName('resize2');
   var left = document.getElementsByClassName('left');
   var right = document.getElementsByClassName('right');
   var mid = document.getElementsByClassName('mid');
   var box = document.getElementsByClassName('box');
   for (let i = 0; i < resize.length; i++) {
    resize[i].onmousedown = function (e) {
     var startX = e.clientX;
     resize[i].left = resize[i].offsetLeft;
     document.onmousemove = function (e) {
      var endX = e.clientX;
      var rightW = right[i].offsetWidth;
      var moveLen = resize[i].left + (endX - startX);
      var maxT = box[i].clientWidth - resize[i].offsetWidth;
      if (moveLen < 150) moveLen = 150; 
      if (moveLen > maxT - rightW - 150) moveLen = maxT - rightW - 150;

      resize[i].style.left = moveLen;

      for (let j = 0; j < left.length; j++) {
       left[j].style.width = moveLen + 'px';
       mid[j].style.width = (box[i].clientWidth - moveLen - rightW - 10) + 'px';
      }
     }
     document.onmouseup = function (evt) {
      document.onmousemove = null;
      document.onmouseup = null; 
      resize[i].releaseCapture && resize[i].releaseCapture();
     }
     resize[i].setCapture && resize[i].setCapture();
     return false;
    }
   }
   for (let i = 0; i < resize2.length; i++) {
    resize2[i].onmousedown = function (e) {
     var startX = e.clientX;
     resize2[i].left = resize2[i].offsetLeft;
     document.onmousemove = function (e) {
      var endX = e.clientX;
      var leftW = left[i].offsetWidth;
      var moveLen = resize2[i].left + (endX - startX) - leftW;
      var maxT = box[i].clientWidth - resize2[i].offsetWidth - 5;
      if (moveLen < 150) moveLen = 150; 
      if (moveLen > maxT - leftW - 150) moveLen = maxT - leftW - 150;

      resize2[i].style.left = moveLen;
      for (let j = 0; j < right.length; j++) {
       mid[j].style.width = moveLen + 'px';
       right[j].style.width = (box[i].clientWidth - moveLen - leftW - 10) + 'px';
      }
     }
     document.onmouseup = function (evt) {
      document.onmousemove = null;
      document.onmouseup = null; 
      resize2[i].releaseCapture && resize2[i].releaseCapture();
     }
     resize2[i].setCapture && resize2[i].setCapture();
     return false;
    }
   }
  }
 }
}
</script>

style部分:

<style scoped>
ul,li{
 list-style: none;
 display: block;
 margin:0;
 padding:0;
}
.box{
 width:800px;
 height:32px;
 overflow:hidden;
}
.left{
 width:calc(30% - 10px);
 height:100%; 
 background:skyblue;
 float:left;
}

.resize{
 width:5px;
 height:100%;
 cursor: w-resize;
 float:left;
}

.resize2{
 width:5px;
 height:100%;
 cursor: w-resize;
 float:left;
}

.right{
 float:left;
 width:35%;
 height:100%; 
 background:tomato;
}
.mid{
 float:left;
 width:35%;
 height:100%; 
 background:#f00;
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Google Map Api和GOOGLE Search Api整合实现代码
Jul 18 Javascript
JavaScript 编写匿名函数的几种方法
Feb 21 Javascript
JavaScript中的闭包原理分析
Mar 08 Javascript
jQuery侧边栏随窗口滚动实现方法
Mar 04 Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 Javascript
微信小程序 跳转方式总结
Apr 20 Javascript
JS switch判断 三目运算 while 及 属性操作代码
Sep 03 Javascript
JS实现的判断方法、变量是否存在功能示例
Mar 28 Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
使用vue中的混入mixin优化表单验证插件问题
Jul 02 Javascript
mpvue微信小程序开发之实现一个弹幕评论
Nov 24 Javascript
精读《Vue3.0 Function API》
May 20 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
Sep 02 #Javascript
Vue 组件的挂载与父子组件的传值实例
Sep 02 #Javascript
vue中的.$mount('#app')手动挂载操作
Sep 02 #Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 #Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
Sep 02 #Javascript
vue或react项目生产环境去掉console.log的操作
Sep 02 #Javascript
JS继承实现方法及优缺点详解
Sep 02 #Javascript
You might like
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
几种tab切换详解
2017/02/03 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
Python列表(list)常用操作方法小结
2015/02/02 Python
Python排序算法实例代码
2017/08/10 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
怎样声明一个匿名的内部类
2016/06/01 面试题
绩效工资分配方案
2014/01/18 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
实习单位意见
2015/06/04 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android
Oracle锁表解决方法的详细记录
2022/06/05 Oracle