当前位置:首页 > VUE

vue实现左右拉伸

2026-03-07 18:05:18VUE

实现左右拉伸布局

在Vue中实现左右拉伸布局可以通过CSS Flexbox或Grid结合Vue的响应式数据绑定完成。以下是两种常见方法:

使用Flexbox布局

通过CSS Flexbox实现左右面板可拉伸,中间添加拖拽条控制宽度:

<template>
  <div class="container">
    <div class="left-panel" :style="{ width: leftWidth + 'px' }">
      <!-- 左侧内容 -->
    </div>
    <div 
      class="drag-bar" 
      @mousedown="startDrag"
    ></div>
    <div class="right-panel">
      <!-- 右侧内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      leftWidth: 200,
      isDragging: false
    }
  },
  methods: {
    startDrag(e) {
      this.isDragging = true
      document.addEventListener('mousemove', this.onDrag)
      document.addEventListener('mouseup', this.stopDrag)
    },
    onDrag(e) {
      if (this.isDragging) {
        this.leftWidth = e.clientX
      }
    },
    stopDrag() {
      this.isDragging = false
      document.removeEventListener('mousemove', this.onDrag)
      document.removeEventListener('mouseup', this.stopDrag)
    }
  }
}
</script>

<style>
.container {
  display: flex;
  height: 100vh;
}
.left-panel {
  background: #f0f0f0;
  min-width: 100px;
}
.drag-bar {
  width: 8px;
  background: #ddd;
  cursor: col-resize;
}
.right-panel {
  flex: 1;
  background: #fff;
}
</style>

使用CSS Grid布局

CSS Grid提供更精确的列控制,适合复杂布局:

<template>
  <div 
    class="grid-container"
    :style="{
      'grid-template-columns': `${leftWidth}px 8px 1fr`
    }"
  >
    <div class="left">
      <!-- 左侧内容 -->
    </div>
    <div 
      class="divider"
      @mousedown="startDrag"
    ></div>
    <div class="right">
      <!-- 右侧内容 -->
    </div>
  </div>
</template>

<style>
.grid-container {
  display: grid;
  height: 100vh;
}
.divider {
  background: #ddd;
  cursor: col-resize;
}
</style>

注意事项

  • 拖拽过程中添加user-select: none防止文本选中
  • 移动端需要额外处理触摸事件
  • 可添加min-widthmax-width限制拉伸范围
  • 性能优化可考虑节流处理mousemove事件

扩展方案

对于需要保存布局状态的场景,可将宽度值存入localStorage或通过Vuex管理:

vue实现左右拉伸

// 在created钩子中恢复宽度
created() {
  const savedWidth = localStorage.getItem('leftPanelWidth')
  if (savedWidth) this.leftWidth = Number(savedWidth)
},
// 在拖拽结束时保存
stopDrag() {
  localStorage.setItem('leftPanelWidth', this.leftWidth)
}

标签: vue
分享给朋友:

相关文章

vue实现选择季度

vue实现选择季度

Vue 实现选择季度的几种方法 使用下拉选择框(Select) 在 Vue 中可以通过 v-model 绑定一个下拉选择框来实现季度选择。数据可以预先定义为一个包含季度选项的数组。 <temp…

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &l…

vue实现granfana

vue实现granfana

Vue 实现类似 Grafana 的仪表盘 要在 Vue 中实现类似 Grafana 的仪表盘功能,需要结合数据可视化库、状态管理和 UI 组件。以下是关键步骤和推荐工具: 数据可视化库 使用 E…

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue实现selectable

vue实现selectable

Vue 实现可选择的 Select 组件 在 Vue 中实现一个可选择的 Select 组件,可以通过以下几种方式: 使用原生 HTML select 元素 <template> &…