【发布时间】:2017-08-11 00:35:11
【问题描述】:
我有一个设置了转换的 svg。现在,当我向其中添加一个具有不同属性的类时,只有在 DOMContentLoaded 事件和 addclass 事件之间添加延迟时才会发生转换。这里有两个例子,第一个没有延迟,第二个有无限小的延迟:
毫不拖延:
! function() {
window.addEventListener('DOMContentLoaded', function() {
var logo2 = document.querySelector("svg");
logo2.classList.add('start');
});
}();
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 104.75 32.46">
<defs>
<style>
polygon {
fill: red;
transition: opacity 3s ease-out, transform 3s ease-out;
opacity: 0;
}
.start polygon {
opacity: 1;
}
#A1 polygon {
transform: translate(100px, 100px);
transition-delay: 1s;
}
/*styles after animation starts*/
.start #A1 polygon {
transform: translate(0px, 0px);
}
</style>
</defs>
<title>Logo</title>
<g id="A1">
<polygon class="right" points="0.33 31.97 0.81 26.09 13.61 3.84 13.13 9.72 0.33 31.97" />
</g>
</svg>
有延迟:
! function() {
window.addEventListener('DOMContentLoaded', function() {
var logo2 = document.querySelector("svg");
setTimeout(function(){
logo2.classList.add('start');
},0);
});
}();
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 104.75 32.46">
<defs>
<style>
polygon {
fill: red;
transition: opacity 3s ease-out, transform 3s ease-out;
opacity: 0;
}
.start polygon {
opacity: 1;
}
#A1 polygon {
transform: translate(100px, 100px);
transition-delay: 1s;
}
/*styles after animation starts*/
.start #A1 polygon {
transform: translate(0px, 0px);
}
</style>
</defs>
<title>Logo</title>
<g id="A1">
<polygon class="right" points="0.33 31.97 0.81 26.09 13.61 3.84 13.13 9.72 0.33 31.97" />
</g>
</svg>
正如您在第二个示例中看到的,我添加了 0 秒的延迟,但它导致动画正常工作,为什么?
更新 1:嗯...我们都错了 :-)
我在没有DOMContentLoaded 的情况下尝试了相同的代码,并且没有延迟。它仍然没有立即添加过渡:
! function() {
var logo2 = document.querySelector("svg");
logo2.classList.add('start');
}();
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 104.75 32.46">
<defs>
<style>
polygon {
fill: red;
transition: opacity 3s ease-out, transform 3s ease-out;
opacity: 0;
}
.start polygon {
opacity: 1;
}
#A1 polygon {
transform: translate(100px, 100px);
transition-delay: 1s;
}
/*styles after animation starts*/
.start #A1 polygon {
transform: translate(0px, 0px);
}
</style>
</defs>
<title>Logo</title>
<g id="A1">
<polygon class="right" points="0.33 31.97 0.81 26.09 13.61 3.84 13.13 9.72 0.33 31.97" />
</g>
</svg>
我还注意到 jQuery 不会导致重排。这是一个内联 jquery 代码的示例,它在加载 CSSOM 之前仍然不会触发 ready 函数。如果我们有外部 jquery,而不是内联 jquery,那么在 CSSOM 准备好后会触发 ready 事件。我达到的理解是CSSOM在html dom渲染后需要几毫秒。因此,直到它下载外部 jquery CSSOM 已准备就绪。 DOMContentLoaded 根本不关心样式表是否加载,也就是说它不关心 CSSOM 是否准备好。
【问题讨论】:
-
在
CSSOM构建之前DOMContentLoaded如何被触发的相关讨论:stackoverflow.com/questions/42950574/…
标签: javascript html css svg css-transitions