解决窗口滚动条消失而导致的页面内容抖动的问题

当点击按钮弹出遮罩层和窗口后,通过JavaScript设置overflow:hidden防止页面滚动,同时计算滚动条宽度并添加到页面右侧padding,以避免滚动条消失后的抖动。在弹窗关闭时,恢复body的overflow和padding,确保平滑过渡。

前言

今天在项目中遇到了这样一个问题,点击按钮出现遮罩层和弹窗,不过弹窗出现后还是可以滚动底部的页面,于是写了一段js使弹窗出来后使底部页面增添overflow: hidden的样式解决了这个问题,但是还有一个细节问题就是页面的滚动条也占据宽度,滚动条消失后会有一个抖动的效果,给人体验很不好

正文

尝试了几个办法,以下是个人认为比较好的解决办法:

首先获取窗口文档显示区的宽度和DOM文档的根节点html元素对象的宽度,前者减去后者计算出滚动条的宽度

// 滚动条宽度
let scrollWidth = window.innerWidth - document.documentElement.offsetWidth;

弹窗打开时,滚动条消失先给body元素设置overflow:hidden防止底部页面滚动,然后再给底部页面右侧的padding 设置scrollWidth的值来模拟滚动条存在时底部页面内容的位置

document.body.style.overflow = 'hidden';
this.$refs.index.style.paddingRight = scrollWidth + 'px';

弹窗关闭时,body元素设置overflow:auto,因为弹窗关闭时弹窗又恢复了,重新获取 scrollWidth 的值设置padding为0,这样底部页面的内容就不会在抖动啦,以下为完整代码(不是一个组件的方法,主要逻辑就是上面的代码)

show() {
      this.isShow = !this.isShow;
      // 滚动条宽度
      let scrollWidth = window.innerWidth - document.documentElement.offsetWidth;
      document.body.style.overflow = 'hidden';
      this.$refs.index.style.paddingRight = scrollWidth + 'px';
}
close() {
      this.isShow = false;
      this.$parent.show();
      document.body.style.overflow = 'auto';
}

结语

以上就是问题的解决方法,实际上并没有多难的东西,这是我第一次写博客(感觉心里想的东西能写明白还挺费劲的)写了半天哈哈哈,希望能为你们解决一点问题,有更好的方法欢迎各位大佬指点。

处理 `el-dialog` 组件,调整或处理 modal-dialog 中的滚动条样式或行为是常见的需求,尤其是在面对窗口抖动、双滚动条、以及滚动条样式不一致等问题。以下是针对这些场景的解决方案: ### 禁用全局滚动条抖动 当 `el-dialog` 弹出,Element UI 默认会锁定背景页面的滚动,这可能导致页面抖动。通过设置 `:lock-scroll="false"` 属性,可以禁用此行为,从而避免页面滚动条消失而发生抖动: ```html <el-dialog :title="formTitle" :visible.sync="dialogFormVisible" :lock-scroll="false" :append-to-body="true" :close-on-click-modal="false" > </el-dialog> ``` 该配置可确保在弹窗打开页面滚动条不会被隐藏,从而避免抖动现象的发生[^1]。 ### 解决滚动条问题 当 `el-dialog` 内容过长,可能会出现两个滚动条页面滚动条与弹窗滚动条存在),影响用户体验。可以通过自定义 `el-dialog` 的样式来解决这一问题,确保弹窗内部滚动条优先级更高: ```css .el-dialog { display: flex !important; flex-direction: column !important; margin: 0 !important; position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; overflow-y: scroll !important; max-height: 99vh !important; } ``` 上述样式设置确保了弹窗内容在超出可视区域,仅弹窗内部出现滚动条,而页面整体不会出现额外的滚动条,从而避免双滚动条问题[^1]。 ### 自定义滚动条样式 若需要自定义 `el-dialog` 滚动条的外观,例如更改滚动条颜色、宽度等,可以通过 CSS 的 `::-webkit-scrollbar` 伪元素实现(适用于 Webkit 浏览器): ```css .el-dialog::-webkit-scrollbar { width: 8px; } .el-dialog::-webkit-scrollbar-track { background: #f1f1f1; } .el-dialog::-webkit-scrollbar-thumb { background: #888; border-radius: 4px; } .el-dialog::-webkit-scrollbar-thumb:hover { background: #555; } ``` 该样式将弹窗滚动条宽度设为 8px,并设置了滚动条轨道、滑块的颜色与圆角效果,从而提升视觉一致性[^1]。 ### 使用 `modal-class` 自定义样式 Element Plus 提供了 `modal-class` 属性,允许开发者为 `el-dialog` 的遮罩层和弹窗容器添加自定义类名,从而更灵活地控制样式: ```html <el-dialog v-model="centerDialogVisible" title="Notice" width="500" modal-class="testDialog" style="padding: 0px;" destroy-on-close > </el-dialog> ``` ```css .testDialog { padding: 0 !important; } .testDialog .el-dialog__header { background-color: blue !important; } ``` 通过 `modal-class`,可以为遮罩层和弹窗添加特定样式,例如去除默认内边距、设置背景色等,进一步提升弹窗的外观与交互体验[^3]。 ### 相关问题 1. 如何在 `el-dialog` 弹出保持页面滚动位置不变? 2. `el-dialog` 中的内容过长如何实现内部滚动? 3. 如何为 `el-dialog` 的滚动条设置自定义样式? 4. 使用 `modal-class` 能否完全控制 `el-dialog` 的样式? 5. 如何避免 `el-dialog` 弹出页面出现抖动? 这些问题将有助于进一步深入理解 `el-dialog` 的样式控制与交互优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值