elementUI可拖拉宽度抽屉

1,需求:

在elementUI的抽屉基础上,添加可拖动侧边栏宽度的功能,实现效果如下:

2,在原组件上添加自定义命令

html 复制代码
    <el-drawer v-drawerDrag="'left'" :visible.sync="drawerVisible" direction="ltr">
      <div id="showId" style="padding: 1rem;font-size: 12px;overflow-x: hidden;" v-html="form.introduce"></div>
    </el-drawer>

v-drawerDrag 属性是我们在原组件新加的命令,传入left或者right,需要与 direction 的let和rtl对应,

3,drawer-drag.js

xml 复制代码
export default {
  bind(el, binding, vnode, oldVnode) {
  	// 默认抽屉宽度,当宽度小于此值不在压缩
    const minWidth = 400
    const dragDom = el.querySelector('.el-drawer')
    dragDom.style.overflow = 'auto'
    const resizeElL = document.createElement('div')
    const img = new Image(24, 38)
    img.src = require('@/assets/images/stretch.png')
    dragDom.appendChild(img)
    dragDom.appendChild(resizeElL)
    resizeElL.style.cursor = 'w-resize'
    resizeElL.style.position = 'absolute'
    resizeElL.style.height = '100%'
    resizeElL.style.width = '10px'
    resizeElL.style.top = '0px'
    img.style.position = 'absolute'
    img.style.top = '50%'
    // console.log('binding', binding.value)
    // 区分右侧侧边栏和左侧侧边栏
    if (binding.value === 'right') {
      resizeElL.style.left = '0px'
      img.style.left = '-12px'
      resizeElL.onmousedown = (e) => {
        const elW = dragDom.clientWidth
        const EloffsetLeft = dragDom.offsetLeft
        const clientX = e.clientX
        document.onmousemove = function(e) {
          e.preventDefault()
          if (clientX > EloffsetLeft && clientX < EloffsetLeft + 10) {
            // 往右拖拽
            if (e.clientX > clientX) {
              // console.log('向右-----------------------------')
              if (dragDom.clientWidth >= minWidth) {
                dragDom.style.width = elW - (e.clientX - clientX) + 'px'
              }
            }
            if (e.clientX < clientX) {
              // console.log('向左-----------------------------')
              dragDom.style.width = elW + (clientX - e.clientX) + 'px'
            }
          }
        }
        // 拉伸结束
        document.onmouseup = function(e) {
          document.onmousemove = null
          document.onmouseup = null
        }
      }
    } else {
      resizeElL.style.right = '0px'
      img.style.right = '-12px'
      resizeElL.onmousedown = (e) => {
        const elW = dragDom.clientWidth
        const EloffsetLeft = dragDom.offsetLeft + dragDom.offsetWidth
        const clientX = e.clientX
        document.onmousemove = function(e) {
          e.preventDefault()
          if (clientX < EloffsetLeft && clientX > EloffsetLeft - 10) {
            if (e.clientX > clientX) {
              // console.log('向右-----------------------------')
              dragDom.style.width = elW + (e.clientX - clientX) + 'px'
            }
            if (e.clientX < clientX) {
              // console.log('向左-----------------------------')
              if (dragDom.clientWidth >= minWidth) {
                dragDom.style.width = elW - (clientX - e.clientX) + 'px'
              }
            }
          }
        }
        // 拉伸结束
        document.onmouseup = function(e) {
          document.onmousemove = null
          document.onmouseup = null
        }
      }
    }
  }
}

图标自取 stretch.png

相关推荐
爱看书的小沐20 小时前
【小沐学WebGIS】基于Three.JS绘制飞行轨迹Flight Tracker(Three.JS/ vue / react / WebGL)
javascript·vue·webgl·three.js·航班·航迹·飞行轨迹
知识分享小能手2 天前
微信小程序入门学习教程,从入门到精通,WXS语法详解(10)
前端·javascript·学习·微信小程序·小程序·vue·团队开发
知识分享小能手3 天前
微信小程序入门学习教程,从入门到精通,WXSS样式处理语法基础(9)
前端·javascript·vscode·学习·微信小程序·小程序·vue
sniper_fandc3 天前
Vue3双向数据绑定v-model
前端·vue
知识分享小能手4 天前
微信小程序入门学习教程,从入门到精通,WXML(WeiXin Markup Language)语法基础(8)
前端·学习·react.js·微信小程序·小程序·vue·个人开发
叫兽~~4 天前
vite vue 打包后运行,路由首页加载不出来
vue.js·vue
岁岁岁平安5 天前
SpringBoot3+WebSocket+Vue3+TypeScript实现简易在线聊天室(附完整源码参考)
java·spring boot·websocket·网络协议·typescript·vue
硅谷工具人6 天前
vue3边学边做系列(3)-路由缓存接口封装
前端·缓存·前端框架·vue
whltaoin6 天前
Vue 与 React 深度对比:技术差异、选型建议与未来趋势
前端·前端框架·vue·react·技术选型
知识分享小能手7 天前
微信小程序入门学习教程,从入门到精通,微信小程序常用API(下)——知识点详解 + 案例实战(5)
前端·javascript·学习·微信小程序·小程序·vue·前端开发