CSS 中有一个 content
属性,它旨在与 ::before
和 ::after
伪元素一起使用。它将内容注入到元素中。
这是一个例子
<div
data-done="✅"
class="email">
[email protected]
</div>
.email::before {
content: attr(data-done) " Email: "; /* This gets inserted before the email address */
}

该属性通常接受您放入其中的任何内容。但是,它有一些无效的值无法接受。我最近听到有人对此感到困惑,所以我自己也尝试了一下,并了解了一些事情。
这可以正常工作
/* Valid */
::after {
content: "1";
}
…但这个不行
/* Invalid, not a string */
::after {
content: 1;
}
我不完全确定为什么,但我认为这是因为 1
是一个无单位的数字(即 1
与 1px
),而不是字符串。你也无法欺骗它!我尝试过这样聪明地操作
/* Invalid, no tricks */
::after {
content: "" 1;
}
但是,您可以从属性输出数字,正如您可能怀疑的那样
<div data-price="4">Coffee</div>
/* This "works" */
div::after {
content: " $" attr(data-price);
}
但是当然,您永远不会将生成的内容用于诸如价格之类的重要信息,对吧?!(请不要这样做。它没有很好的可访问性,文本也无法选择。)
即使您可以获取和显示该数字,它也只是一个字符串。您无法真正对它进行任何操作。
<div data-price="4" data-sale-modifier="0.9">Coffee</div>
/* Not gonna happen */
div::after {
content: " $"
calc(attr(data-price) * attr(data-sale-modifier));
}
您不能使用数字,无论如何
/* Nope */
::after {
content: calc(2 + 2);
}
注意!不要尝试像在 PHP 或 JavaScript 中那样连接字符串
/* These will break */
::after {
content: "1" . "2" . "3";
content: "1" + "2" + "3";
/* Use spaces */
content: "1" "2" "3";
/* Or nothing */
content: "1 2 3";
/* The type of quote (single or double) doesn't matter, but content not coming back from attr() does need to be quoted. */
}
规范中 有一项功能 可以将属性转换为实际类型,而不是将它们都视为字符串……
<wood length="12" />
wood {
width: attr(length em); /* or other values like "number", "px", or "url" */
}
…但我相当肯定这还没有在任何地方起作用。此外,它对我们使用伪元素没有帮助,因为字符串已经可以工作,而数字不行。
通过电子邮件与我联系的人特别困惑为什么他们无法在 content
上使用 calc()
。我不确定在这种情况下是否可以帮助您进行数学运算,但值得知道伪元素可以是计数器,并且这些计数器可以进行自己的有限形式的数学运算。例如,这是一个从 12 开始并在 DOM 中该级别上的每个元素递减 2 的计数器。
查看 CodePen 上 Chris Coyier 的笔 反向双重倒计时 (@chriscoyier)。
我们在这里没有提到的唯一其他事情是伪元素可以是图像。例如
p:before {
content: url(image.jpg);
}
…但它受到奇怪的限制。您甚至无法调整图像大小。¯\_(ツ)_/¯
更常见的是使用空字符串作为值 (content: "";
),它可以执行诸如 清除浮动 之类的事情,还可以定位、调整大小并拥有自己的背景。
酷… 我以前不知道可以用纯 CSS 进行计数
我想知道是否可以将元素的高度/宽度属性作为替代,至少对于我在此 CodePen 中使用的字体大小 https://codepen.io/spicedham/pen/pxzYYe,类似于您在本篇文章中演示的 calc。听起来好像还没有。
这不可访问,因为我认为屏幕阅读器不会读取伪元素
有趣的是,生成的内容不仅可以包含一个图像,还可以包含多个图像或文本和图像的混合体(快速示例:http://jsfiddle.net/63xLqbet/)。
此外,也许值得注意的是,CSS 生成内容级别 3 规范草案似乎将
content
属性的单个图像值与文本和图像的混合体区分开来:前者称为“内容替换”,应该像常规的img
元素一样工作(包括调整大小),而后者称为“内容列表”(并像当前的伪元素内容一样工作)。不幸的是,根据当前规范 实现伪元素的“内容替换”与现有内容不兼容,但我们可能可以一起改进规范?让我感到困惑的是尝试使用 HTML 实体或原始 Font Awesome(高 ASCII)字符。在这两种情况下,您都必须使用 Unicode 字符代码。
干得好!感谢分享您的知识。
计数器甚至可以帮助将
content
值设置为var()
或calc()
。var()
案例calc()
案例用于
content
的图像可以是 CSS 渐变,例如实时测试 以上所有内容。
不过需要注意的是 - 使用 CSS 渐变在当前的 Firefox 中仍然不起作用,尽管我最近收到一封电子邮件通知我 这个旧错误 已修复。我希望这也意味着
-moz-element()
也将作为content
值起作用,因为我在我的 原始测试用例 中也包含了它。那真是纯粹的 CSS 技巧。
我相信有些屏幕阅读器会宣布生成的内容。但是,值得记住的是,并非所有 CSS 都用于网页。生成的内容用于分页媒体模型以插入内容,例如页眉和页脚。我在这里演示了一些内容 https://www.smashingmagazine.com/2015/01/designing-for-print-with-css/
不太喜欢 content 属性。我觉得它违反了内容和表现的分离。根据您的方法,它也可能使 i18n/l10n 变得复杂。
Chris:“…伪元素可以是图像[在content属性中]…但它受到奇怪的限制。您甚至无法调整图像大小。¯_(ツ)_/¯”
这样说没错。但是,如果您为伪元素提供background-image,那么一个新的世界就打开了。/_☀__/\
然后您可以随意调整大小,可以使用精灵图,使其响应式、动画化等等。通过正确的计算(或良好的试错法),调整大小不是问题。
示例:clba.nl/experiments/styling-images-in-pseudo-elements