伪元素可以做的很多神奇的事情

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费赠送额度!

使用伪元素 ::before::after 可以实现非常神奇的事情。对于页面上的每个元素,您都可以获得两个额外的免费元素,您可以对它们进行与任何其他 HTML 元素相同的操作。它们可以解锁许多有趣的设计可能性,而不会对标记的语义产生负面影响。这里有一些神奇的事情。如果您愿意,这是一个汇总。

提供多个背景画布

因为您可以将伪元素绝对定位到其父元素,所以您可以将它们视为每个元素可以使用的两个额外图层。 Nicolas Gallagher 向我们展示 了很多应用场景,包括多个边框、模拟 CSS3 多重背景以及等高列。

扩展您可以使用单个元素创建的形状数量

上面所有形状 以及更多形状 都可以用单个元素创建,这使得它们实际上很实用。与那些使用 1,700 个 div 创建的“用纯 CSS 制作咖啡杯!”之类的东西不同,那些东西很酷但并不实用。

以下是一个六角星的示例

#star-six {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
  position: relative;
}
#star-six:after {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-top: 100px solid red;
  position: absolute;
  content: "";
  top: 30px;
  left: -50px;
}
@media print {
  a[href]:after {
    content: " (" attr(href) ") ";
  }
}

清除浮动

与其插入额外的非语义标记来清除容器元素的浮动,我们可以使用伪元素来完成此操作。通常被称为 “clearfix”,并在语义上用类名“group”命名。

.group:before,
.group:after {
  content: "";
  display: table;
}
.group:after {
  clear: both;
}
.group {
  zoom: 1; /* For IE 6/7 (trigger hasLayout) */
}

模拟 float: center;

尽管我们可能很希望它,但 float 属性实际上没有 center 的值。但是 float 有 left 和 right,通过使用占位符伪元素,我们可以划分两列之间的区域并将图像放置在那里,我们可以 模拟这种效果

使用代码语言标记代码块

在这个网站的当前设计中,代码块使用伪元素标记了它们所属的代码语言。

pre::after {
  content: attr(rel);
  position: absolute;
  top: 22px;
  right: 12px;
}

创建整个图标集

Nicolas Gallagher 再次将形状的概念提升到另一个层次,通过创建一个巨大的图标集,这些图标集不使用任何图像,而只是在最多两个元素上使用伪元素。

更有效地利用可用空间

CSS 给予了什么,CSS 也可以拿走什么。我的意思是,伪元素内容可以通过 媒体查询有条件地应用或删除。也许您在空间有限时应用一个图标,而在空间充足时使用更具描述性的词语替换它。

应用排版装饰

如果您的伪元素是文本,它们将继承与其父元素相同的排版样式。但在设置其内容时,您也可以对其进行样式设置。比如,使用不同的字体和颜色,让您的标题以装饰的形式脱颖而出。

h2 {
  text-align: center;     
}
h2:before, h2:after {
  font-family: "Some cool font with glyphs", serif;
  content: "\00d7";  /* Some fancy character */
  color: #c83f3f;
}
h2:before {
  margin-right: 10px;
}
h2:after {
  margin-left: 10px;
}

创建全浏览器宽度栏

当您需要背景延伸到全宽,但内容不延伸到全宽的元素时,您经常会遇到非语义内部包装元素或重复且杂乱的间距声明。或者,您可以 模拟这种效果,通过用一个元素限制内容宽度,并使标题栏使用伪元素延伸到边缘。

创建主体边框

使用常规边框在左侧和右侧,以及在顶部和底部使用固定定位的伪元素栏,我们可以获得 “主体边框”效果,而无需任何专门的标记。

body::before, body::after {
  content: "";
  position: fixed;
  background: #900;
  left: 0;
  right: 0;
  height: 10px;
}
body::before {
  top: 0;
}
body::after {
  bottom: 0;
}
body {
  border-left: 10px solid #900;
  border-right: 10px solid #900;
}

制作一个闪闪发光的按钮

如果您制作一个具有透明到白色到透明渐变的伪元素块,将其定位在按钮外部(通过隐藏溢出隐藏它),并在悬停时对其进行过渡移动,您可以制作一个按钮,当您将鼠标悬停在它上面时,它似乎会捕捉到一些光线。仅 Firefox、Chrome 26+ 和 IE10+ 支持。

原始 作者 Anton Trollbäck; 伪元素化 作者 Nicolas Gallagher; 另一个版本 作者是我。

如果您没有对元素设置相对定位,绝对定位的伪元素将相对于下一个具有相对定位的父元素进行定位。如果没有其他元素,它将相对于根元素进行定位。您可以使用它制作一个全浏览器窗口元素,将其堆叠在主元素下方,并在悬停时显示它,从而在链接上实现 “页面淡出”效果

将标题设置为三维丝带样式

每个人都喜欢丝带!查看此代码片段,了解此丝带的 HTML 和 CSS 代码。它使用负 z-index,在某些情况下,需要额外的包装元素才能防止元素在具有不透明背景的父元素下丢失。

设置有序列表中的数字样式

你有没有尝试过设置有序列表中的数字样式?你最终会做一些蠢事,比如将内容包装在 span 中,设置列表项的样式,然后使用 span 移除该样式。或者以疯狂的方式使用背景图片。或者移除列表样式并添加自己的数字。所有这些方法都很糟糕。最好利用 伪元素作为计数器

使数据表格响应式

大型数据表格在小屏幕上浏览起来很糟糕。要么放大后需要垂直和水平滚动,要么缩小后太小,无法阅读。我们可以将 CSS 媒体查询与伪元素结合起来,使数据表格响应式,并在小屏幕上将其重新格式化为更易于阅读的视图。

创建样式化的工具提示

使用 HTML5 数据属性,然后将其拉入并将其设置为伪元素,我们可以通过 CSS 创建完全自定义的工具提示

在导航项之间添加分隔符

Pseudo element delimiters

如果你想区分一个导航项与另一个导航项,你的选择是有限的:你可以添加边框(很无聊)或者在每个项之间添加额外的标记(很糟糕)。伪元素允许你使用任何内容作为项之间的间隔符

.menu li:before {
  content: "// ";
  position: relative;
  left: -1px;
}

无需 HTML 创建整个网站

Website without HTML

利用浏览器自动插入的 <html><head><body> 标签,Mathias Bynens 展示了如何仅使用 CSS 和伪元素内容创建网站

构建仅使用 CSS 的字体

CSS Sans

使用单个 HTML 元素(加上伪元素)来表示每个字符,Yusuke Sugomori 通过 CSS 构建了完整的字体,名为 CSS Sans。交互式演示让你可以浏览 Yusuke 用于构建每个字符的所有巧妙技巧(例如,旋转、圆角和倾斜)。

该字体仅限于大写拉丁字母,并且非常漂亮。CSS Sans 项目很好地展示了在约束条件下构建的创造力。