CSS 伪元素的一些罕见用例

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

本文转载自微信公众号「大迁世界」,转载本文请联系大迁世界公众号。

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

父子元素悬停特效

由于伪元素属于其父元素,因此存在一些不寻常的用例。现在,让我们看一个简单的示例。

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

  1. .section-title:before { 
  2.     content: ""; 
  3.     width: 20px; 
  4.     height: 20px; 
  5.     background: blue; 
  6.     /* Other styles */ 
  7.  
  8. .section-title:hover:before { 
  9.     transform: scale(1.2); 

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

项目/博客组

在我的网站上,有一个部分需要列出了所有的项目名称。我想为每个项目添加一个缩略图,但这对我来说并不是最重要的事情。对我来说,更重要的是链接本身。不久前,我在[Ethan Marcotte][1]网站上首次看到了这种效果。

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

「HTML」

  1. <section class="hero"> 
  2.     <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> 
  3. </section> 

1.向 hero 元素添加 padding

我想为伪元素保留空间,所以添加padding是一个解决方案。

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

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

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

3. 添加伪元素

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

  1. .link-1 { 
  2.   color: #854FBB; 
  3.  
  4. @media (min-width: 700px) { 
  5.   .link-1:after { 
  6.     content: ""; 
  7.     position: absolute; 
  8.     right: 0; 
  9.     top: 20px; 
  10.     width: 150px; 
  11.     height: 100px; 
  12.     background: currentColor; 
  13.     opacity: 0.85; 
  14.     transition: 0.3s ease-out; 
  15.   } 
  16.  
  17.   .link-1:hover { 
  18.     text-decoration: underline; 
  19.   } 
  20.  
  21.   .link-1:hover:after { 
  22.     transform: scale(1.2); 
  23.     opacity: 1; 
  24.   } 

注意,我使用了currentColor作为伪元素背景色。如果你不知道这个关键字,它表示继承其父元素的color值。所以在任何时候,我想要改变链接的颜色,只改变一次是很容易的。

事例源码:https://codepen.io/shadeed/pen/66e9c2039b50463d96a2a9832f05ec0f

增加可点击区域的大小

通过向链接添加一个伪元素,链接周围的可点击区域将变得更大。这是非常有用的,将增强用户的体验。我们举个例子:

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

叠加层

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

  1. .hero { 
  2.   position: relative; 
  3.   height: 300px; 
  4.   background: url("image.jpg") center/cover; 
  5.  
  6. .hero:after { 
  7.   content: ""; 
  8.   position: absolute; 
  9.   left: 0; 
  10.   top: 0; 
  11.   width: 100%; 
  12.   height: 100%; 
  13.   background-image: linear-gradient(180deg, #851717 0%, #30328C 100%); 
  14.   mix-blend-mode: color; 

事例源码:https://codepen.io/shadeed/pen/627c62e16dfa49021960cdc74ce459ba

包裹的阴影

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

1. 创建元素

使用以下常规样式创建了一个div元素。

  1. .elem { 
  2.      position: relative; 
  3.      display: flex; 
  4.      align-items: center; 
  5.      max-width: 400px; 
  6.      background: #fff; 
  7.      padding: 2rem 1rem; 
  8.      font-size: 1.5rem; 
  9.      margin: 2rem auto; 
  10.      text-align: center; 
  11.      box-sizing: border-box; 

2. 添加伪元素

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

  1. .elem:before, 
  2. .elem:after { 
  3.     content: ""; 
  4.     position: absolute; 
  5.     top: 2px; 
  6.     width: 50%; 
  7.     height: 100%; 
  8.  
  9. .elem:before { 
  10.     left: 0; 
  11.     background: grey; 
  12.  
  13. .elem:after { 
  14.     right: 0; 
  15.     background: #000; 

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

c4a1.png" target="_blank">c4a1.png" width="auto" border="0" height="auto" alt="" title="">

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

完成后,执行以下操作:

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

3. 最后代码

  1. .elem { 
  2.   position: relative; 
  3.   display: flex; 
  4.   align-items: center; 
  5.   max-width: 400px; 
  6.   background: #fff; 
  7.   padding: 2rem 1rem; 
  8.   font-size: 1.5rem; 
  9.   margin: 2rem auto; 
  10.   text-align: center; 
  11.   box-sizing: border-box; 
  12.  
  13. .elem:before, 
  14. .elem:after { 
  15.     content: ""; 
  16.     position: absolute; 
  17.     top: 3px; 
  18.     width: 50%; 
  19.     height: 100%; 
  20.     z-index: -1; 
  21.     background: linear-gradient(to bottom, transparent, #000); 
  22.     filter: blur(3px); 
  23.     opacity: 0.3; 
  24.  
  25. .elem:before { 
  26.     left: 0; 
  27.     transform: skewY(-2deg); 
  28.  
  29. .elem:after { 
  30.     right: 0; 
  31.     transform: skewY(2deg); 

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

事例源码:https://codepen.io/shadeed/pen/be104604ada76a7fa854bffca1d6b806

:after VS :before

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

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

c4da7cfddea045b3b20947a448bab.png" target="_blank">c4da7cfddea045b3b20947a448bab.png" width="auto" border="0" height="auto" alt="" title="">

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

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

1. after 元素

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

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

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

2. before 元素

使用:before元素时,默认情况下可以使用!无需在卡片标题中添加z-index。原因是,使用:before时,该元素不会出现在其他同级项的上方,而当元素为:after时,它将出现在其他同级项之上。

事例源码:https://codepen.io/shadeed/pen/0032e918818efe33b9016434a98bf6ff

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

例如,如果有一个包含PDF文件的链接,则可以添加PDF图标,以使其对用户更清晰。

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

「HTML」

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

「CSS」

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

事例源码:https://codepen.io/shadeed/pen/24ecff4a6e9269d1ee526ec692151af4

分隔线

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

「HTML」

  1. <p>Or</p> 

「CSS」

  1. p { 
  2.   display: flex; 
  3.   align-items: center; 
  4.  
  5. p:before, p:after { 
  6.   content: ""; 
  7.   height: 2px; 
  8.   background: #c5c5c5; 
  9.   flex-grow: 1; 
  10.  
  11. p:before { 
  12.   margin-right: 10px; 
  13.  
  14. p:after { 
  15.   margin-left: 10px; 

事例源码:https://codepen.io/shadeed/pen/314cc43ddbd4ac384f02551d8907a323

 

责任编辑:赵宁宁 来源: 大迁世界
相关推荐

2016-10-19 14:54:46

css选择器css3css

2020-08-18 08:08:59

CSS伪元素伪类

2023-10-11 07:33:39

Z-indexCSS

2011-06-02 10:04:53

CSS

2010-09-06 12:32:10

CSS伪元素

2012-04-23 14:04:56

CSS网站

2017-05-10 15:30:30

skynet崩溃程序

2010-09-07 10:39:59

CSS伪元素

2015-10-12 08:59:57

异步代码测试

2021-04-25 09:30:52

开发CSS 浏览器

2022-10-19 12:00:32

CSS 伪类伪元素

2023-05-22 15:37:31

CSS元素JavaScript

2023-08-14 15:56:52

CSS 伪元素开发

2011-06-16 16:39:14

CSS

2018-01-09 18:06:41

Python爬虫技巧

2020-12-18 08:09:53

CSS伪元素基础

2020-08-26 08:54:17

CSSFont Size属性

2018-02-23 13:25:49

LinuxVim编辑器

2020-02-03 16:03:36

疫情思考

2011-06-01 16:50:21

JAVA
点赞
收藏

51CTO技术栈公众号