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 相关文章推荐
扩展String功能方法
Sep 22 Javascript
JavaScript中的私有/静态属性介绍
Jul 26 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
Dec 20 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 Javascript
JavaScript类的继承操作实例总结
Dec 20 Javascript
JavaScript实现的联动菜单特效示例
Jul 08 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
ES6函数和数组用法实例分析
May 23 Javascript
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
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
Get或Post提交值的非法数据处理
2006/10/09 PHP
php流量统计功能的实现代码
2012/09/29 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
python人人网登录应用实例
2014/09/26 Python
Python书单 不将就
2017/07/11 Python
Python实现调度算法代码详解
2017/12/01 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
python根据时间获取周数代码实例
2019/09/30 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
Python3离线安装Requests模块问题
2019/10/13 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
Java提供了哪些企业应用编程接口
2015/02/13 面试题
开学典礼主持词
2014/03/19 职场文书
数学复习课教学反思
2016/02/18 职场文书
初中思品教学反思
2016/02/20 职场文书