html5中伪元素,CSS 伪元素的一些罕见用例

作者:ahman

译者:前端小智

来源:css-tricks

点赞再看,养成习惯

本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料。欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。

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

父子元素悬停特效

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

6a8377d1f43754417ea1273de1036586.png

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

.section-title:before {

content: "";

width: 20px;

height: 20px;

background: blue;

/* Other styles */

}

.section-title:hover:before {

transform: scale(1.2);

}

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

项目/博客组

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

8eb186ad4a763600ebbbc328a7f3c9e6.png

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

5ba34644df6b4bd15080558ffc1076c5.png

HTML

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 ishadeed.com and a11ymatters.com on CSS, UX Design and Web Accessibility.

1.向 hero 元素添加 padding

6a5bd9a2c8266cf6e4ee1c42b3a669c2.png

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

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

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

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

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

3cbbdfdf35e691fb2ee5e6a4b0887624.png

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;

}

}

179aa1949e6c6da565589bd3e0337207.png

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

69f501f1e42d27d9e175e5fbb79bfe33.png

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

增加可点击区域的大小

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

bc08ed4321b521d7e098b2a01e613167.png

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

7fde19fc8322e44c21d40561181cbe4c.png

叠加层

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

040b882953f30ca04c32d02563997e0d.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...

包裹的阴影

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

36ea5e29e95b16483ca8c34d0cc8303e.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;

}

e21d6fcacefee14ef13a2c4765f7dcea.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;

}

f9f47b7318c2b8a5074c342bb2220b19.png

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

1c80d968e8a5094706e51d2d4b929ea0.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值。

1c489c6d3b2cceca2b32b24e3f1f7fa6.png

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

:after VS :before

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

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

028121b77eb026ba0425b5092ebee7a4.png

Title here

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

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

1. after 元素

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

8c710574b527520a7e1f29538768ea31.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

Download PDF

Download Doc

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;

}

151f431329deb407a92c7f5144084bf0.png

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

分隔线

da53bd9636cbdd52cba74801298dd6b6.png

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

HTML

Or

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和完善,大家面试可以参照考点复习,另外关注公众号,后台回复福利,即可看到福利,你懂的。

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[CSS 伪元素的一些罕见用例]http://www.zyiz.net/tech/detail-136177.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值