vue 左侧栏拖拽右侧宽度不变;出现滚动条

demo地址:点击下载

其中封装了自定义指令及公共组件的左侧菜单,菜单效果为双击,可搜索子节点

用户需求,左侧菜单为一次加载出来;可以搜索树控件下所有的子菜单内容

1.左侧菜单可以自由拉宽缩小;右侧内容不变,本人用到的方法是右侧div中嵌入router-view才能做到不缩放

1.左侧菜单默认为200的宽;拉条为15的宽当小于200的时候右侧动态设置宽度,不让右侧空出来

```views
views             
├─ AboutView.vue  
└─ HomeView.vue   

```
---

```components
components            
└─ TreeCode           
   ├─ index copy.vue  
   ├─ index.json      
   └─ index.vue       

```
---

```drag-move
drag-move      
├─ index.js    
└─ index.scss  

```
---

上代码

router文件


import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView,
    redirect: '/AboutView',
    children: [
      {
        path: 'AboutView',
        name: 'AboutView',
        component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
      }
    ]
  }
]

const router = new VueRouter({
  routes
})

export default router

HomeView.vue文件

<!--
 * @Author: your name
 * @Date: 2022-04-22 22:14:46
 * @LastEditTime: 2022-04-23 14:05:33
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \my-project\src\views\HomeView.vue
-->
<template>
  <div class='only-container'>
    <div class='only-left-sidebar'>
      左侧栏
      <tree-code style="width: 100%;height:380px" type="comCode" @node-click="nodeClick" />
    </div>
    <div class='only-resize' title='收缩侧边栏' v-drag-move='{setWidth:setWidth}'>⋮</d
<think>嗯,用户想在Vue项目中根据页面宽度动态添加横向滚动条。我需要先理解他们的需求。他们可能有一个容器,当内容宽度超过容器宽度时,显示横向滚动条,否则隐藏。需要动态监听页面宽度变化,自动调整滚动条的显示。 首先,用户提到的横向滚动条,应该是指当内容溢出时出现滚动条。这通常可以通过CSS的overflow-x属性来控制,比如设置为auto。但是用户想要动态监听页面宽度,可能是指窗口大小变化时,或者容器宽度变化时,判断是否需要显示滚动条。这时候可能需要用JavaScript来检测宽度变化。 然后,用户提到了Vue,所以需要结合Vue的特性来实现。在Vue中,可以通过ref来获取DOM元素的引用,然后监听resize事件。不过直接监听resize可能会有效率问题,可能需要用到防抖函数或者使用ResizeObserver API。 参考用户提供的引用,引用[1]和[2]提到了在Vue中如何监听滚动事件,使用ref和addEventListener。引用[3]提到了平滑滚动和监听滚动位置。虽然这些是关于滚动的,但思路类似,即通过ref获取元素,绑定事件。 所以,步骤可能是:1. 使用ref获取容器元素;2. 在mounted钩子中初始化监听;3. 使用ResizeObserver来监听容器或窗口的大小变化;4. 在回调函数中判断容器宽度和内容宽度,决定是否显示滚动条;5. 在beforeDestroy钩子中移除监听,避免内存泄漏。 需要注意的是,ResizeObserver比监听window的resize事件更精确,特别是当容器大小变化不是由窗口变化引起的时候。另外,CSS的响应式设计可能也可以部分实现,比如使用media query,但动态内容可能需要JS配合。 另外,用户可能希望当内容宽度超过容器时,自动添加overflow-x: auto,否则隐藏。这可以通过动态绑定样式来实现,例如:style="{ overflowX: shouldScroll ? 'auto' : 'hidden' }"。而shouldScroll的值由监听宽度变化的回调函数来更新。 总结:结合Vue的ref、生命周期钩子、ResizeObserver和动态样式绑定来实现。同时,考虑性能优化,比如防抖和及时移除事件监听。</think>### 实现Vue动态监听页面宽度添加横向滚动条的方法 #### 一、实现步骤 1. **模板结构定义** 使用`ref`绑定需要动态添加横向滚动条的容器,例如: ```html <div class="scroll-container" ref="scrollContainer"> <div class="content-wrapper">超宽内容区域</div> </div> ``` 2. **CSS样式控制** 基础样式需设置横向滚动条触发条件: ```css .scroll-container { width: 100%; overflow-x: hidden; /* 默认隐藏滚动条 */ white-space: nowrap; } ``` 3. **监听逻辑实现** ```javascript export default { mounted() { this.initScrollListener(); }, beforeDestroy() { this.cleanupListener(); }, methods: { initScrollListener() { this.$nextTick(() => { const container = this.$refs.scrollContainer; // 使用ResizeObserver监听容器尺寸变化 this.resizeObserver = new ResizeObserver(entries => { entries.forEach(entry => { const containerWidth = entry.contentRect.width; const contentWidth = entry.target.scrollWidth; this.$refs.scrollContainer.style.overflowX = contentWidth > containerWidth ? 'auto' : 'hidden'; }); }); this.resizeObserver.observe(container); }); }, cleanupListener() { if (this.resizeObserver) { this.resizeObserver.disconnect(); } } } } ``` #### 二、关键点说明 1. **ResizeObserver的优势** 比`window.resize`更精准监测具体元素尺寸变化,能捕获通过CSS动画、折叠面板展开等非窗口触发的尺寸变更[^1][^2]。 2. **性能优化建议** ```javascript // 添加防抖函数(示例) handleResize: _.debounce(function(entry) { // 判断逻辑 }, 100) ``` 3. **浏览器兼容方案** ```javascript // 旧版浏览器兼容 if (!window.ResizeObserver) { window.addEventListener('resize', this.handleResize); } ``` #### 三、扩展应用场景 1. **响应式表格组件** 在数据看板的表格展示中,根据屏幕尺寸自动控制横向滚动条显示。 2. **图片画廊组件** 相册横向列表在移动端折叠时自动隐藏滚动条,展开时恢复交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周家大小姐.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值