浏览器在繁重的工作负载之前不应用样式
Browser does not apply style before heavy workload
我想重新绘制页面中包含大量DOM元素的部分。理想情况下,我想设置visibility: hidden;
,重新绘制部分,然后设置visibility: visible;
。然而,Chrome似乎忽略了我设置CSS的javascript。
如果取消对debugger
行的注释,您将看到Chrome在调试时确实正确地呈现了内容。这可能不是Chrome特有的。
如果SO代码片段不起作用,我还制作了一个jsFiddle。
//debugger;
var container = document.getElementById("container");
container.style.visibility = "hidden";
//debugger;
// In my case, some d3 code that draws SVG elements
// In this case, something that makes the browser work for x seconds
var delay = 3000,
counter = 1000;
var t0 = new Date().getTime(),
t1 = undefined;
while ((t1 = new Date().getTime()) <= t0 + delay) {
if (t1 >= t0 + counter) {
console.log(counter);
counter += 1000;
}
}
container.style.visibility = "visible";
#container {
border: 1px dotted red;
width: 100%;
height: 100%;
}
<div id="container">
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
<div>Some DOM Element</div>
</div>
Chrome不会立即应用您的DOM更改,直到javascript线程释放或某些原因导致它必须进行渲染。
您可以将代码移动到回调函数中,该函数将在…之后运行。。。嗯,0ms,或者JS引擎下次可以运行它的时候。
var container = document.getElementById("container");
container.style.visibility = "hidden";
setTimeout(function () {
// In my case, some d3 code that draws SVG elements
// In this case, something that makes the browser work for x seconds
var delay = 3000, counter = 1000;
var t0 = new Date().getTime(), t1 = undefined;
while ((t1 = new Date().getTime()) <= t0 + delay) {
if (t1 >= t0 + counter) {
console.log(counter);
counter += 1000;
}
}
container.style.visibility = "visible";
}, 0);
所以你的代码会改变你的可见性CSS,注册一个回调来运行下一个,然后返回。然后浏览器有一个要渲染的dom更改,所以它会这样做并重新绘制。然后运行回调。
基本上,将其视为一个大型的单线程进程。
相关文章:
- 当主导航离开视图时,为粘性导航应用样式
- CSS根据属性的可用性有条件地应用样式
- 从跨域对Iframe应用样式
- 如果父宽度大于特定值,则css应用样式
- Javascript:表单在第一次验证和应用样式后提交
- 需要通过Javascript代码应用样式的帮助
- 如何单独对输入标签应用样式
- jQuery 在动态加载内容并使用 .replaceWith() 后不应用样式
- 应用样式,无论元素是否已使用 jQuery 添加到 DOM 中
- 使用 javascript 在标签中应用样式(不带 jQuery)
- 应用样式的屏幕在网页上轻扫
- 基于javascript条件应用样式
- 应用样式“;游标:指针”;所有具有onClick功能的React组件
- 如何在动态生成的元素上应用样式
- 浏览器在繁重的工作负载之前不应用样式
- Jquery移动动态字段未应用样式
- 使用JavaScript添加内容后重新应用样式
- 媒体打印;t在chrome上应用样式,但在firefox中效果完美
- 在javascript中切换时,Chrome应用样式表的速度非常慢
- Wordpress子主题没有通过JQuery应用样式