CSS 工作组 几周前对此表示赞同。 这个超级概念性的提案是,我们可以动画化或过渡,例如,从 display: block
到 display: none
。
这是一个有点令人费解的事情,因为在元素上设置 display: none
会取消动画。 添加它会重新启动动画。 按照规范
将
display
属性设置为none
将终止应用于元素及其后代的任何正在运行的动画。 如果元素的 display 为 none,将 display 更新为除none
以外的值将启动应用于元素的所有动画,这些动画由animation-name
属性应用,以及应用于具有display
(除none
以外)的后代的所有动画。
这种循环行为使得这个概念似乎一开始就死了。 但如果 @keyframes
支持除 none
以外的任何 display
值,那么 none
就没有办法取消或重新启动任何东西。 这使非 none
值优先,允许 none
仅在动画或过渡完成后执行其操作。
Miriam 的 toot(我们确实这样称呼这些东西,对吧?)解释了这可能如何工作
我们并不是在 block
和 none
之间进行插值,而是允许 block
保持完整,直到事物停止移动并且安全地应用 none
为止。 这些是关键字,因此两者之间没有明确的值。 因此,这仍然是离散动画。 我们在动画完成后在两个值之间切换。
这是来自 讨论 的 Robert Flack 的示例
@keyframes slideaway {
from { display: block; }
to { transform: translateY(40px); opacity: 0;}
}
.hide {
animation: slideaway 200ms;
display: none;
}
这个例子很有帮助,因为它展示了第一帧如何将元素设置为 display: block
,它作为非 none
值优先于底层的 display: none
。 这允许动画运行并完成,而 none
在过程中不会取消或重置它,因为它只在动画之后解析。
这是 Miriam 在 Mastodon 上提到的示例
.hide {
transition: opacity 200ms, display 200ms;
display: none;
opacity: 0;
}
这次我们处理的是过渡。 底层的 display
值在任何事情发生之前都设置为 none
,因此它完全不在文档流中。 现在,如果我们要在悬停时转换它,也许像这样
.hide:hover {
display: block;
opacity: 1;
}
…那么元素理论上应该在 200ms
内淡入。 同样,我们是在 display
值之间切换,但 block
优先,因此过渡不会在最前面被取消,而是在 opacity
完成过渡之后实际应用。
至少我的想法是这样。 我很高兴有非常聪明的人在思考这些问题,因为我想象有很多事情需要理清。 例如,如果多个动画分配给一个元素,none
会重置或取消其中任何一个吗? 我相信,无限动画、反向方向以及各种其他事情都将在将来得到解决。
但这是一个超级酷的第一步!
我们等待!
安顿下来。 这需要一段时间。 我等了 20 多年才用网格/弹性盒替换嵌套表格和糟糕的浮动 div。 我仍然记得整个开发社区是如何围绕浮动 div 团结起来的,就好像它们比无限嵌套表格更好一样。 结果是无限的开发工作来解决 IE6 和 Chrome 浏览器限制,这样您的数据就不会“越过篱笆”。 Clearfix 疯狂和浮动 div 框架最终解决了大部分问题。 实际上,这些东西在很长时间内都不会得到“最终”批准。
我们可以使用组合的“不透明度”和“可见性”来实现相同的效果,对吧? 比如“不透明度:0;可见性:隐藏”。 但是的,我喜欢 display 属性的直接方法。 在某些情况下,这种冗余听起来不错!
嗨! 透明度会产生间距
有趣的是,他们选择了一种不同于可见性的方法。 可见性在过渡开始时切换,因此您经常需要延迟其过渡以使其他过渡完成。
现在听起来像是一个特殊情况,当过渡到 none 时,在最后,当过渡到 block 时,在开始。 这确实有道理,但他们会改变可见性吗?
您使用悬停的示例将不起作用,因为元素将不存在,无法悬停。 有效的是,当父元素被悬停时,子元素可以应用 display block。
根据我的经验,可见性仅在它的值将变为
visible
时,才会在过渡开始时切换。 如果它的值将变为hidden
,它将在过渡结束时切换。 因此,它的过渡不需要延迟。我网站上最受欢迎的文章是关于这个主题的:https://www.impressivewebs.com/animate-display-block-none/
人们似乎很乐意这样做,所以我理解为什么它被视为 CSS 的一项功能。 我的解决方案使用 JS,因此它不是最好的。 但到目前为止,我还没有看到一个有效的纯 CSS 解决方案。
你说得对,但从什么时候开始?
我想我老了。
https://greywyvern.com/?post=337
这是通过使用延迟解决的。 但它已经 11 年了。
能够动画化到
height: auto
也会非常有帮助。当我试图弄清楚如何在一段文本中将一个 span 从
display: none
动画化为display:inline
时…