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 兼容鼠标滚轮事件
Apr 07 Javascript
jquery 圆形旋转图片滚动切换效果
Jan 19 Javascript
node.js Web应用框架Express入门指南
May 28 Javascript
javascript结合ajax读取txt文件内容
Dec 05 Javascript
jquery实现的淡入淡出下拉菜单效果
Aug 25 Javascript
ajax实现动态下拉框示例
Jan 10 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
Jul 13 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
详解解决小程序中webview页面多层history返回问题
Aug 20 Javascript
js实现时间日期校验
May 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下MYSQL limit的优化
2008/01/10 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
Laravel 5 学习笔记
2015/03/06 PHP
降低PHP Redis内存占用
2017/03/23 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python快速排序算法实例分析
2017/11/29 Python
python安装教程
2018/02/28 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
python实现扫雷游戏的示例
2020/10/20 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
年度考核自我鉴定
2014/03/19 职场文书
感恩主题班会教案
2015/08/12 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js