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 相关文章推荐
js 金额文本框实现代码
Feb 14 Javascript
JavaScript对象创建及继承原理实例解剖
Feb 28 Javascript
javascript 获取iframe里页面中元素值的方法
Feb 17 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
Jan 27 Javascript
javaScript数组迭代方法详解
Apr 14 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
AngularJS extend用法详解及实例代码
Nov 15 Javascript
Angular2平滑升级到Angular4的步骤详解
Mar 29 Javascript
angularJs的ng-class切换class
Jun 23 Javascript
深入浅析vue组件间事件传递
Dec 29 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
gojs实现蚂蚁线动画效果
Feb 18 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
测试你的JS的掌握程度的代码
2009/12/09 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
JS FormData对象使用方法实例详解
2020/02/12 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python僵尸进程产生的原因
2017/07/21 Python
详解flask入门模板引擎
2018/07/18 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Python操作Excel的学习笔记
2021/02/18 Python
Django实现简单的分页功能
2021/02/22 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
教师绩效工资方案
2014/02/01 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
个人总结格式范文
2015/03/09 职场文书
第二次离婚起诉书
2015/05/18 职场文书
垂直极限观后感
2015/06/08 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
Elasticsearch 聚合查询和排序
2022/04/19 Python
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server