1.伪元素和伪类的区别

在 CSS3 中为了区别伪元素和伪类为伪元素使用了双冒号,如 ::before为伪元素 ; :hover为伪类;
由于IE8只支持单冒号的格式,安全起见如果你想要更广泛的浏览器兼容性那么还是使用单冒号的格式吧!
伪类可以独立于文档的元素来分配样式,且可以分配给任何元素,逻辑上和功能上类类似,但是其是预定义的、不存在于文档树中且表达方式也不同,所以叫伪类。
伪元素所控制的内容和一个元素控制的内容一样,但是伪元素不存在于文档树中,不是真正的元素,所以叫伪元素。
伪类有::first-child ,:link:,vistited,:hover:,active:focus,:lang
伪元素有::first-line,:first-letter,:before,:after,::selection

2.伪元素基本语法

仅仅需要将这两个伪元素用于添加一些自定义字符时,只需使用伪类使用的单冒号写法,以保证浏览器的兼容性:

尽管作为“虚假”的元素,事实上伪元素表现上就像是“真正”的元素,我们能够给它们添加任何样式,比如改变它们的颜色、添加背景色、调整字体大小、调整它们中的文本等等。

示例:利用伪类实现列表箭头

  1. a::after { content: "›"; font-size54rpx; }
  2. .navigator-arrow::after {
  3. content: " ";
  4. display: inline-block;
  5. height: 18rpx;
  6. width: 18rpx;
  7. border-width: 3rpx 3rpx 0 0;
  8. border-color: #cdcdcd;
  9. border-style: solid;
  10. transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);
  11. position: absolute;
  12. top: 50%;
  13. margin-top: -8rpx;
  14. right: 15rpx;
  15. }

S90914-10225496.png

content用法

伪元素的特有属性content,可以包含文字,图片,调用属性,调用计数器等。

1、content : “string”

可以在节点之前插入文字

  1. div::before{ content: '*'; }

2、content : attr(attrName);

利用 伪类 的 content 属性 attr 抓取内容

比如:可以在节点之前插入属性data-name的值 value

  1. <div class="demo" data-name="helloworld"></div>
  1. div::before{ content: attr(data-name); }

比如:鼠标悬浮实现一个提示的文字

  1. <div data-msg="Open this file in Github Desktop"> hover</div>
  1. div{width:100px;border:1px solid red; position:relative;}
  2. div:hover::after{
  3. content:attr(data-msg);
  4. position:absolute;
  5. font-size: 12px;
  6. width:200%;
  7. line-height:30px;
  8. text-align:center;
  9. left:0;top:25px;
  10. border:1px solid green;
  11. }

3、content:url();

插入媒体文件,如图片

  1. div::before{ content: url(/images/logo.png); }

3.伪类的基本用法

伪元素和伪类 - 图2

1、利用 :valid 和 :invalid 来做表单即时校验

html5 丰富了表单元素,提供了类似 required,email,tel 等表单元素属性。同样的,我们可以利用 :valid 和 :invalid 来做针对html5表单属性的校验。
:valid 伪类指定一个通过匹配正确的所要求的表单元素
:invalid 伪类指定一个不匹配指定要求的表单元素

  1. <div class="container">
  2. <div class="row" style="margin-top: 2rem;">
  3. <form>
  4. <div class="form-group">
  5. <label>name</label> <input type="text" required placeholder="请输入名称">
  6. </div>
  7. <div class="form-group">
  8. <label>email</label> <input type="email" required placeholder="请输入邮箱">
  9. </div>
  10. <div class="form-group">
  11. <label>homepage</label> <input type="url" placeholder="请输入博客url">
  12. </div>
  13. <div class="form-group">
  14. <label>Comments</label> <textarea required></textarea>
  15. </div>
  16. </form>
  17. </div>
  18. </div>
  1. .valid { border-color: #429032; box-shadow: inset 5px 0 0 #429032;}
  2. .invalid { border-color: #D61D1D; box-shadow: inset 5px 0 0 #D61D1D;}
  3. .form-group { width: 32rem; padding: 1rem; border: 1px solid transparent;
  4. &:hover { border-color: #eee; transition: border .2s; }
  5. label { display: block; font-weight: normal; }
  6. input, textarea { display: block; width: 100%; line-height: 2rem;
  7. padding: .5rem .5rem .5rem 1rem; border: 1px solid #ccc; outline: none;
  8. &:valid { @extend .valid; } &:invalid { @extend .invalid; } }}

http://blog.dimpurr.com/css-before-after/

2、:not()

:not表示不包含; :not伪类选择器表示不为括号中的指定元素应用样式,语法 :not(selector) 其中的selector为css选择器

demo: 为列表项设置下边框,但不包含最后一个li

  1. ul.nav li:not(:last-child) {
  2. border-bottom: 1px solid #666;
  3. }
  1. p:first-of-type 选择属于其父元素的首个元素
  2. p:last-of-type 选择属于其父元素的最后元素
  3. p:only-of-type 选择属于其父元素唯一的元素
  4. p:only-child 选择属于其父元素的唯一子元素
  5. p:nth-child(2) 选择属于其父元素的第二个子元素
  6. :enabled :disabled 表单控件的禁用状态。
  7. :checked 单选框或复选框被选中。

4.伪元素伪类汇总整理

::after

::before

::backdrop

::content

::cue

::cue()

::cue-region

::cue-region()

::first-letter

::first-line

::grammar-error

::placeholder

::selection 选择器匹配被用户选取的部分

::shadow

::spelling-error

:active

:any-link

:checked

:corner-present

:decrement

:default

:define

:dir

:disabled

:double-button

:empty

:enabled

:end

:first

:first-child

:first-of-type

:focus

:focus-visible

:focus-within

:fullscreen

:future

:horizontal

:host

:host()

:host-context()

:hover

:in-range

:increment

:indeterminate

:invalid

:lang()

:last-child

:last-of-type

:left

:link

:matches()

:no-button

:not()

:nth-child()

:nth-last-child()

:nth-last-of-type()

:nth-of-type()

:only-child

:only-of-type

:optional

:out-of-range

:past

:placeholder-shown

:read-only

:read-write

:required

:right

:root

:scope

:single-button

:start

:target

:valid

:vertical

:visited

:window-inactive