vue拖拽改变宽度

1.封装组件ResizeBox.vue

TypeScript 复制代码
<template>
  <div ref="resize" class="resize">
    <div ref="resizeHandle" class="handle-resize" />
    <slot />
  </div>
</template>
<script>
export default {
  name: 'ResizeBox',
  props: {
    resizeConf: {
      type: Object,
      default: () => ({
        width: 280, // 初始宽度
        widthRange: [100, 500] // 宽度范围
      })
    }
  },
  mounted() {
    this.dragControllerDiv(this.$refs.resize, this.$refs.resizeHandle)
  },
  methods: {
    dragControllerDiv: function(resizeBox, resizeHandle) {
      resizeBox.style.width = this.resizeConf.width + 'px'
      // 鼠标按下事件
      resizeHandle.onmousedown = e => {
        const resizeWidth = resizeBox.offsetWidth
        const startX = e.clientX // 水平坐标
        // 鼠标拖动事件
        document.onmousemove = ev => {
          const moveX = ev.clientX
          const moveLen = resizeWidth + (moveX - startX)
          if (this.resizeConf.widthRange[0] <= moveLen && this.resizeConf.widthRange[1] >= moveLen) {
            resizeBox.style.width = moveLen + 'px'
          }
        }
        // 鼠标松开事件
        document.onmouseup = function() {
          document.onmousemove = null
          document.onmouseup = null
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.resize {
  background: #fbfbfb;
  position: relative;
  word-wrap: break-word;

  .handle-resize {
    cursor: col-resize;
    position: absolute;
    right: -2px;
    width: 6px;
    height: 50px;
    border-left: 2px solid #c5c5c5;
    border-right: 2px solid #c5c5c5;
    top: calc(50% - 25px);
  }
}
</style>

2.组件中使用

TypeScript 复制代码
<template>
  <div class="container sa-flex">
    <ResizeBox :resize-conf="resizeConf">
      我是左边我是左边我是左边我是左边我是左边我是左边我是左边我是左边我是左边我是左边
    </ResizeBox>
    <div class="right sa-flex-1">
      我是右边我是右边我是右边我是右边我是右边我是右边我是右边我是右边我是右边我是右边
    </div>
  </div>
</template>
<script>
import ResizeBox from './ResizeBox.vue'
export default {
  components: {
    ResizeBox
  },
  data() {
    return {
      resizeConf: {
        width: 280, // 初始宽度
        widthRange: [100, 500] // 宽度范围
      }
    }
  }
}

</script>
<style lang="scss">
.sa-flex {
  display: flex;
  flex-wrap: no-wrap
}
.sa-flex-1 {
  flex:1
}
.container {
  min-height: 600px;
  background: #eee;
}
</style>
相关推荐
香蕉可乐荷包蛋7 分钟前
浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
前端·javascript·es6
未来之窗软件服务41 分钟前
资源管理器必要性———仙盟创梦IDE
前端·javascript·ide·仙盟创梦ide
liuyang___2 小时前
第一次经历项目上线
前端·typescript
西哥写代码2 小时前
基于cornerstone3D的dicom影像浏览器 第十八章 自定义序列自动播放条
前端·javascript·vue
清风细雨_林木木2 小时前
Vue 中生成源码映射文件,配置 map
前端·javascript·vue.js
FungLeo2 小时前
node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示
前端·非对称加密·rsa 加密·node 后端
不灭锦鲤3 小时前
xss-labs靶场第11-14关基础详解
前端·xss
不是吧这都有重名3 小时前
利用systemd启动部署在服务器上的web应用
运维·服务器·前端
霸王蟹3 小时前
React中巧妙使用异步组件Suspense优化页面性能。
前端·笔记·学习·react.js·前端框架
Maỿbe3 小时前
利用html制作简历网页和求职信息网页
前端·html