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 匿名函数(anonymous function)与闭包(closure)
Oct 04 Javascript
js设置组合快捷键/tabindex功能的方法
Nov 21 Javascript
jQuery链使用指南
Jan 20 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
JS实现仿FLASH效果的竖排导航代码
Sep 15 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
Jul 20 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
Dec 12 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
JavaScript中发出HTTP请求最常用的方法
Jul 12 Javascript
详解ES6系列之私有变量的实现
Nov 21 Javascript
javascript事件监听与事件委托实例详解
Aug 16 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(1)
2006/10/09 PHP
提升PHP执行速度全攻略(上)
2006/10/09 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
python制作一个桌面便签软件
2015/08/09 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
python raise的基本使用
2020/09/10 Python
HTML5未来发展趋势
2016/02/01 HTML / CSS
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
销售总监工作职责
2013/11/21 职场文书
小班重阳节活动方案
2014/02/08 职场文书
学校万圣节活动方案
2014/02/13 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
邀请函怎么写
2015/01/30 职场文书
督导岗位职责范本
2015/04/10 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers