跟Element UI官网学习,解决弹窗出现浏览器抖动问题

书接上回,回顾浏览器抖动问题

对于出现一个dialog或者popup弹窗时, 我们能明显看到浏览器出现了抖动问题,详情的原因和分析过程 可以点击下面这篇文章,进行了解。

老生常谈之弹窗出现,浏览器出现抖动问题 - 掘金 (juejin.cn)

element UI是如何解决抖动呢?

通过对element UI官网的分析,我们发现,其实他是通过以下方式来做到完全无抖动。

  • 将内容外层容器的高度固定,overflow:hiddern隐藏掉滚动条,整个页面不出现滚动条
  • 让内容区域一直处于scroll状态,再通过设置负margin隐藏掉浏览器的自带滚动条
  • 再通过自定义浏览器滚动条来模拟内容区域的滚动行为。
  • 这样弹窗出现的时候,内容区域的滚动条一直都存在,那么就不存在由于浏览器滚动条的出现消失,导致内容区域宽度变化,从而就避免出现抖动问题

自定义浏览器滚动条如何模拟滚动行为

要模拟浏览器滚动条的行为,需要进行以下操作:

  • 计算自定义浏览器滚动条的高度
js 复制代码
// 来自element UI 源码
let heightPercentage, widthPercentage;
const wrap = this.wrap; // 代表内容滚动区域,即el-scrollbar__wrap元素
if (!wrap) return;

// 仅以右侧竖条滚动条为例:可视内容高度/内容本身高度
heightPercentage = (wrap.clientHeight * 100 / wrap.scrollHeight);
// 等同于, 可视内容高度小于滚动高度,说明存在滚动条,反正不存在。
// 根据可视内容高度占整个滚动内容的高度,从而计算出滚动条的高度
heightPercentage = wrap.clientHeight / wrap.scrollHeight;
this.sizeHeight = heightPercentage < 1 ? (heightPercentage * 100 + '%') : '';

widthPercentage = (wrap.clientWidth * 100 / wrap.scrollWidth);

this.sizeHeight = (heightPercentage < 100) ? (heightPercentage + '%') : '';
this.sizeWidth = (widthPercentage < 100) ? (widthPercentage + '%') : '';
  • 需要监听内容容器的滚动事件,通过滚动事件,来实时更改滚动条的滚动位置
js 复制代码
// 来自element UI 源码
const wrap = this.wrap;
// 根据滚动距离/可视内容高度进行 
// 注意:X100是为了计算百分比
this.moveY = ((wrap.scrollTop * 100) / wrap.clientHeight);
this.moveX = ((wrap.scrollLeft * 100) / wrap.clientWidth);

总结

以上就是常见的两种解决浏览器抖动问题的方式了。

上述只是自己浅浅理解,肯定存在些许错误,如有错误,恳请指正

相关推荐
tedcloud1236 小时前
Wand-Enhancer:如何搭建一套远程开发与测试环境
前端·人工智能·macos·开源·流程图
掘金挖土6 小时前
前端手摸手跑路之 AI 应用开发(三)
前端·后端
计算机魔术师7 小时前
OpenAI 宣称破解千禧年难题,数学家却说是「反例搜索」?
前端
志尊宝7 小时前
Vue3 零基础每日笔记(015):条件渲染 v-if 与 v-show——控制 DOM 生死还是控制显隐
前端·vue.js·笔记
掘金者阿豪7 小时前
OceanBase 和金仓怎么选?别只看分布式,复杂查询更考验架构取舍
前端·后端·架构
Bug修理工Bubble7 小时前
Swift ARC:一个对象到底什么时候才会被释放?
前端
ClouGence7 小时前
GPT-6 做 UI 自动化测试:Demo 惊艳,但真的适合长期回归吗?
前端·chatgpt·测试
阿酷tony7 小时前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
Bs_MoneyMagnet8 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
凌风的跨境分享8 小时前
Temu店群运维提效:定时策略自动化任务全场景实操指南
大数据·运维·前端·人工智能·架构·自动化