CSS 伪元素的一些罕见用例

做者:ahman
译者:前端小智
来源:css-tricks
点赞再看,养成习惯

本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了不少个人文档,和教程资料。欢迎Star和完善,你们面试能够参照考点复习,但愿咱们一块儿有点东西。css

伪元素已经使用了很长时间。然而,我以为有些用例并非全部开发人员都彻底了解的。我写下这篇文章是为了阐明它们,以便它们能被更多地使用。前端

父子元素悬停特效

因为伪元素属于其父元素,所以存在一些不寻常的用例。 如今,让咱们看一个简单的示例。git

clipboard.png

这个设计有一个 section title,在它的左边有一个小圆圈。当咱们将鼠标悬停在section title上时,圆圈会变大。github

.section-title:before {
    content: "";
    width: 20px;
    height: 20px;
    background: blue;
    /* Other styles */
}

.section-title:hover:before {
    transform: scale(1.2);
}

简单明了,接着咱们将此概念延伸到更有用的用例。面试

项目/博客组

在个人网站上,有一个部分须要列出了全部的项目名称。 我想为每一个项目添加一个缩略图,但这对我来讲并非最重要的事情。 对我来讲,更重要的是连接自己。 不久前,我在Ethan Marcotte网站上首次看到了这种效果。微信

clipboard.png

上面的设计模型展现了我想要应用的想法。段落中的每一个彩色连接都有一个与之配对的伪元素。ide

clipboard.png

HTMLsvg

<section class="hero">
    <p>Hello, my name is Ahmad. I’m a UX Designer and Front End Developer that enjoys the intersection between design and code. I write on <a href="www.ishadeed.com" class="link-1">ishadeed.com</a> and <a href="www.a11ymatters.com" class="link-2">a11ymatters.com</a> on CSS, UX Design and Web Accessibility.</p>
</section>

1.向 hero 元素添加 padding

clipboard.png

我想为伪元素保留空间,因此添加padding是一个解决方案。工具

你们都说简历没项目写,我就帮你们找了一个项目,还附赠【搭建教程】flex

2.对伪元素进行绝对定位

为了绝对定位它们,我须要定义哪一个父类是相对的父类。它应该被添加到hero中 。

注意如下GIF中的位置:.hero部分中的position: relative是如何影响伪元素的。

图片描述

3.添加伪元素

最后一步是添加伪元素及其悬停效果:

.link-1 {
  color: #854FBB;
}

@media (min-width: 700px) {
  .link-1:after {
    content: "";
    position: absolute;
    right: 0;
    top: 20px;
    width: 150px;
    height: 100px;
    background: currentColor;
    opacity: 0.85;
    transition: 0.3s ease-out;
  }

  .link-1:hover {
    text-decoration: underline;
  }

  .link-1:hover:after {
    transform: scale(1.2);
    opacity: 1;
  }
}

图片描述

注意,我使用了currentColor做为伪元素背景色。若是你不知道这个关键字,它表示继承其父元素的color值。因此在任什么时候候,我想要改变连接的颜色,只改变一次是很容易的。

图片描述

事例源码:https://codepen.io/shadeed/pe...

增长可点击区域的大小

经过向连接添加一个伪元素,连接周围的可点击区域将变得更大。这是很是有用的,将加强用户的体验。咱们举个例子:

clipboard.png

此外,它还能够用于扩展卡片组件的可点击区域,该组件具备查看更多连接的功能。请注意,文章的内容(如标题和图像)将位于伪元素之上,所以它不会影响文本的选择或图像的保存。

clipboard.png

叠加层

假设有一个带有背景图像的元素,而且设计中有一个渐变叠加层,而且混合模式设置为color,伪元素能够帮到你。

clipboard.png

.hero {
  position: relative;
  height: 300px;
  background: url("image.jpg") center/cover;
}

.hero:after {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-image: linear-gradient(180deg, #851717 0%, #30328C 100%);
  mix-blend-mode: color;
}

事例源码:https://codepen.io/shadeed/pe...

包裹的阴影

过去,我曾经建立过一个在边缘倾斜的阴影。 它有一点微妙的效果。 你猜怎么了! 可使用伪元素来实现它们。

clipboard.png

建立元素

使用如下常规样式建立了一个div元素。

.elem {
     position: relative;
     display: flex;
     align-items: center;
     max-width: 400px;
     background: #fff;
     padding: 2rem 1rem;
     font-size: 1.5rem;
     margin: 2rem auto;
     text-align: center;
     box-sizing: border-box;
}

clipboard.png

添加伪元素

而后,我为每一个元素添加了:before:after伪元素,其宽度为50%(为了更好的演示,我为每一个元素添加了不一样的背景)

.elem:before,
.elem:after {
    content: "";
    position: absolute;
    top: 2px;
    width: 50%;
    height: 100%;
}

.elem:before {
    left: 0;
    background: grey;
}

.elem:after {
    right: 0;
    background: #000;
}

clipboard.png

接下来,添加transform: skew(x),其中X为2度。 对于其中之一,X应该为负数以实现所需的效果。

clipboard.png

接下来,我将向每一个伪元素添加z-index:-1,以将其移到其父元素的后面。

完成后,执行如下操做:

  • 添加filter: blur
  • 下降透明度
  • 添加了从透明到黑色的渐变(以隐藏其父级顶部中心的伪元素边缘)

最后代码

.elem {
  position: relative;
  display: flex;
  align-items: center;
  max-width: 400px;
  background: #fff;
  padding: 2rem 1rem;
  font-size: 1.5rem;
  margin: 2rem auto;
  text-align: center;
  box-sizing: border-box;
}

.elem:before,
.elem:after {
    content: "";
    position: absolute;
    top: 3px;
    width: 50%;
    height: 100%;
    z-index: -1;
    background: linear-gradient(to bottom, transparent, #000);
    filter: blur(3px);
    opacity: 0.3;
}

.elem:before {
    left: 0;
    transform: skewY(-2deg);
}

.elem:after {
    right: 0;
    transform: skewY(2deg);
}

还有另外一种选择,即在伪元素:before:after之间交换skewY值。

clipboard.png

事例源码:https://codepen.io/shadeed/pe...

:after VS :before

在最近的Twitter讨论中,我了解到最好使用:before而不是:after。 为何? 由于在使用:after时,可能须要咱们向其余嵌套元素添加z-index,以便伪元素不会与它们重叠。 咱们举一个真实的例子。

这是一张由缩略图和标题组成的简单卡片。 注意到,在文本下方会有一个渐变叠加层,以使文本更清晰,以防缩略图颜色太浅。

clipboard.png

<article class="card">
  <img src="article.jpg" alt="">
  <h2>Title here</h2>
</article>

要在文本下方添加渐变叠加层,我将须要使用伪元素。 你会选择哪个? :before:after?咱们来研究看看。

你们都说简历没项目写,我就帮你们找了一个项目,还附赠【搭建教程】

1. after 元素

在这种状况下,标题将显示在伪元素叠加图的下方,以下所示:

clipboard.png

解决方案是在卡片标题中添加z-index。 即便这是一个简单快速的解决方案,也不是正确的作法。

.card-title {
    /*Other styles*/
    z-index: 1;
}

2. before 元素

使用:before元素时,默认状况下可使用! 无需在卡片标题中添加z-index。 缘由是,使用:before时,该元素不会出如今其余同级项的上方,而当元素为:after时,它将出如今其余同级项之上。

事例源码:https://codepen.io/shadeed/pe...

基于文件扩展名的连接样式

例如,若是有一个包含PDF文件的连接,则能够添加PDF图标,以使其对用户更清晰。

面是如何显示连接的PDF图标的示例

HTML

<p><a href="example.pdf">Download PDF</a></p>
<p><a href="example.doc">Download Doc</a></p>

CSS

a[href$=".pdf"]:before {
  content: "";
  display: inline-block;
  vertical-align: middle;
  margin-right: 8px;
  width: 18px;
  height: 18px;
  background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/182774/np_pdf_377198_000000.svg) center/20px no-repeat;
  padding: 3px;
}

clipboard.png

事例源码:https://codepen.io/shadeed/pe...

分隔线

clipboard.png

在此示例中,存在带有“or”的分隔符。 在每一侧都有一条线。 使用伪元素和 Flexbox 能够作到这一点。

HTML

<p>Or</p>

CSS

p {
  display: flex;
  align-items: center;
}

p:before, p:after {
  content: "";
  height: 2px;
  background: #c5c5c5;
  flex-grow: 1;
}

p:before {
  margin-right: 10px;
}

p:after {
  margin-left: 10px;
}

事例源码:https://codepen.io/shadeed/pe...


原文:https://www.sitepoint.com/hid...

代码部署后可能存在的BUG无法实时知道,过后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给你们推荐一个好用的BUG监控工具 Fundebug


交流

文章每周持续更新,能够微信搜索「 大迁世界 」第一时间阅读和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,整理了不少个人文档,欢迎Star和完善,你们面试能够参照考点复习,另外关注公众号,后台回复福利,便可看到福利,你懂的。

相关文章
相关标签/搜索