您知道可以动画化伪元素的 content
属性吗?根据规范中 可动画属性列表,您不应该能够做到这一点,但在最新版本的桌面 Chrome 中可以。下面的演示应该通过更改 @keyframes
动画内的 content
属性,将“A”动画化为“B”。
代码
要制作如上所示的字母切换演示,我们创建一个空的 <div>
,我们将用其伪元素的 content
填充它,如下所示
<div class="letter-changer"></div>
然后,我们设置其伪元素的 content
以像任何其他 CSS 属性一样更改,方法是创建一个新的 @keyframes
动画并使用 animation
属性进行设置。
@keyframes changeLetter {
0% {
content: "A";
}
50% {
color: white;
}
100% {
content: "B";
}
}
.letter-changer::after {
animation: changeLetter 3s linear infinite alternate;
}
这有用吗?
它在大多数浏览器中都不起作用,而且是非标准的,这使得使用它存在一定的风险。但是,确实存在铺设小路的事情(即,如果它显然有用,它 *可能* 会被标准化)。
在 上周的一篇文章中,我描述了一种在加载栏内递增数字的方法。它使用这个概念来递增数字。这是另一个类似的例子:倒计时!
浏览器支持
在我自己的测试中,动画 content
*仅* 在稳定的桌面 Chrome(撰写本文时为 v46)中有效。其他地方都不支持。桌面或 iOS 上的 Safari 不支持。Firefox 不支持。IE 不支持。这些浏览器中的每一个都会忽略动画,仅在伪元素中显示原始 content
。
它可能在遥远的将来成为一个方便的技巧 *或* 它可能永远不会被任何东西支持。非标准功能始终至少存在被弃用的风险,因此 Chrome 的支持可能不会永远持续下去。
2017 年 9 月再次查看浏览器的支持情况:Chrome/移动版、Firefox 和 Opera 中均有效,但在 IE、Edge 或 iOS 中无效。
2020 年 10 月再次查看浏览器的支持情况:Edge 采用了 Chrome,因此问题已解决。IE 支持越来越少。iOS 仍然不支持。
如果您需要以跨浏览器兼容的方式更改内容
使用 JavaScript。
我觉得即使在 CSS 中拥有 content 属性也 *非常* 不对!
为什么?它在很多不同的情况下都派上用场,例如 clearfix、创建不同宽度的边框等。
+1 Adrian
我也有同感,CSS 应该处理样式而不是内容
动画在 Android 版移动 Chrome 上清晰可见。不过我有点同意 Kino 的观点,虽然从概念上讲,我觉得这很有趣,但想到内容是由 CSS 生成而不是仅仅样式化,我就感到不安。我更愿意在我的内容所在的地方编写倒计时、加载百分比标签等,而不是将控制权交给我的 CSS 文件。
关于我唯一不反对 content 属性的情况是当它用于字体图标时,我认为此功能对于动画化图标可能很有用。
Robin 和 Chrome 做得好 - 带来跨界代码!为了几十年前(并且旨在提供研究论文)的一套界限而牺牲实用性,现在已经毫无意义了。如果它有效,那就去做吧!
关于“不要有任何
content
!D:<” 的话题,content
在不需要或难以触碰 HTML 的情况下非常有用。考虑一下您想要修改的制作糟糕的 Tumblr 或可能是 WordPress 样式,或者允许您注入 CSS 的浏览器扩展。它也适用于使页面在某种程度上不如通过content
添加时可访问的信息,例如一些趣味文字或如 Herman 提到的字体图标。至于文章的内容,我不太喜欢。它不仅不符合规范,而且在实际应用中也相当有限。我认为将其标记为一个巧妙的技巧,并让它存在即可。
关于此功能的标准化程度
上面链接的 CSS Transitions 草案规范最后一次重新发布是在两年前(2013 年 11 月)。从那时起,许多更改已被纳入 编辑草案,包括一种新的“可动画属性”方法。
虽然旧规范仅支持对可以连续插值(数字、颜色等)的属性进行动画,但新草案允许对几乎任何属性进行动画, 通过应用离散(分步)过渡。唯一无法进行动画的属性是会导致过渡或动画出现逻辑实现问题的属性。这基本上是在 SVG/SMIL 中定义可动画属性的方法。
换句话说,如果 Chrome 等测试实现没有重大问题,那么这很可能在将来成为标准。
content
属性只是受此更改影响的众多属性之一。也就是说,其他评论者关于将content
用于实质性文本内容的担忧是合理的。请仅用于非必要的装饰效果!很棒的评论。
有用、信息丰富、细致入微且经过充分研究。
谢谢。
针对 Kino 和 Matt 的观点,我觉得 CSS 中的内容确实有其位置。例如,我经常用它来分隔内联列表项。在我看来,项目是通过 |、逗号、括号分隔的,这是一个设计问题。能够对其进行动画似乎是合理的。
它似乎在 Android 版 Chrome 上可以正常工作。
这对我们使用 CSS 的网页 **设计师** 来说是一个非常有用且简单的全新可能性。 :)
Robin,感谢您的发现和演示。
关于“CSS 仅用于样式”的教条 - 这是理论胜于实用 - 毫无意义。
而且,很高兴从 Amelia 那里得知这正在标准化。