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 charAt的使用示例
Feb 18 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
Dec 25 Javascript
jquery.validate提示错误信息位置方法
Jan 22 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
Vue.js组件tab实现选项卡切换
Mar 23 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
原生js实现公告滚动效果
Jan 10 Javascript
webpack打包优化的几个方法总结
Feb 10 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
Sep 04 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自动更新新闻DIY
2006/10/09 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
JavaScript 指导方针
2007/04/05 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
js单例模式详解实例
2013/11/21 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python运行时间的几种方法
2016/06/17 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
Django实现分页功能
2018/07/02 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
python 进程的几种创建方式详解
2019/08/29 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
django form和field具体方法和属性说明
2020/07/09 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
简单html5代码获取地理位置
2014/03/31 HTML / CSS
工厂会计员职责
2014/02/06 职场文书
中学教师自我鉴定
2014/02/07 职场文书
党员公开承诺书范文
2014/03/25 职场文书
批评与自我批评范文
2014/10/15 职场文书
2014年质检员工作总结
2014/11/18 职场文书
格林童话读书笔记
2015/06/30 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技