CSS 有一个叫做content的属性。它只能与伪元素::after和::before一起使用。它写起来像伪选择器(带冒号),但它被称为伪元素,因为它实际上并没有选择页面上存在的任何内容,而是向页面添加了一些新内容。这就是它的样子
.email-address::before {
content: "Email address: ";
}
有了这段 CSS 代码,我们就可以使用以下 HTML 代码:
<ul>
<li class="email-address">[email protected]</li>
</ul>
输出结果将如下所示:
• 电子邮件地址: [email protected]
也许这个例子并不能让你垂涎三尺,但伪元素内容非常有用,可以实现很多很酷的功能。让我们一起了解一些想法和注意事项。
嘿!这是内容而不是设计!
第一个问题可能是内容和设计分离主义者的关注点。你实际上是使用 CSS content 属性向页面添加文本内容,这打破了这种界限。规范已经完成,并且已经实现了这个想法,但这并不意味着它不值得讨论。如果您对 CSS content 及其用法有自己的看法,请在评论中分享。
我认为它很棒,并且非常适合 CSS。考虑上面的例子,我们为所有具有email-address类的元素添加了“电子邮件地址:”文本。这是一个设计决策,为了内容的清晰度,决定在电子邮件地址前面加上这段文本可以使内容更清晰。也许在网站的重新设计中,显示这些电子邮件地址的空间变小了,因此决定不再使用文本作为前缀,而是使用一个小图标来代替。这符合 CSS 的理念,即 HTML 内容根本不需要更改,这种更改完全可以通过 CSS 来完成。
我明天会发布一篇关于这种想法的文章。
使用特殊字符
如果你需要在 CSS 内容中使用特殊字符,那就有点奇怪了。我的做法是找出该符号的 ASCII 码。 这个字形图表 很方便。因此,在该图表中,版权 © 符号为 © - 所以 ASCII 码为 169。然后我将这个数字放到 实体转换计算器 中,它会将其转换为 CSS 所需的格式。

以下是一些随机的有用字符:
\2018 – 左单引号
\2019 – 右单引号
\00A9 – 版权
\2713 – 对勾
\2192 – 右箭头
\2190 – 左箭头
示例技巧:用对勾标记已访问的链接
用对勾标记你的已访问链接
#main-content a:visited::before {
content: "\2713 ";
}
使用属性
你可以将目标元素的属性插入为内容。例如,一个锚链接可能有一个 title 属性
<a title="A web design community." href="https://css-tricks.cn">CSS-Tricks</a>
你可以像这样从 content 属性中访问该 title 属性:
a:before {
content: attr(title) ": ";
}
任何属性都可以以这种格式被访问:attr(name-of-attribute)。如果你想在 HTML 中插入一些内容以用于 CSS content 目的(但没有其他用途),你可以使用 HTML5 中新的 data- 属性前缀。
示例技巧:CSS3 工具提示
基于title属性的链接工具提示
a {
color: #900;
text-decoration: none;
}
a:hover {
color: red;
position: relative;
}
a[title]:hover::after {
content: attr(title);
padding: 4px 8px;
color: #333;
position: absolute;
left: 0;
top: 100%;
white-space: nowrap;
z-index: 20;
border-radius: 5px;
box-shadow: 0px 0px 4px #222;
background-image: linear-gradient(#eeeeee, #cccccc);
}

此示例使用title属性,以及你在网络上找到的其他类似示例也使用 title 属性。这可能是应该使用的正确属性。但是,请注意,浏览器有自己的工具提示弹出窗口。当它出现时,它会覆盖这个,看起来很奇怪。我试图截取问题的屏幕截图,但由于某种原因,它不允许我这样做。无法抑制它,除非不使用title属性。HTML5data-属性在这里仍然有用。
需要考虑的事项
- Firebug 尚未能够定位伪元素。WebKit 浏览器中的 Web 检查器可以定位它们,但不会显示它们的属性/值。我听说 IE 开发工具也可以定位它们,但不确定属性/值。
- 在 WebKit 中,它们必须是块级元素才能旋转。Firefox 可以旋转内联元素/伪元素。
- 在 Firefox 3.0 中,伪元素不能绝对定位。
- 它们不能进行过渡或动画。
示例技巧:花哨的电子邮件链接弹出窗口
我有一个想要尝试的想法,你想创建一个垂直的姓名列表,当鼠标悬停在它们上面时,它们的电子邮件地址会从下方滑出。为了使 HTML 代码尽可能简洁,我认为使用::after伪元素和 -webkit-transition 来实现这一点会很酷。但是,唉,你不能为伪元素设置动画或过渡。

使用 ::after
/content 方法,我得到了一个可工作的示例,但它不像我想象的那样滑出。使用<span>我实现了这个想法,也在演示页面中。
示例技巧:在打印样式表中显示完整链接
@media print {
#main-content a[href]:after { " (" attr(href) ") "; }
}
浏览器支持/可访问性
所有主要浏览器(Firefox 3+、Safari 3+、Chrome 3+、Opera 10+ 和 Internet Explorer 8+)(查看完整图表)都支持使用 ::after/::before 伪元素和 CSS content 属性,并且规范已处于完整候选推荐状态。
关于可访问性,我不确定具体情况。我尝试在我的 Mac 上使用 Safari 和 VoiceOver 来使用 电子邮件弹出链接演示。为了获得最佳的可访问性,我认为目标应该是让它读取所有文本,包括添加的 CSS 内容。我很难让它做到这一点,但我认为我曾经以某种方式让它做到了。我真的很不擅长使用 VoiceOver,发现即使在最基本的层面上让它执行我想做的事情也很令人沮丧。如果有人更了解与 CSS 内容相关的可访问性,我相信我们都希望了解更多。
嗨,Chris,
一如既往的好文章。
虽然看起来:before 和:after 与设计关系不大,但你可以实现一个巧妙的小技巧,最近在NetTuts上发布了
使用CSS创建多重边框
你的脚本有一些错误。
请参阅屏幕截图。
这就是我试图解决的问题,我认为通过使链接的悬停状态变为position: relative; 可以解决。但显然对于Opera来说这还不够,它可能会分别处理生成内容的z-index。也许尝试显式设置z-index?
在此处查看类似的文章 http://www.css3.info/tooltips-with-css3/。
这可能是因为背景渐变
只需添加background: #eee; :D 在渐变之前
z-index怎么样?
它可以用来使用data uri显示图像,例如
#myimg{content:url(“data:image/png;base64,abcdef…”)}
你可能会问它有什么用?如果你想将图像包含在文档中以实现可移植性,例如电子书。
但仅适用于webkit浏览器,如chrome和safari。
请记住,选择器需要使用:after或:before
如果有人想了解更多关于data uri的内容,我在这里有一点关于它的信息:https://css-tricks.cn/data-uris/
@Chris,它实际上似乎在没有img标签上的:before和:after的情况下也能正常工作——就像George展示的那样。content属性自2010年以来是否改变了行为?
我在以下情况下使用过它
在列表中使用短横线 (–) 替换项目符号;
列表末尾使用分号,最后一个列表元素使用句点;
为块引用添加引号;
“警告:这是网络钓鱼链接”到我的用户CSS,用于一个经常被伪造的网站(+ [href*=…] 和 :not[href=…])
使用:after和:before的缺点是Firebug看不到它(希望他们在将来修复它)。
Firebug看不到它,但WebKit的检查元素可以做到(至少对于此特定演示而言)。
但是,在Firebug中拥有该功能仍然很好。
非常巧妙。我刚刚发现了:before和:after所提供的所有强大功能。这些都是很棒的技巧。谢谢!
太棒了。
这就是我为什么喜欢CSS Tricks的原因,你似乎总能发现一些鲜为人知的属性,然后将它们应用到实际情况中,Chris,这是一篇很棒的文章,谢谢!
几年前,我想列出一些“要求”和“目标”。
目的是允许将目标更改为要求(反之亦然),但无需重新排序编号。
我使用了这个
以及这个
我用它来防止图像未加载,以及html中的longdesc
并使圆角和阴影成为仅用1张图片的可变大小的语义元素
http://css.devillasbuenas.es/sombra-semantica/index.html
问候
有一种方法可以解决“title”工具提示问题
使用jQuery将其所有内容复制到另一个属性,例如“tooltip”,然后使用CSS content属性显示“tooltip”属性。
我最喜欢的是,如果javascript被禁用或浏览器不支持CSS(IE6和7),你仍然可以使用本机浏览器工具提示。
绝对是一个好方法。正如我在文章中简要提到的,我可能会使用“data-tooltip”(有效)而不是“tooltip”(无效)。
请注意,如果我没记错的话,这种方法会使工具提示依赖于javascript,而这里的重点是将其设置为CSS工具提示。
(假设css将引用非“title”属性)
不完全是……因为链接将像往常一样具有title属性,而无需JavaScript即可使用正常的工具提示。但是使用JavaScript,该属性将更改为不会触发浏览器默认工具提示的内容,但仍可用于CSS工具提示。
嗨,Chris,感谢你写了这篇文章。
我一直对“content”问题很感兴趣。最初我需要它来解决我们表单中存在的问题,而不是将错误更改为红色,我们希望在被归类为错误的字段之前输出错误文本,这在这些情况下非常有效。
但是,作为一个政府机构,我们需要符合可访问性标准,而这正是它有点卡壳的地方。
我在accessify论坛上发表了一篇文章,一位名叫Jordan Gray的热心人士建议它不太易于访问!
也就是说,对于我的个人需求来说,它很棒!
再次感谢你写了这篇文章!:)
非常感谢你分享,Jonathan!
我认为Jordan评论中的第一句话值得再次发布
屏幕阅读器还没有赶上,这真是太可惜了。如果它们符合标准,作为设计师,我们可以充分利用它,因为我们知道它非常有用。
让我们快速回顾一下。
CSS正在获得@var变量
CSS几乎具有使用@media查询的基本if/then逻辑
(如果设备宽度小于600像素,则…)
CSS正在获得数学计算
(calc())
CSS可以向dom添加节点
(.email-address:before)
CSS可以访问dom节点属性
(content: attr(title) “: “;)
我是唯一一个看到创建专门设计用于处理内容样式工作的锁定、简化版本的真实javascript的充分理由的人吗?
@Chris Coyier
如该屏幕截图所示(http://i.imgur.com/jFbdF.png)Safari 5的Web Inspector完全显示并与伪选择器交互。
你能解释一下你是如何达到这一点的吗?我使用的是Safari 5,并且尝试了最新的WebKit nightly,但我无法弄清楚如何实际定位伪元素。
我再次了解了CSS中一个我忘记的模糊角落——谢谢。
但是,我认为content属于HTML,而样式属于CSS——我可以想象过度使用它会使事情变得非常混乱。想象一下在你的HTML中使用表格并在你的CSS中使用content……
我认为在某些情况下,你希望主要为了样式而添加内容。
这篇文章引起了我的兴趣,因为我刚刚创建了一个链接列表,我希望在每个链接的末尾显示一个向右箭头。
在我的HTML中,我在每个链接之后都添加了
→
,我认为这不是一个理想的解决方案。这种方法要干净得多。肯定存在(可能很少见)内容即样式的情况。你真是CSS大师!!
非常感谢你以及所有这些有用的评论者!!
嘿,Chris,这个转换器可能会让使用特殊字符更容易一点 :)
只需输入字符并点击转换!
你是最棒的,Chris。喜欢CSS Tricks
我在打印样式表中大量使用content属性 :)
酷!这真是太棒了,我喜欢打印样式表中的content属性。
你真是个厉害的人,Chris,很棒的css作品
是的,伪类选择器很好用。一位设计师告诉我,她希望在标语前后加上引号,但需要使用Times字体而不是Cufon替换。
“content”的一种用法是将其与计数器一起使用来对图像进行编号,例如“图1”、“表3-2”。这可以通过CSS轻松完成,而且比在标记中添加这些内容更容易。
另外,Chris,你还在代码和pre标签中使用它来向访问者显示代码的语言。这非常巧妙。
一篇关于CSS鲜为人知的属性的精彩文章!
嗨,Chris,这是一篇非常有趣的文章。看起来:before和:after伪类选择器可以做很多事情。我在我的任何网站上都没有真正使用过它们……也许我错过了一些技巧,到目前为止我似乎一直在没有它们的情况下应对自如。
我期待看到这个特定的博客主题进一步发展……
干杯。
哦!太酷了。我打算用这个!
谢谢!
我之前尝试过但失败的一件事是能够在某个元素之后插入HTML内容。一个很好的例子是丝带效果,你必须在主div之后插入两个额外的div。如果能够使用after伪类选择器插入这些额外的div,那就太棒了。
我发现设置链接时有一点不直观,那就是你不能使用
a:after {...}
,而必须将其引用为a[href]:after {...}
,尽管我可以理解为什么是这样。此外,应该说明的是,在使用悬停或活动状态以及类和ID时,应该按照以下顺序使用语法,因为一开始并不太明显a[attr]:state#id.class:after
更不用说极其有用的浮动清除功能了
这实际上是一种非常好的方法。干得好,Chris!!
大约一年前,当我基于默认主题创建WordPress主题时,这篇文章本可以为我节省一些时间。他们将一些内容项粘贴到CSS中以添加>>。我花了很长时间才弄清楚它来自哪里。
老实说,我可能会使用jQuery在前面添加电子邮件地址。我明白不要弄乱HTML,但是为什么在类似这样的事情上使用CSS而不是js呢?
这太棒了。我一直在寻找一种简单的方法来指示WordPress中的多级菜单,这正适合这种情况:D
.haschildren a:before {
content: “»”;
}
并从子菜单中删除»
.haschildren ul .page_item a:before {
content: normal;
}
谢谢!
该死……无法在WordPress 3中使用它……
除了Brendan链接到的转换工具之外,http://www.digitalmediaminute.com/reference/entity也值得一试。
谢谢,Chris。仍在思考如何将其应用到我当前的项目中,但这对我来说绝对是一件新鲜事 :)
感谢这篇文章!我上周还在搜索有关使用css content属性的更多信息,但找不到任何有帮助的内容。这几乎回答了我所有的问题。太棒了!
我使用CSS Content属性为我的调试样式表提供支持,我通过书签小程序切换它。效果很好,开发团队可以快速查看我们的标记结构中任何潜在的问题。
有没有办法让IE 6和7支持此属性?
我认为这对于最近围绕响应式网页设计的热潮来说将非常棒。
例如,在侧边栏中,图标在较大分辨率下以3X3网格显示,但在较窄的布局中则以列表形式显示,并在旁边显示文字。
对content标签的极佳运用,Chris。我对此进行了一些尝试,并结合以下jQuery代码,弹出窗口在Firefox中也能正常工作(尚不支持css动画)。
结合Modernizr,你可以检测CSS3动画,并在支持的地方使用,在不支持的地方使用上述jQuery。这样你就可以为所有用户提供相同的功能。
我在这里发布了一个演示
当然你需要转义的十六进制值来表示特殊字符吗?我只是直接输入任何Unicode符号。它可以工作,而且更易读。
当然,不要忘记通过HTTP头以UTF-8格式提供CSS文件。为确保万无一失,请将
@charset 'UTF-8';
添加到CSS文件的顶部。很棒的文章,我真的很喜欢CSS工具提示代码段。
我注意到在你的代码中,你(无意中)使用了
z-index: 20px;
但我认为你的意思是
z-index: 20;
据我所知,该属性只允许整数值,即使它可能只是忽略了'px'。
Chris,
我正在我最近的网站上尝试这个,试图将图像的alt文本覆盖在其上。出于某种原因,我无法使其工作,不得不获取文本并将其放入父列表元素的title属性中。我让它工作了,看起来非常不错,但我想知道你是否遇到过这种情况,或者知道为什么这无法使用图像alt文本作为CSS内容。
嗨,大家好,
Mark,我很想知道你是否找到了解决你问题的方法,因为我正在寻找做同样的事情。
谢谢,
Cristi
我正在尝试插入
<div class=”rightArrow”> </div>
作为content :before div标签正在显示。我尝试过03c…和<…,但都没有用。有什么办法可以插入标签吗?
谢谢你的帮助。~
一篇非常棒的文章,可以不用js或jquery就能改变工具提示的样式。
只有一个问题,是否可以使用CSS的“transition”属性来动画化工具提示的出现?
你好,
我知道这篇文章有点旧了,但对于任何不知道content属性的人来说,内容仍然很新鲜
我有一个关于动画或转换伪元素的评论
我设法做到了,但还无法像我想要的那样控制淡入和淡出。
现在CSS中是否已经更新了这一点?
我将发布一个链接到我应用此方法的页面
规范指出
content: '';
声明只能在伪元素上工作,但此示例在最新的webkit浏览器中有效。(“http://www.projectevolution.com/activity/replace-image-when-printing/””projectevolution.com/activity/replace-image-when-printing”)
在Chrome中预览此页面以查看差异:(http://preview.python.org “preview.python.org”)
你知道,webkit是故意宽容,还是规范变得更加宽松了?
这很酷,但还有更多吗?
参考:sass,查看 http://kushagragour.in/lab/hint/ 上的 hint.css。
绝对是在撕裂互联网的结构(对于 ie6,但是…)
(固定元素持有的绝对元素)由相对元素持有…
(参见 Chris 在此评论组顶部的回复)
可以根据页面设置 attr 属性的 tooltip,
这样 tooltip 显示就是流动的、居中的、响应式的?
Chris,请在上面演示一下。
你知道为什么它不起作用吗?
[main role=”main” class=”container” data-margin=”20vw”]
谢谢
我认为你只能获取元素的属性值作为生成内容的“content”属性,而不是任何 CSS 属性的任何值。
我正在做一个响应式设计,我想在设备小于 480px 时,为二级导航子项添加 ndash,为三级导航子项添加 mdash。
我遇到的问题是,当设备超过 768px 时,如何移除这些样式?
非常感谢您的帮助。
要重置,我通常声明 content: ”;
打印链接的想法很酷(但缺少“content: ”)。也许值得扩展,例如排除页面内的链接
@media print {
.main a[href]:after { content: ” (” attr(href) “) “; }
.main a[href^=”#”]:after { content: “”; }
}
很酷的东西…
今天我正在研究 GitHub 如何使用 CSS 内容来装饰他们的锚点。访问 https://github.com/lodash/lodash/blob/master/README.md 并将鼠标悬停在其中一个标题上。CSS 似乎是这样的
但是,
F05C
字符很奇怪。如果我运行alert('\F05C')
,我会得到一个方框。此外,根据 http://www.fileformat.info/info/unicode/char/f05c/index.htm,它是一个亚洲字符…我错过了什么?
很可能是图标字体,因为它们通常将其字符映射到拉丁字符集之外的字形。
非常感谢,“图标字体”是缺失的部分。我以前从未听说过这个,不知道它是什么,但在互联网上搜索“GitHub”和“图标字体”导致了 https://github.com/styleguide/css/7.0。结案。
这是一个非常有趣的概念。感谢您详细说明这一点。我一直都在寻找一种方法,将反复使用的完整编码放入一个带有 CSS 的类中。例如,我的网站上有一个评论页面,列出了数十条评论。在每个评论旁边,我都有一些社交链接,允许用户将评论发布到各个社交网站。我宁愿不为每次出现社交链接都复制所有这些代码。
您认为有没有办法将代码放入一个类中,然后为每次出现调用该类?
不,服务器端包含将是处理此问题的最佳方法。通过 CSS 和 content 属性将可执行 HTML 注入 DOM 将是一个巨大的安全漏洞,如果允许的话。我相信 CSS 不会允许这样做。如果它允许它——例如,如果你将 html 编码为 base64,然后让 CSS 以某种方式渲染它——那么就可以通过 CSS 进行脚本注入。
非常感谢您如此迅速地回复我。当您需要在页面上多次复制 HTML 代码时,您是否有任何关于如何最小化 HTML 代码的想法?我看到您提到了“服务器端包含”。对此不熟悉,所以您能否为我指明寻求帮助的方向或其他想法?谢谢 John
大多数编程语言——ASP、PHP 等——都具有将外部文件引用并“包含”到当前工作文件中的方法。这对于在一个以上的地方重用少量代码非常有用。如果您没有使用动态服务器编程语言,那么可以使用 jQuery 和 AJAX 实现类似的功能,其中可以在模板的指定部分注入一些代码。
在您的情况下,我想您有一个空的 div,如下所示:“然后是一些 javascript 代码,它查找这些元素并在 div 内部添加适当的 HTML。这对于“渐进增强”更有意义,因为当浏览器没有启用 JS(或已损坏)时,什么也不会发生,并且页面不会因无法执行的社交分享代码而变得杂乱。
我无法确切地告诉你如何操作,因为这在很大程度上取决于您网站的设置方式,但这就是想法。
内容和设计之间的区别在于万维网的最早概念。性能和可读性。
性能是我们(开发人员、设计师)优化一切的原因!!!!
可读性或以其他方式服务于信息的目的,是通过一个称为“设计”的过程来存档的。
现在,牢记这两个概念以及当前的技术/技巧状态,您可以解决内容和设计之间区别的问题。
这不是一个谦虚的意见…
Lazaros
用于工具提示的酷技巧。建议使用 data-title。如果您想要简单的工具提示,请使用此方法而不是 jQuery 插件。
感谢 Chris,在谷歌上提出的每个 CSS 问题都会链接到您的文章,并且每次都能找到最佳答案。