【CSS】你可能不知道伪元素(::before和::after)有多强大~

1,094 阅读5分钟

本文正在参加「金石计划」

flag:每月至少产出三篇高质量文章~

最近 ChatGPT Prompt 比较火,我新出了两篇: 

助你了解 ChatGPT 和 帮助你写出清晰有效的 ChatGPT Prompts,欢迎阅读~

1、背景

前几天看到一篇文章里面嵌了一个很好看的渐变色阴影的卡片(无奈它是一张图片,所以也就看不到样式),图片是这样的:

截屏2023-03-30 07.24.04.png

作为一个练习时长三年半的 “CSS 菜鸡”,我寻思着这玩意儿能用 CSS 实现不?于是,好奇心驱使下,我们捣鼓了一番,“优雅地”实现了这个效果。

image.png

我一开始冒出来的想法是,这可能是用 box-shadow 属性实现的,它的语法是这样的:

box-shadow: offset-x offset-y blur spread color position;

color 换成渐变色?试试...

截屏2023-03-30 07.37.32.png

年轻了,colorlinear-gradient 不是一个世界的,显然是 not ok 的,完全没有效果!

那难道背景是个高斯模糊(最底下是个渐变背景)?或者叠三层(底层纯色,中间一层渐变色,上层卡片),然后用定位处理?好像理论上是可以的。。。

但是总觉得这么实现有点不优雅,属于是莽夫行为 ~ 有啥比较优雅点的实现吗?翻了一下 CSS 表,我找到了答案:是的,有!它就是伪元素 ::before 或者 ::after

image.png

来看效果:

截屏2023-03-30 07.20.43.png

直接上代码:

于是,我对这俩做了深入的了解。

2、伪元素 ::before 和 ::after

什么是伪元素?

我想很多经验丰富的 FEer 应该还记得清除浮动的几个技巧,以前比较常用的就是伪元素:

.clearFix::after,.clearFix::before {
  display: block;
  content: '';
  clear: both;
  visibility: hidden;
  height: 0;
}

.clearFix { zoom: 1;}

CSS中的::before::after伪元素允许你在页面上插入内容,而不需要出现在HTML的结构中。虽然最终的结果实际上并不在DOM中,但它在页面上的显示就像它在DOM中一样,基本上是这样的:

div::before {
  content: "before";
}

div::after {
  content: "after";
}

结果是:

<div>
  before
  <!-- ... -->
  after
</div>

需要注意的是,有些地方写法是单冒号::before 和 :after,实际上这是新旧写法,支持双冒号(::)CSS3语法的浏览器也都支持(:)语法,IE8 只支持单冒号,所以目前建议只使用单冒号以获得最佳的浏览器支持。:: 是较新的格式,旨在区分伪内容和伪选择器。如果你不需要 IE8 的支持,可以随意使用双冒号。

浏览器支持方面:

截屏2023-03-30 08.14.59.png

我们通常会在如下场景下使用它:

  • 生成的内容在元素内容之前,但是又不想额外增加一层DOM。
  • ::after 的内容在源顺序上也是 "后" 的,所以如果自然堆叠在一起,它的位置会在 ::before 之上。

注意,内容仍然在它们所应用的元素里面。这个命名的感觉就像它们可能渲染在元素之前或之后,但实际上是在里面的其他内容之前或之后。

我想最重要的可能是它里面的 content 属性了,它可以放很多类型的值:

  1. 一个字符串content:"一个字符串"; - 特殊字符需要被特别编码为一个unicode entity

  2. 一张图片content:url(/path/to/image.jpg); - 图片会以它的精确尺寸插入,不能调整大小。因为像渐变这样的东西实际上是图像,一个伪元素可以是一个渐变。

  3. nothing: content:""; - 对 clearfixes 和插入图像作为背景图像很有用(设置宽度和高度,甚至可以用 background-size 调整大小)。

  4. countercontent:counter(li); - 对列表的样式非常有用(::marker 也用于此)。

  5. 一个断行符content:"Killing \A Me \A Softly"; - 有时候非常有用。

实际上你还可以插入html,只是没有任何效果。

截屏2023-03-30 08.11.06.png

3、用伪元素实现彩虹渐变效果

截屏2023-03-30 08.28.30.png

上代码:

学到了这个,以后一些常规的效果,实际上就不需要去找UI了,省得被骂是IKUN粉~

image.png

end~

欢迎关注之前的几篇文章: