vue 横向菜单滚动定位_解决Vue页面固定滚动位置的处理办法

本文讲述了在Vue项目中,如何处理列表页到详情页再返回时保持滚动位置的问题。作者发现Vue的`scrollBehavior`仅适用于history模式,而在hash模式下,浏览器的滚动位置恢复机制会导致定位失败。通过监听滚动事件,存储和读取滚动位置,并在`hashchange`时屏蔽浏览器的默认行为,实现了自定义滚动定位。最终的解决方案包括在`hashchange`时重置滚动位置,以及在`onscroll`事件中判断并设置正确的滚动位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做项目遇到一个问题,就是Vue滚动不固定,网上找了一些资料,说下 vue 固定滚动位置的处理办法.

问题描述:

通常见于 列表页List -> 详情页Detail 的情况, 从列表的某一项x 进入到详情页, 再返回的时候, 希望列表的位置固定在x, 而不是回到顶部了.

vue-router 里面是有一个 scrollBehavior 的, 但是这个玩意只能在 history 模式下面使用, 而我用的 hash 模式.

所以我们要自己实现嘛, 思路简单:List 里面监听滚动, 记录滚动位置 pos, 从 Detail 返回到 List 里面的时候, 读取 pos.

mounted () {

// 读

setTimeut(function(){

document.body.scrollTop = parseInt(sessionStorage.getItem('pos'));

}, 1000);

// 存

window.onscroll = function () {

sessionStorage.setItem('pos', document.body.scrollTop);

}

}

遇见了一个问题:

每次返回 List, 都是直接滚动到顶部, 每次都是, 每次都是! 把 pos 打印出来, 发现是 0, 而不是我们所存的值. 日了, 明明切换之前还是的, 回来就不是了.

然后发现了路由每次切换都会触发 onscroll 事件, 日了狗, 为毛.我都没有滚动页面, 为什么会触发 onscroll 事件。

刚开始怀疑 hash 变化会导致 onscroll 事件的触发, 所以我就在浏览器里面手动输入了几个不存在的路由:

### Vue 页面缺少右侧滚动条的原因及解决方法 #### 一、可能的原因分析 1. **CSS 属性冲突** 如果页面中的 CSS 设置了 `overflow: hidden` 或者其他类似的属性,可能会导致右侧滚动条消失。例如,在全局样式或者局部组件中可能存在如下代码: ```css body { overflow-y: hidden; } ``` 这种情况会阻止垂直方向上的滚动条显示[^1]。 2. **内容高度不足** 当页面的内容不足以填满整个视口的高度时,浏览器不会自动渲染滚动条。即使设置了 `html, body { height: 100%; }`,如果没有足够的子元素撑开容器,则仍然不会有滚动条[^2]。 3. **框架特定行为** 使用 Ant Design Vue 或 Element Plus 等 UI 框架构建复杂布局时,某些组件(如表格或卡片)内部默认禁用了溢出区域的滚动功能。比如手动拼接表格时未正确配置滚动逻辑可能导致该现象[^3]。 4. **吸顶定位干扰** 若页面顶部存在吸顶效果(通过 Sticky 定位实现),则需要额外注意其是否覆盖了部分可滚动区域。特别是当吸顶组件本身占据了一定空间却未调整剩余可用面积时,容易引发视觉错觉——看似无滚动条但实际上只是被遮挡住了[^4]。 5. **动态加载数据延迟** 对于依赖异步请求获取并展示大量列表项的应用场景而言,初始状态下 DOM 结构尚未完全生成完毕之前也可能暂时看不到预期中的竖向滑动指示器[^5]。 --- #### 二、解决方案建议 ##### 方法一:检查全局样式文件是否存在误设 确认项目根目录下的 main.css/main.scss 中是否有不当声明影响整体表现形式;必要情况下可以尝试临时添加调试规则观察实际效果变化: ```css /* 调试用 */ * { outline: 1px solid red !important; /* 显示边界轮廓便于判断结构关系 */ } body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow-x: auto; /* 强制开启横向滚轮以便对比验证 */ } ``` 上述操作有助于快速锁定潜在问题源头所在位置。 ##### 方法二:增加占位符扩充文档流长度 针对静态资源较少的情况可通过插入虚拟空白节点来强制触发滚动事件的发生概率: ```javascript // 动态创建一个足够高的div作为辅助工具 const placeholderDiv = document.createElement('div'); placeholderDiv.style.height = '200vh'; // 高度超过当前屏幕范围即可满足需求 document.body.appendChild(placeholderDiv); ``` 这样做的目的是为了确保无论何时都能看到至少一条有效的滚动轨道。 ##### 方法三:优化自定义表格组件设计思路 对于采用 A-Row/A-Col 手工搭建模拟表格的行为模式下,务必仔细校验每一列宽度总和与父级容器尺寸之间的匹配程度。同时考虑引入第三方插件完成更专业的呈现方式而非单纯依靠基础栅格系统自行组合而成: ```xml <a-table :columns="tableColumns" :data-source="dataSource" bordered> </a-table> ``` 此处利用官方推荐的标准控件能够有效规避诸多低效编码带来的副作用风险。 ##### 方法四:重新审视 Tab 切换机制交互细节 如果目标界面包含多组分页卡切换情景的话,那么很可能是因为每次激活新标签之后未能及时同步更新关联状态所引起的现象偏差。因此可以在模板定义处显式绑定监听函数处理此类特殊情况: ```vue <template> <van-tabs v-model="activeTab" @change="handleTabChange"> <!-- 子选项省略 --> </van-tabs> </template> <script> export default { data() { return { activeTab: 0, }; }, methods:{ handleTabChange(index){ window.scrollTo({ top: 0 }); // 每次跳转前先重置当前位置坐标原点 } } }; </script> ``` 以上措施旨在保障用户体验流畅性不受任何不必要的技术障碍阻碍. ##### 方法五:结合路由守卫控制侧边栏高亮逻辑 最后关于如何让左侧菜单随着主要内容上下移动而相应改变选中标志这一需求方面,可以通过 Vue Router 提供的能力加以实现: ```javascript router.beforeEach((to, from, next) => { const matchedRouteName = to.name || ''; store.commit('SET_ACTIVE_SIDEBAR_ITEM', matchedRouteName); // 更新Vuex Store内的对应字段值 next(); }); ``` 与此同时还需要配合 CSS Media Query 实现响应式的断点适配策略从而进一步提升跨设备兼容能力. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值