陪玩程序源码,回流与重绘的优化策略
陪玩程序源码,回流与重绘的优化策略
以下操作会导致 3次重绘 1次回流:
const el = document.querySelector('.el'); el.style.color = 'blue'; // 导致重绘 el.style.backgroundColor = '#96f2d7'; // 导致重绘 el.style.margin = '10px'; // 导致回流(回流会引起重绘)
如果采用动态添加class或者使用cssText方式的话,只会导致1次回流,从而减少重绘次数:
.test { color: blue; background-color: #96f2d7; margin: 10px; } const el = document.querySelector('.el'); el.classList.add('test') //或者使用cssText el.style.cssText = "color: blue; background-color: #96f2d7; margin: 10px;";
DOM离线处理
离线的DOM不包含在当前DOM树中,因此对离线DOM的处理不会引起页面的回流和重绘。
使用display: none可以将元素从渲染树中彻底移除,元素既不可见,也不参与布局。在对该DOM进行操作时,不会触发回流和重绘,只有在操作完成后,将display属性改为显示时,才会触发回流和重绘。
需要注意的是,visibility: hidden只会影响重绘,而不会影响重排。
const el = document.querySelector('.el'); el.style.display = 'none'; //一系列修改样式、大小或添加删除子节点操作 el.style.display = 'block';
以上对隐藏的DOM元素操作不会引发其他元素的重排,只会在隐藏和显示时触发两次重排
文档片段(Document Fragment)
利用文档片段(Document Fragment) 在当前DOM之外构建一个子树,并将其复制回文档中。文档片段允许我们在内存中创建DOM结构,而不会直接影响到文档的回流和重绘。这样,在构建完整子树后,我们可以将文档片段的内容一次性地插入到文档中,这样只会触发一次重排。
const el = document.querySelector('.el'); const fragment = document.createDocumentFragment(); //批量添加子节点操作 el.appendChild(fragment);
拷贝替换
将原始元素复制到一个脱离文档的节点中,对该节点进行修改,然后再替换原始的元素。通过这种方式,我们可以在不影响主文档的情况下对元素进行操作,这样只会触发一次重排。
const el = document.querySelector('.el'); const clone = el.cloneNode(true); //一系列修改样式、大小或添加删除子节点操作 el.parentNode.replaceChild(clone, el);
当元素的position属性为absolute或fixed时,它们不会对其他元素的布局产生影响,因此在进行样式修改时,只有该元素本身及其子元素会触发重排和重绘。这样可以减小重排的范围,提高页面的渲染性能。
需要注意的是,将元素的position属性设置为absolute或fixed会使元素脱离文档流,可能会导致其他元素的布局错乱。在使用这种方法时,需要仔细考虑并进行适当的布局调整,以确保页面的正确显示和交互。
在读取元素的布局信息(如offsetTop、offsetLeft、getBoundingClientRect()等)时,会触发强制同步布局导致回流重绘。尽量避免频繁读取布局信息,可以通过缓存布局信息或一次性读取多个属性来减少回流和重绘。
对于一些频繁触发的事件(如scroll和resize),可以使用节流(throttle) 或防抖(debounce) 来限制事件的触发频率,从而减少不必要的回流和重绘。
// 节流函数封装 function throttle(func, delay) { let timer = null; return function () { if (!timer) { timer = setTimeout(() => { func.apply(this, arguments); timer = null; }, delay); } }; } // 防抖函数封装 function debounce(func, delay) { let timer = null; return function () { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, arguments); }, delay); }; }
在进行动态数据渲染时,建议尽量避免使用 table 布局。因为一旦 table 中的元素大小或内容发生改变,整个 table 都需要重新计算,这会引起不必要的回流和重绘操作。因此,我们可以尝试使用flex、gird等布局方式来避免这种情况的发生,从而提高页面的渲染效率。
使用 CSS3 动画代替JavaScript动画,transform、opacity、keyframes和animation等CSS属性来触发硬件加速,可以将动画效果交给 GPU 来处理,减少回流和重绘的开销,从而提高性能。
以上就是陪玩程序源码,回流与重绘的优化策略, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2023-03-01 直播平台制作,Android 悬浮窗延时5秒返回APP问题
2023-03-01 视频直播系统源码,java 随机验证码 、10 分钟有效
2023-03-01 成品直播源码推荐,java 实现邮件服务
2022-03-01 直播app源码,状态栏和导航栏设置成透明状态
2022-03-01 直播app开发,判断用户是否是首次登录平台
2022-03-01 直播源码,悬浮窗滚动渐变色效果