本文首发于个人博客css
在前面两篇文章《你不知道的CSS(一)》和《你不知道的CSS(二)》中大体介绍了一些CSS方面比较隐晦的但又很实用的技巧。相信这些技巧会为你们在项目实践中带来必定的帮助,本文做为《你不知道的CSS》系列的第三篇文章,将继续在CSS技巧方面进行探讨,不一样于前两篇的是,本文将着重介绍CSS中伪类和伪元素在项目中的应用场景。伪类相信你们最熟悉也是用的最多的莫过于:hover
, :active
, :focus
之类的,由于这些在日常的项目中太经常使用了(然而我目前依然见过还有用js去添加.hover
类来变化背景色的同窗?)。而伪元素如:before
, :after
相信你们也用的烂熟了。 固然对于比较常见的伪类(元素)不在本文的讨论范围类,本文主要介绍一些生僻的可是又很是实用的伪类(元素)。html
CSS的世界已经变天了,抛开过去,拥抱变化吧~html5
伪类和伪元素是一个比较容易混淆的概念,这不只仅是从名称上,并且在写法上也是类似的(目前由于兼容性的问题,它们的写法是一致的)。这就更容易混淆了?。但仍是但愿你们在书写的过程当中养成习惯,至于兼容性交给postcss等转换工具去实现。css3
css3 明确规定了伪类用一个冒号
:
来表示,而伪元素则用两个冒号::
来表示。git
:hover
,或者说是一个可使用CSS进行修饰的特定的特殊元素,如:first-child
:
常见伪类:github
:hover
:active
:focus
:visited
:link
:lang
:first-child
:last-child
:not
:before
::
常见伪元素:web
::before
::after
::first-letter
::first-line
:valid
和:invalid
来作表单即时校验html5丰富了表单元素,提供了相似required
,email
,tel
等表单元素属性。一样的,咱们能够利用:valid
和:invalid
来作针对html5表单属性的校验。浏览器
:required
伪类指定具备required 属性的表单元素:valid
伪类指定一个经过匹配正确的所要求的表单元素:invalid
伪类指定一个不匹配指定要求的表单元素有没有最开始学angular
的感受?,快点直戳demo感觉下吧工具
.valid { border-color: #429032; box-shadow: inset 5px 0 0 #429032; } .invalid { border-color: #D61D1D; box-shadow: inset 5px 0 0 #D61D1D; } .required { border-color: #056B9B; box-shadow: inset 5px 0 0 #056B9B; } input, textarea { &:valid { @extend .valid; } &:invalid { @extend .invalid; } &:required { @extend .required; } }
:target
来实现折叠面板
:target
是文档的内部连接,即URL
后面跟有锚名称 #,指向文档内某个具体的元素。post
利用 :target
的特性能够实现之前只能使用JavaScript实现的显示隐藏或者Collapse
折叠面板。
.collapse { >.collapse-body { display: none; &:target { display: block; } } }
:not
来排除其余选择器:not
表示的是一个非/不是
的概念。我在项目mo-css上用到过不少次,尤为是在表单类中,我用它来设置表单元素在readonly
和 disabled
状态以外的hover
等状态,以便于当元素在readonly
和 disabled
时,元素不具备hover
状态。
@mixin buttonStyle ($border, $background, $color, $hoverBorder, $hoverBackground, $hoverColor) { color: $color; border-color: $border; background-color: $background; &:not(.readonly):not([readonly]):not(.disabled):not([disabled]) { &:hover, &:active { color: $hoverColor; border-color: $hoverBorder; background-color: $hoverBackground; } } }
:nth-child(even/odd)
来实现隔行变色:nth-child
等伪类的参数大可能是一个数值或者数学表达式2n+1
,而even
做为参数用来表示偶数
,odd
做为参数用来表示奇数
的相似于别骂的特性每每被忽略。
ul { &.odd { >li:nth-child(odd) { background: red; } } &.even { >li:nth-child(even) { background: green; } } }
::selection
来美化选中文本就像你用鼠标选中这段话看到的那样,::selection
用来设置选中文本的样式,从而改变浏览器一成不变的文本选中色(蓝色)。
::selection{ color: #fff; background-color: #6bc30d; }
::placeholder
来美化占位符::placeholder
用来修饰input/textarea
等表单元素placeholder
属性的样式。
<input type="text" placeholder="我是自定义的placeholder" />
@mixin placeholder { &::-webkit-input-placeholder { @content } &::-moz-placeholder { @content } &:-ms-input-placeholder { @content } } input, textarea { @include placeholder { color: #f00; } } //css input::-webkit-input-placeholder{ color: #f00; } input::-moz-placeholder{ color: #f00; } input:-ms-input-placeholder{ color: #f00; }
::first-letter
来实现段落首字下沉首字下沉 : 设置段落的第一行第一字字体变大,而且向下必定的距离,与后面的段落对齐,段落的其它部分保持原样
就像图中展现的那样,以前实现相似效果,咱们须要多加一个标签,如:
<p> <b>前</b> ... </p>
然而,如今只须要一个CSS伪元素就能够实现。
first-letter
伪元素用于向文本的首字母设置特殊样式
p::first-letter{ font-size: 6em; line-height: 1; float: left; }
::first-line
来特殊标记段落第一行就如它的名字同样,这个伪元素表明了段落的第一行,你可使用任意样式来控制它。
p::first-line{ color: red }
CSS的伪类和伪元素还有不少,由于或兼容性或其余缘由,文章中介绍的几种伪类/元素用的比较少,这不得不说是一种遗憾。但,为了保证项目的健康和可持续化,必定要注意伪类和伪元素的区别,尽量的在写伪类的时候使用一个冒号:
,而在写伪元素的时候用两个冒号::
,就像使用autoprefixer
来生成浏览器前缀同样,将:
和::
的转换交给postcss
等工具去作。
本文首发于个人博客