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 相关文章推荐
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
javascript实现禁止右键和F12查看源代码
Dec 26 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
Oct 28 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
基于JS设计12306登录页面
Dec 28 Javascript
JavaScript实现简单图片轮播效果
Aug 21 Javascript
详解vue mint-ui源码解析之loadmore组件
Oct 11 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
Oct 29 Javascript
纯js实现无缝滚动功能代码实例
Feb 21 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 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
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
文字幻灯片
2006/06/26 Javascript
JavaScript Archive Network 集合
2007/05/12 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
Python常用内置函数总结
2015/02/08 Python
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
数组越界问题
2015/10/21 面试题
请说出以下代码输出什么
2013/08/30 面试题
公司户外活动总结
2014/07/04 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书