vue中的可拖拽宽度div的实现示例


Posted in Vue.js onApril 08, 2022

主要思路

  • 在需要拖拽宽度的区域设置一个div,高度设为 100%,宽度尽量窄一些(也不要太窄,3~6px左右)
  • 在此div上绑定当“鼠标按下”时,触发document绑定“鼠标移动”方法和"鼠标抬起"方法
  • 通过鼠标移动方法不断获取当前鼠标位置,设置需要变化大小div的宽高。
  • 鼠标抬起时取消鼠标移动方法和鼠标抬起方法的绑定。
<template>
  <div class="container" id="content_box">
    <div class="tab">左侧Tab</div>
    <div class="menu" ref="menu">
      左侧菜单
      <div class="menu-resize" ref="menuResize"></div>
    </div>
    <div class="content">
      中心区域
      <div class="opera" ref="opera">
        <div class="opera-resize" ref="operaResize"></div>
        操作区域
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "dropWidth",
  mounted() {
    this.$nextTick(() => {
      this.dropSize();
    })
  },
  methods: {
    dropSize() {
      let that = this,
          menuWidth = 200,
          operaHeight = 200;
      this.$refs.menuResize.onmousedown = function () {
        document.onmousemove = function (e) {
          let clientX = e.clientX;
          // 最大宽度
          if(clientX>=330){
            clientX = 330;
          }
          // 最小宽度
          if(clientX<=230){
            clientX = 230;
          }
          // TODO 这里减的是最左侧tab的宽度
          menuWidth = clientX - 30;
          that.$refs.menu.style.width = clientX - 30 +"px";
        }

        document.onmouseup = function () {
          console.log('当前宽度', menuWidth);
          document.onmousemove = null;
          document.onmouseup = null;
          that.releaseCapture && that.releaseCapture()
        }
      }

      this.$refs.operaResize.onmousedown = function () {
        document.onmousemove = function (e) {
          let clientY = e.clientY;
          console.log(clientY)
          // 最大宽度
          if(clientY<=100){
            clientY = 100;
          }
          // 最小宽度
          if(clientY>=300){
            clientY = 300;
          }
          operaHeight = clientY;
          // TODO 这里需要取反向
          that.$refs.opera.style.height = 400 - clientY +"px";
        }

        document.onmouseup = function () {
          console.log('当前宽度', operaHeight);
          document.onmousemove = null;
          document.onmouseup = null;
          that.releaseCapture && that.releaseCapture()
        }
      }
    }
  }
}
</script>

<style scoped>
.container {
  width: 1000px;
  height: 400px;
  border: 2px solid #dddddd;

  display: flex;
  justify-content: center;
}

.tab {
  width: 30px;
  height: 100%;
  background-color: #EC8C32;

  flex-shrink: 0;
  flex-grow: 0;
}

.menu {
  width: 200px;
  background-color: #AAB6E0;

  flex-shrink: 0;
  flex-grow: 0;
  position: relative;
}

.content {
  width: 100%;
  position: relative;
}

.opera {
  width: 100%;
  height: 200px;
  position: absolute;
  bottom: 0;
  background-color: #F2BE25;
}

.menu-resize {
  width: 5px;
  height: 100%;

  position: absolute;
  top: 0;
  right: 0;
  cursor: col-resize;
}

.opera-resize {
  width: 100%;
  height: 5px;
  position: absolute;
  top: 0;
  left: 0;
  cursor: row-resize;
}
</style>

实现效果

vue中的可拖拽宽度div的实现示例

到此这篇关于vue中的可拖拽宽度div的实现示例的文章就介绍到这了,更多相关vue 可拖拽宽度div内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
vue+flask实现视频合成功能(拖拽上传)
Mar 04 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
vue实现同时设置多个倒计时
May 20 Vue.js
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue使用watch监听属性变化
Apr 30 Vue.js
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
vue使用element-ui按需引入
May 20 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 #Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 #Vue.js
vue实现书本翻页动画效果实例详解
Apr 08 #Vue.js
vue实现列表拖拽排序的示例代码
vue实现可以快进后退的跑马灯组件
Apr 08 #Vue.js
Axios代理配置及封装响应拦截处理方式
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 #Vue.js
You might like
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python中import机制详解
2017/11/14 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
结婚喜宴主持词
2014/03/14 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
Oracle 多表查询基本语法实例
2022/04/18 Oracle