CSS3 Selector

每个前端工程师可能每天都会写一些css,其中选择器是很主要的一部分。但是,大家可能每天写的大多是#id,.class这样的选择器,这并不稀奇,但是如果我们了解并且熟用css3为我们提供的强大并且优雅的选择器,就可以简化我们的代码。

我在学习和整理css3的选择器的时候都不会去考虑它的浏览器的支持程度,如果有需要,可以在这里查看它的浏览器支持情况:「caniuse.com」。

文章目录:

一、基本选择器

 1. 通配选择器 「*」

1 *{margin: 0;padding: 0} //选择页面中的所有元素并设置margin和padding值为0
2 .demo *{background:#000} //选择类名为demo的元素下面的所有元素并设置背景为黑色

2.元素选择器 「Element」

1 body{background:#ccc} //选择body元素
2 ul{background:#fff} //选择列表ul元素

3.ID选择器 「#id」

1 html:
2 <div id="demo"></div>
3 css:
4 #demo{do something}

4.类选择器 「.class」

1  html:
2  <ul class="demo"></ul>
3  css:
4  .demo{do something}
5  ul.demo{do something} //这样只会选择有demo类名的ul元素

需要注意的是:多个页面元素可以有相同的类名,但是元素的id在页面中必须是唯一的。

5.群组选择器 「selector1,...,selectorN」

1 html:
2 <div class="section-1"></div>
3 <div class="section-2"></div>
4 <div class="section-3"></div>
5 ccss:
6 .section-1,.section-2,.section-3{do something} //给三个页面元素定义公用的样式 

二、层次选择器

6.后代选择器「E F」

选择匹配E的元素内的所有匹配F的元素。

 1 html:
 2 <div class="parent">
 3         <div class="child"></div>
 4         <div class="child">
 5              <div class="c-child">
 6                   <div class="c-c-child"></div>
 7             </div>
 8         </div>
 9 </div>
10
11 css:
12
13 .parent div{do something} //会选择parent里面的所有div,不管是子元素.child还是孙元素.c-child和.c-c-child         

7.子选择器「E > F」

选择配配E的元素的匹配F的直系子元素。

 1    html:
 2   <div class="parent">
 3           <div class="child"></div>
 4           <div class="child">
 5                <div class="c-child">
 6                     <div class="c-c-child"></div>
 7               </div>
 8           </div>
 9   </div>
10
11  css:
12  .parent > div{do something} //只会选择.parent元素的直系子元素,也就是只会选择到 .child元素

8.相邻兄弟元素选择器「E + F」

E和F是同辈元素,具有相同的父元素,并且F元素紧邻在E元素的后面,此时可以使用相邻兄弟选择器。

 1 html:
 2 <div>
 3     <div class="demo">1</div>
 4     <div>2</div>
 5     <div>3</div>
 6 </div>
 7
 8 css:
 9
10 .demo + div {do something}//会选中内容为2的div

9.通用兄弟选择器「E ~ F」

E和F是同辈元素,具有相同的父元素,并且F元素在E元素之后,E ~ F将选中E元素后面的所有F元素。

 1  html:
 2   <div>
 3       <div class="demo">1</div>
 4       <div>2</div>
 5       <div>3</div>
 6       <div>4</div>
 7   </div>
 8
 9   css:
10
11  .demo ~ div {do something}//会选中内容为2,3,4的div

三、伪类选择器

10.动态伪类选择器「E:link,E:visited,E:active,E:hover,E:focus」

1 E:link{do something} //选择定义了超链接但链接还未被访问过的元素
2 E:visited{do something} //选择定义了超链接并且链接已经被访问过的元素
3 E:active{do something} //选择匹配的E元素,且元素被激活,常用在锚点和按钮上
4 E:hover{do something} //选择鼠标停留的匹配的E元素
5 E:focus{do something} //选择匹配的E元素,且元素获得焦点

11.目标伪类选择器「E:target」

选择匹配E的所有元素,且匹配元素被相关URL指向。

通俗点说,页面的url如果带有#something这样的字样(https://rawgit.com/zhangmengxue/Practice/master/demo.html#section-1)那么:target就是用来匹配页面中id为#something(section-1)的元素的。

这里有一个demo,利用:target实现纯css的手风琴效果:[查看源码][运行demo]

12.语言伪类选择器「E:lang(language)」

用来选择指定了lang属性的元素,其值为language。

1 html:
2 <html lang="en-US"></html>
3
4 css:
5 :lang(en-US) {do something}

有时候网页切换不同的语言版本的时候,可以通过这个选择器做一些特殊的处理。

13.状态伪类选择器「E:checked,E:enabled,E:disabled」

1 E:checked{do something} //匹配表单中被选中的单选按钮或复选按钮
2 E:enabled{do something} //匹配所有起用的表单元素
3 E:disabled{do something} //匹配所有禁用的表单元素

14.结构伪类选择器「E:first-child,E:last-child,E:root,E:nth-child(n),E:nth-last-child(n),E:nth-of-type(n),E:nth-last-of-type(n),E:first-of-type,E:last-of-type,E:only-child,E:only-of-type,E:empty」

14.1 [E:first-child]

用来选取特定元素的第一个子元素。

 1 html:
 2 <ul>
 3     <li>1</li>
 4     <li>2</li>
 5     <li>3</li>
 6     <li>4</li>
 7     <li>5</li>
 8 </ul>
 9 css:
10
11 ul > li:first-child {do something} //用来选取ul中的第一个li元素

14.2 [E:last-child]

用来选取特定元素的最后一个子元素。

 1  html:
 2   <ul>
 3       <li>1</li>
 4       <li>2</li>
 5       <li>3</li>
 6       <li>4</li>
 7       <li>5</li>
 8   </ul>
 9   css:
10   ul > li:last-child {do something} //用来选取ul中的最后一个li元素

14.3 [E:nth-child()],[E:nth-last-child()]

用来选取某个父元素的一个或多个特定的子元素,其中的n可以是数值(从1开始),也可以是包含n的表达式,也可以是odd(奇数),even(偶数)。

E:nth-last-child()选择器的使用方法于E:nth-child()是相同的,不同的是E:nth-last-child()选择的元素是从父元素的最后一个子元素开始算起。

 1   html:
 2     <ul>
 3         <li>1</li>
 4         <li>2</li>
 5         <li>3</li>
 6         <li>4</li>
 7         <li>5</li>
 8     </ul>
 9   css:
10    ul > li:nth-child(2n+1) {do something} //用来选取ul中的第2n+1(奇数)个li元素

14.4  [E:root]

用来匹配元素E所在的文档中的根元素,在html文档中根元素就始终是html。

14.5 [E:nth-of-type(),E:nth-last-of-type()]

E:nth-of-type()只计算父元素中指定的某种类型的子元素,当某个元素的子元素类型不只是一种时,使用nth-of-type来选择会比较有用。

E:nth-last-of-type()的用法同E:nth-of-type()相同,不同的是:nth-last-of-type()也是从父元素的最后一个子元素开始算起。

li:nth-of-type(3)的话就会标识它只会选择第三个li元素,别的元素会忽略掉,如:

 1 html:
 2 <ul>
 3     <li>1</li>
 4     <li>2</li>
 5     <div>3</div>
 6     <div>4</div>
 7     <li>5</li>
 8     <li>6</li>
 9     <li>7</li>
10     <li>8</li>
11 </ul>
12
13 ul > li:nth-of-type(3){do something} //会选中内容为5的li元素 

但是使用nth-child就会是这样:

 1 html:
 2 <ul>
 3     <li>1</li>
 4     <li>2</li>
 5     <div>3</div>
 6     <div>4</div>
 7     <li>5</li>
 8     <li>6</li>
 9     <li>7</li>
10     <li>8</li>
11 </ul>
12
13 ul > li:nth-child(3){do something} //会选中内容为3的div元素

14.6 [E:first-of-type,E:last-of-type]

:first-of-type和:last-of-type这两个选择器类似于:first-child和:last-child,不同的就是指定了元素的类型。

 1  html:
 2   <ul>
 3       <div>1</div>
 4       <div>2</div>
 5       <li>3</li>
 6       <li>4</li>
 7       <li>5</li>
 8       <li>6</li>
 9  </ul>
10  CSS:
11  ul > li:first-of-type{do something} //会选中内容为3的li元素

14.7 [E:only-child]

匹配的元素E是其父元素的唯一子元素,也就是说匹配元素的父元素只有一个子元素。

 1 html:
 2 <div class="demo">
 3    <p>1-1</p>
 4    <p>1-2</p>
 5 </div>
 6 <div class="demo">
 7    <p>2-1</p>
 8 </div>
 9
10 css:
11 .demo > p:only-child{do something}//会选取到内容为2-1的p元素

14.8 [E:only-of-type]

:only-of-type用来选择一个元素,他的类型在他父元素的所有子元素中是唯一的。也就是说,一个父元素有很多子元素,而其中只有一个子元素的类型是唯一的,那么就可以使用:only-of-type来选取这个元素。

这个属性说起来有点绕口,写了个简陋的demo说明意思:[查看源码][运行demo]

14.9 [E:empty]

:empty用来选择没有任何内容的元素,哪怕是一个空格都没有的元素。

15 否定伪类选择器「E:not(F)」

可以用来选取所有除了F外的所有元素。

1 input:not([type=submit]){do something} //可以用来给表单的所有input元素定义样式,除了submit按钮之外

四、伪元素

以前我们使用的伪元素是:first-letter,:first-line,:before,:after,这样的。但css3定义的伪元素变成了双冒号,主要用来区分伪类和伪元素。对于IE6-8,仅支持单冒号表示方法,但是其他现代浏览器两种表示方法是都可以的,也就是说在现代浏览器中伪元素使用双冒号和单冒号都是会识别的。

16. 「::first-letter」

::first-letter用来选择文本块的第一个字母,常用于文本排版方面。

1  html:
2  <div>
3      <p>this is test line.....</p>
4  </div>
5
6 css:
7
8 div p::first-letter{do something} //将会选中<p>中的第一个字母t

17. 「::first-line」

::first-line用于匹配元素的第一行文本,也是常用于文本排版。

 1  html:
 2   <div>
 3       <p>
 4          this is first line..........省略.......
 5          this is the second line ...省略....
 6      </p>
 7   </div>
 8
 9  css:
10
11  div p::first-line{do something} //将会选中<p>中的第一行文字

18. 「::before,::after」

::before,::after同我们之前熟用的:before和:after使用方法相同,它们不是指存于标记中的内容,是配合使用content属性可以插入额外内容的位置,尽管生成的内容不会成为DOM的一部分,但它同样可以设置样式。

19. 「::selection」

css3新定义的伪元素::selection用来匹配突出显示的文本。但是使用前需要确认浏览器对它的支持程度。

浏览器默认的情况下,我们选中的文本背景是蓝色,字体是白色。通过使用::selection,我们可以改变它的效果。

1 ::selection{background:#ccc;color:red} //这样改写后我们选中的文本背景颜色和文字颜色就可以自定义了

但是需要注意的是,::selection仅接受两个属性,一个是background,一个是color。

五、属性选择器

在html中,通过给元素添加属性,给以给元素添加一些附加的信息,属性选择器就可以通过定位属性来选取特定的元素。

20. 「 E[attr] 」

用来选择有某个属性的元素,不论这个属性的值是什么。

1 html:
2 <div id="demo">
3   <a href="" id="test"></a>
4   <a href="www.taobao.com" class="taobao"></a>
5   <a href="#"  id="show">
6 </div>
7 css:
8 a[id]{do something} //将会选择具有id属性的a标签

21. 「 E[attr=val] 」

用来选取具有属性attr并且属性值为val的元素。

1  html:
2  <div id="demo">
3    <a href="" id="test" title="test"></a>
4    <a href="www.taobao.com" class="taobao"></a>
5    <a href="#"  id="show" title="test">
6 </div>
7  css:
8  a[id=test][title]{do something} //将会选择具有id属性值为test且具有title属性的a标签

22. 「 E[attr|=val] 」

E[attr|=val]用来选择具有属性attr且属性的值为val或以val-开头的元素(其中-是不可或缺的)。

1  html:
2   <div id="demo">
3     <a href="" id="test" title="test" lang="zh"></a>
4     <a href="www.taobao.com" class="taobao" lang="zh-cn"></a>
5     <a href="#"  id="show" title="test">
6  </div>
7  css:
8   a[lang|=zh]{do something} //将会选择具有lang属性值为zh或属性值以zh开头的a标签

23. 「 E[attr~=val] 」

当某个元素的某个属性具有多个用空格隔开的属性值,此时使用E[attr~=val]只要attr属性多个属性值中有一个于val匹配元素就会被选中。

1  html:
2   <div id="demo">
3     <a href="" id="test" title="test first"></a>
4     <a href="www.taobao.com" class="taobao web" title="second test"></a>
5     <a href="#"  id="show" title="test">
6  </div>
7   css:
8   a[title~=test]{do something} //将会选择具有title属性且其中一个属性值为test的a标签

24. 「 E[attr*=val] 」

这个属性选择器使用了通配符,用来选择具有属性attr并且只要属性值中包含val字符串的元素。也就是说只要所选属性中有val字符串,不管是不是多个用空格分隔的属性值,都将被选中。

1  html:
2     <div id="demo">
3       <a href="" id="test" title="test first"></a>
4       <a href="www.taobao.com" class="taobao web" title="secondtest"></a>
5       <a href="#"  id="show" title="testlink">
6    </div>
7   css:
8     a[title*=test]{do something} //将会选择具有title属性且其属性值包含test字符串的a标签

25. 「 E[attr^=val] 」

用来选择属性attr的属性值是以val开头的所有元素,注意它与E[attr|=val]的区别,attr|=val中-是必不可少的,也就是说以val-开头。

1  html:
2      <div id="demo">
3        <a href="http://zhangmengxue.com" id="test" title="test first"></a>
4        <a href="www.taobao.com" class="taobao web" title="secondtest"></a>
5        <a href="#"  id="show" title="testlink">
6     </div>
7   css:
8      a[href^=http]{do something} //将会选择href属性以http开头的a标签

26. 「 E[attr$=val] 」

这个选择器刚好跟E[attr^=val]相反,用来选择具有attr属性且属性值以val结尾的元素。

1  html:
2      <div id="demo">
3         <a href="http://zhangmengxue.com/header.png" id="test" title="test first"></a>
4         <a href="www.taobao.com/title.jpg" class="taobao web" title="secondtest"></a>
5         <a href="#"  id="show" title="testlink">
6      </div>
7  css:
8       a[href$=png]{do something} //将会选择href属性以png结尾的a标签

时间: 2024-10-20 00:27:12

CSS3 Selector的相关文章

Selenium - CSS Selector

昨天我练习了用CSS(即层叠样式表Cascading Stylesheet) Selector来定位(locate)页面上的元素(Elements).Selenium官网的Document里极力推荐使用CSS locator,而不是XPath来定位元素,原因是CSS locator比XPath locator速度快,特别是在IE下面(IE没有自己的XPath 解析器(Parser)).有很多跟Selenium相关的Blog文章都有提到使用CSS Selector的技术.之前我不会CSS Sele

CSS3中的伪类选择器详解

  类选择器和伪类选择器区别 类选择器我们可以随意起名,而伪类选择器是CSS中已经定义好的选择器,不可以随意起名. 伪类选择器以及伪元素 我们把它放到这里 p.aaas{ text-align: left; color: red; } 它同样的会被选择 最常见的伪类选择器 未被访问的链接 a:link{ color: #ff6600 } /* 未被访问的链接 */ 我们来测试一下,我们给它添加一个超链接. 伪类选择器 我们给这个伪类选择器,选定样式,第一种 a:link{ color: #000

CSS3选择器:enabled 和 disabled

代码: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>CSS3 Selector</title> <style> input[type="text"]:enabled{ background-color: yellow; } input[type="text"]:disabled{ backg

phpQuery—基于jQuery的PHP实现(转)

Query的选择器之强大是有目共睹的,phpQuery 让php也拥有了这样的能力,它就相当于服务端的jQuery. 先来看看官方简介: phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library. Library is written in PHP5 and provides additional Com

网页采集利器 phpQuery

网页采集利器 phpQuery 2012-02-28 11:43:24|  分类: php|举报|字号 订阅 在网页采集的时候,通常都会用到正则表达式.但是有时候对于正则不太好的同学,比如我,那就杯具了..如今google的项目里有个phpQuery , 顾名思义query,完全类似于jquery的语法,但这是服务器端的,总体来说就是可以用php来直接采集对应的网页内容了,真的是太方便了,  它让一切变得可能...... phpQuery is a server-side, chainable,

【转载】Data Science at the Command Line

Data Science at the Command Line Data Science at the Command Line is a new book written by Jeroen Janssens. This website contains information about the upcoming workshop in London, the webcast from August 20th, instructions on how to install the Data

AdBlock广告拦截插件的实现原理

在这里,我不会解释太多的代码,没有必要,说说原理就可以了. AdBlock的广告拦截实际上分为2个部分: 1.对于URL请求的拦截 这一般都是页面中DIV元素嵌入一个IFRMAE/IMAGE元素,然后加载一个广告链接或者GIF图片什么的. 这部分的规则库描述比较复杂.规则大概有几万条,即使对于国内的使用,可能也会有个1000条左右. 不过我觉得没必要搞这么复杂,可以通过提取出最常见的100条,然后用这100条屏蔽80%的请求,就可以了. 这些规则的语法,基本上是对于URL中domain和path

phpQuery—基于jQuery的PHP实现

Query的选择器之强大是有目共睹的,phpQuery 让php也拥有了这样的能力,它就相当于服务端的jQuery. 先来看看官方简介: phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library. Library is written in PHP5 and provides additional Com

[译文]casperjs 的API-casper模块

Casper class: 可以通过这个模块的create()方法来获取这个模块的一个实例,这是最容易的: var casper = require('casper').create(); 我们也可以通过实例化主方法的方式获得一个自身的实例: var casper = new require('casper').Casper(); 提示: 如果扩展casper类,后面的章节会讲到   不管是casper构造函数还是create()方法,都接受一个参数选项,这个标准的javascript对象一样.