javascript - 如何提供动态(计算的)CSS 属性

标签 javascript jquery css html

我正在处理一项任务,每次用户滚动或调整屏幕大小时,我都想重新计算元素的 css 属性。

假设我想暗示。一个进度条,根据窗口中的滚动位置报告进度

<div class='progress-bar-wrap'>
   <div class='progress-bar-progress'></div>
</div>

function updateScrollProgress () {
   this.progressIndicator.css('width', this.calculateProgressBarWidth() + 'px');
}

我试图 Hook 滚动和调整大小事件,但这似乎有一个滞后的效果。

window.on('scroll', updateScrollProgress)
window.on('resize', updateScrollProgress)

我尝试在滚动和调整大小事件处理程序中使用 requestAnimationFrame

window.on('scroll', function(){window.requestAnimationFrame( updateScrollProgress))
window.on('resize', function(){window.requestAnimationFrame( updateScrollProgress))

在大多数浏览器中都经历了巨大的改进,但偶尔也会出现延迟。

我尝试从 requestAnimationFrame 处理程序请求另一个帧:

function updateScrollProgress () {
   window.requestAnimationFrame( updateScrollProgress)
   this.progressIndicator.css('width', this.calculateProgressBarWidth() + 'px');
}

这完全消除了滞后效应,但带来了无限循环调用此方法的成本,即使不需要重新计算也是如此。

有没有办法在浏览器决定绘制元素之前挂接处理程序,以便我可以为属性提供/设置那些“动态”css 值?

最佳答案

当您使用requestAnimationFrame 时,您在做什么。如果您已经摆脱了使用它的延迟,就不清楚为什么您说该功能运行“过于频繁”。通常在这种情况下,“太频繁”意味着“导致滞后”(通过过于频繁地运行并减慢速度)。如果你的不是,那么......?

如果您希望处理程序调用的频率较低,您可以对其进行去抖动,但随后您可能会注意到在您想要的更改之前出现延迟(因为您已经去抖动了),这听起来像是您要避免的.

无论如何,requestAnimationFrame 至少目前是“在浏览器呈现帧之前”工作的正确工具。

关于javascript - 如何提供动态(计算的)CSS 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53189664/

相关文章:

javascript - 单击时从特定 <li> 标记填充表单

javascript - 在初始页面加载时触发 javascript,而不是在按 'Back' 按钮时触发

javascript - 通过多个元素重复脚本

javascript - 如何使用 underscore.js 每个循环渲染 TREE JSON?

Javascript 增加输入结果并包含逗号

css - 为什么背景图片会随着这个标记缩放?

css - 缺少跨度元素

android - Webkit 转换 : multiple properties on Android

javascript - 按左侧值和顶部值对包含 DOM 标签和属性的数组进行排序

javascript - 如何在 sequelize.js 中嵌套 SQL 函数?