gpt4 book ai didi

javascript - DOMContentLoaded 触发后是否应用样式?

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:46 24 4
gpt4 key购买 nike

考虑以下 HTML 文档:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
body {
background: crimson;
}

div {
transition: opacity 5s;
font-size: 4em;
opacity: 0;
}

.loaded div {
opacity: 1;
}
</style>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('body').className += "loaded";
})
</script>
</head>
<body id="body">
<div>
TEST
</div>
</body>
</html>

div 应该将其不透明度设置为 0 并且不透明度有 5 秒的过渡。

加载 DOM 时,主体会获得一个将 div 不透明度设置为 1 的类。

我希望 div 不透明度在 5 秒内从 0 过渡到 1。但出于某种原因,它会立即发生。

如果我使用 setTimemout,每个都按预期工作:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
body {
background: crimson;
}

div {
transition: opacity 5s;
font-size: 4em;
opacity: 0;
}

.loaded div {
opacity: 1;
}
</style>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
setTimeout(function() {
document.getElementById('body').className += "loaded";
}, 0);
})
</script>
</head>
<body id="body">
<div>
TEST
</div>
</body>
</html>

让我怀疑样式是在触发 DOMContentLoaded 事件后加载的。这是正常行为还是我做错了什么?

最佳答案

简短版:

您正在进入未指定行为的领域。我建议您使用 load 事件来触发转换。

长版:

当元素的 CSS 属性的计算值发生变化时(spec)触发 CSS 转换,因此在样式系统首次计算之前它不能被触发文档的样式。

样式系统应该在加载相关样式表后对文档执行初始样式传递(即第一次计算计算值)——否则它将不得不重新执行在样式表完成加载后工作。

另一方面,DOMContentLoaded的想法是在解析 HTML 源代码后立即触发——无需等待任何其他资源(包括样式表)完成加载,因此它 naturally can fire before any style was calculated .

浏览器有 complicated heuristics阻止内联脚本的执行(并因此解析和 DOMContentLoaded)并确定何时进行初始布局和绘制。脚本可以 force reflow/restyle ,因此根据特定的网页代码和时间,样式信息可能在您的脚本运行时可用。我不确定它是否在所有浏览器中都能可靠地工作,但是从 DOMContentLoaded 强制布局可能会导致您的转换工作:

div.offsetTop // force layout

关于javascript - DOMContentLoaded 触发后是否应用样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46989755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com