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 相关文章推荐
sina的lightbox效果。
Jan 09 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
在JS中解析HTML字符串示例代码
Apr 16 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
Oct 27 Javascript
jQuery监听浏览器窗口大小的变化实例
Feb 07 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
vue基础之模板和过滤器用法实例分析
Mar 12 Javascript
vue 详情跳转至列表页实现列表页缓存
Mar 27 Javascript
Vue使用虚拟dom进行渲染view的方法
Dec 26 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面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
分享PHP header函数使用教程
2013/09/05 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php计算一个文件大小的方法
2015/03/30 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
javascript实现微信分享
2014/12/23 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
Python中用format函数格式化字符串的用法
2015/04/08 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
五种Python转义表示法
2020/11/27 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
中学生操行评语
2014/04/24 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
68句权威创业名言
2019/08/26 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
Golang 实现WebSockets
2022/04/24 Golang