CSS的主要目的是给HTML元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的。事实上,CSS中有一个特性允许我们添加额外元素而不扰乱文档本身,这就是伪元素

如果你一直关注我们的教程,你一定听说过这个概念。

事实上,确实有一些CSS选择器被归类为伪元素,例如::first-line:first-letter::selection:before以及:after。但是,在本文中,我们把讨论的范围限定在:before:after这两个元素,因此本文中的“伪元素”特指这两个元素。我们将从基础开始讲解这个特殊的主题。

语法和浏览器支持


实际上,伪元素在CSS1中就已经存在,但是我们现在讨论的:before:after是在CSS2.1中发布的。起初伪元素的语法是使用一个冒号“:”,但是随着web的发展,在CSS3中伪元素使用两个冒号“::”——也就变成了::before::after——以便将它与伪类区分开(如:hover:active等)。

然而,不管你使用单冒号还是双冒号,浏览器都能识别它们。但是IE8只支持单冒号的格式,如果你想要保持广泛的浏览器兼容性,使用单冒号会更安全。

它是做什么的

简而言之,伪元素会在内容元素的前后插入额外的元素,技术上来讲,当我们添加它们的时候,和如下标记方式产生的效果是等价的。

<p><span>before</span> This the main content. <span>after</span> </p> 

但是,实际上文档中并没有生成这些元素。它们在表面上可见,但是你在文档的源代码中找不到它们,这就是它们为什么被称作“”元素。

使用伪元素


使用伪元素相对容易,语法selector:before会在内容之前添加一个元素,对应的,语法selector:after会在之后添加,我们可以通过content属性在它们里面添加内容。

例如,下面的代码会在blockquote元素的之前和之后各添加一个引号。

blockquote:before {content: open-quote;
}
blockquote:after { content: close-quote; } 

伪元素样式

尽管是元素,事实上伪元素表现得就像“真”的元素,我们可以给它们添加任何样式,比如改变颜色、添加背景、调整字体大小、对齐文本等等。

blockquote:before {content: open-quote;font-size: 24pt; text-align: center; line-height: 42px; color: #fff; background: #ddd; float: left; position: relative; top: 30px; } blockquote:after { content: close-quote; font-size: 24pt; text-align: center; line-height: 42px; color: #fff; background: #ddd; float: right; position: relative; bottom: 40px; } 

指定伪元素尺寸

生成的元素默认是内联元素,所以当我们想指定它们的宽度和高度的时候,我们首先得用display: block把它们声明为块级元素。

blockquote:before {content: open-quote;font-size: 24pt; text-align: center; line-height: 42px; color: #fff; background: #ddd; float: left; position: relative; top: 30px; border-radius: 25px; /** define it as a block element **/ display: block; height: 25px; width: 25px; } blockquote:after { content: close-quote; font-size: 24pt; text-align: center; line-height: 42px; color: #fff; background: #ddd; float: right; position: relative; bottom: 40px; border-radius: 25px; /** define it as a block element **/ display: block; height: 25px; width: 25px; } 

关联背景图片

我们也可以把内容替换为图片,而不是只有纯文本。尽管content属性提供了url()来插入图片,但大多数情况下,我更倾向于使用background属性,从而更好的控制图片。

blockquote:before {content: " "; font-size: 24pt; text-align: center; line-height: 42px; color: #fff; float: left; position: relative; top: 30px; border-radius: 25px; background: url(images/quotationmark.png) -3px -3px #ddd; display: block; height: 25px; width: 25px; } blockquote:after { content: " "; font-size: 24pt; text-align: center; line-height: 42px; color: #fff; float: right; position: relative; bottom: 40px; border-radius: 25px; background: url(images/quotationmark.png) -1px -32px #ddd; display: block; height: 25px; width: 25px; } 

然而,正如你在上面代码中看到的,我们仍然声明了content属性并且把它的值设置为空字符串。content属性是必须的,并且应该总是被引用;否则的话,伪元素无法正常工作。

结合伪类

尽管有不同类型的伪类和伪元素,我们可以在一个CSS规则中同时使用伪类和伪元素,例如,如果我们希望当鼠标移到blockquote元素上,引号的背景色能够略微变深。

blockquote:hover:after, blockquote:hover:before { background-color: #555; } 

添加过渡效果

我们甚至可以在伪元素上应用transition属性来创建优美的颜色过渡效果。

transition: all 350ms;
-o-transition: all 350ms; -moz-transition: all 350ms; -webkit-transition: all 350ms; 

更多灵感


为了激发你的灵感,我们选择了三个非常酷的例子,希望能为你的Web设计提供帮助。

迷人的阴影

在Paul Underwood 的教程中解释了如何使用伪元素:before:after来创建更加逼真和吸引人的阴影特效。只需把这两个伪元素设置为绝对定位以及负的z-index,就可以把它们放置到图片后面实现阴影的效果。

3D按钮

这是一个非常机智的实现,利用伪元素和CSS3的box-shadow来绘制一个令人惊叹的3D按钮,仅仅使用了CSS和锚文本标签<a></a>。伪元素:before被用来在按钮的左侧添加数字1

图片叠加效果

通过使用伪元素,使得仅仅用一个图片标签就能创建一个凌乱的图片叠加效果变为可能。通过给伪元素设置负的z-index,使得叠加的图片在真正的图片后面,让人产生图片叠加的错觉。

结论


伪元素就是这么酷并且十分好用,我们可以在不影响实际HTML结构的情况下使用这两个元素,几乎所有我们能想到的事情,它们都可以做到。

事实上,有一些伪元素的改进工作,目前正逐步进行,如伪元素嵌套div::before::before { content: ''; }多重伪元素div::before(3) { content: ''; },在未来的web设计中这些改进显然会为我们的设计提供更多的可能性。它们将会在最新的浏览器中得到支持,现在,请让我们耐心等待!

译者补充


在“指定伪元素尺寸”这节中,作者提到了要加上display: block;将伪元素变成块级元素才能设置宽高。实际上,由于作者已经设置了float: left/right;,而float会把元素设置为块级元素,所以无需设置display: block;

你可以点击此处查看最终效果,感兴趣的话,可以下载源码进行研究。

英文原文:Understanding Pseudo-Element :before and :after

转载于:https://www.cnblogs.com/powerwu/articles/10090522.html

理解伪元素:before和:after相关推荐

  1. 理解伪元素 :before 和 :after

    为什么80%的码农都做不了架构师?>>>    层叠样式表(CSS)的主要目的是给HTML元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的.事实上CSS中有一 ...

  2. CSS:理解:Before和:After伪元素

    CSS样式表的主要作用是修饰Web页面上的HTML标记,但有时候,为了实现某个效果而往页面里反复添加某个HTML标记很繁琐,或者是显得多余,或者是由于某种原因而做不到.这就是CSS伪元素(Pseudo ...

  3. 理解css伪类和伪元素

    伪类就是可以通过直接添加一个类样式达到同等效果,而伪元素,则需要先添加一个元素,然后在元素上添加样式才能达到同等效果 伪类 :active 向被激活的元素添加样式. :focus 向拥有键盘输入焦点的 ...

  4. 修改after样式_理解:Before和:After伪元素

    CSS样式表的主要作用是修饰Web页面上的HTML标记,但有时候,为了实现某个效果而往页面里反复添加某个HTML标记很繁琐,或者是显得多余,或者是由于某种原因而做不到.这就是CSS伪元素(Pseudo ...

  5. 理解伪类选择器与伪元素选择器

    1. 两个选择器的异同: 伪类选择器是用来向某些选择器来添加效果.不修改DOM内容,通过一些特定的选择器根据特定的状态.特定条件来修改元素的杨氏.比如:悬停(hover).点击(active)以及文档 ...

  6. CSS3伪类和伪元素的特性和区别

    前端er们大都或多或少地接触过CSS伪类和伪元素,比如最常见的:focus,:hover以及<a>标签的:link.visited等,伪元素较常见的比如:before.:after等. 其 ...

  7. CSS before / after伪元素

    CSS伪类对象 after和before的用法 IE对after.before是不支持的,请在firefox.opera.chrome下试调! :before 语法:Selector : before ...

  8. 如何使用:before和:after伪元素?

    如果你有一直密切关注各个关于网页设计的博客,你大概会注意到,:before和:after伪元素已经在前端开发界得到越来越多的关注,并且是有很好的理由.特别是,有个博主(位于伦敦的一位开发者Nicola ...

  9. 【响应式Web前端设计】CSS3伪类与伪元素的区别

    首先先来看看伪类与伪元素的定义 w3c中对于它们是这么解释的 CSS中伪类与伪元素的概念是很容易混淆的,今天就来谈谈伪类与伪元素之间的区别 伪类:用于向某些选择器添加特殊的效果 伪元素:用于将特殊的效 ...

  10. CSS3之伪元素选择器和伪类选择器

    伪类选择器,和一般的DOM中的元素样式不一样,它并不改变任何DOM内容.只是插入了一些修饰类的元素,这些元素对于用户来说是可见的,但是对于DOM来说不可见.伪类的效果可以通过添加一个实际的类来达到. ...

最新文章

  1. adodb.RecordSet的属性和方法
  2. SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复
  3. ubuntu启动时自动挂载windows分区
  4. matlab 工业相机 曝光时间_Matlab CCD工业相机采集图像问题 - 信息科学 - 小木虫 - 学术 科研 互动社区...
  5. 数据库事务的隔离级别简单总结
  6. 关于物联网通信协议(通讯协议)
  7. busybox怎么安装
  8. 剑指 Offer 10- I. 斐波那契数列/剑指 Offer 10- II. 青蛙跳台阶问题
  9. ES6新语法 变量 、 服务器端js和浏览器端js的区别
  10. 一个项目工程的重构小结
  11. 女人让男人感到自卑的九个经典(摘于网络)
  12. 7-2 求最大值及其下标编程总结
  13. 对服务器端接口的调用,自己手写了一个脚本,但返回信息的中文总是乱码(这个方法很不错,重要的是解决思路,寻找手写脚本与录制脚本 生成目录文件的区别)...
  14. php 同义词词库,同义词搜索功能 - 权威指南 - 迅搜(xunsearch) - 开源免费中文全文搜索引擎...
  15. opencv 快速简单二值化的做法
  16. 有机酸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. android cts测试(编译源码获取cts测试包),如何通过Android CTS测试—testPackageSignatures...
  18. 学生信息管理系统(PHP)
  19. ElasticSearch的REST APIs 之 索引的别名(alias)管理
  20. 梯度消失/爆炸与RNN家族的介绍(LSTM GRU B-RNN Multi-RNNs)-基于cs224n的最全总结

热门文章

  1. 毕业10年,阻碍你职业发展的最大“拦路虎”到底是什么?
  2. 工信部同意中国互联网信息中心设立域名根服务器及运行机构
  3. ​30 岁了,依然一事无成
  4. 28 岁字节程序员退休,财务自由
  5. 那个即刻,他回来啦!
  6. python 日期减一天_怎么用Python在指定日期上减去7天?
  7. 深入浅出事件流处理NEsper(三)
  8. Environment.CommanLine返回的文件路径使用注意
  9. SQL Server 2005 分页SQL
  10. Mac电脑:Android Studio 连接 MUMU 网易模拟器