Tob*_*zau 5 css css3 css-transitions
我想在已display: none
设置的元素上进行css转换.请考虑以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Transition From Hidden</title>
<style type="text/css">
div {
-webkit-transition-property: all;
-webkit-transition-duration: 2s;
}
div.hidden {
display: none;
opacity: 0;
}
div.from {
opacity: 0;
}
</style>
<script type="text/javascript">
function loaded() {
var e = document.getElementById("foo");
e.className = "from";
window.webkitRequestAnimationFrame(function(t) {
e.className = null;
});
}
</script>
</head>
<body onload="loaded()">
<div id="foo" class="hidden">
My test div
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我想从去class="div.hidden"
到class=""
,即从display: none; opacity: 0;
以display: block; opacity: 1;
然而,铬(至少)有一个对象display: none
没有动画.元素立即进入结束状态.
我的工作是首先将元素设置为display: block; opacity: 0;
然后在下一帧中进行转换(使用requestAnimationFrame()
.它有点尴尬,我在规范中找不到任何对此行为的解释.我知道我可以使用visibility
-attribute,但我不想使用它,因为我不想布局隐藏的元素.
所以,问题是:这是正确的行为还是错误?如果它是正确的行为,是否有更好的方法来编写代码?请注意,我不是在问是否有任何库可以执行此操作,我想知道是否有更好的方法直接在DOM上执行此操作.
至于有关,如果这是在规范的问题,还有就是www-style@w3.org名单上一个有趣的线程在这里.我没有读过所有内容,但似乎他们没有开始动画none
,转换规范也需要澄清.
更新:我已经询问了邮件列表,并且我得到了工作组会议记录的链接,其中决定如果启动状态是否应该没有转换display: none
.
要确保执行转换,必须确保在将动画属性设置为新目标之前计算其值.当display设置为none时,通常不会计算值.这是一个工作示例:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Fade</title>
<style>
.hidden { display: none }
.start { opacity: 0 }
.transition { opacity: 1; -webkit-transition: opacity 1s }
</style>
</head>
<body>
<div id='div' class="hidden">Test</div>
<script>
var elem = document.getElementById('div');
function ontransitionend(event) {
elem.className = null;
elem.removeEventListener('transitionend', ontransitionend);
}
elem.addEventListener('transitionend', ontransitionend);
elem.className = 'start';
window.getComputedStyle(elem).opacity;
elem.className = 'transition';
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
请注意,您必须访问opacity属性.打电话还不够getComputedStyle()
!