chaojidan

导航

第十课:CSS选择器的介绍和区分

IE7以及以下版本:

getElementById是不区分表单元素ID与Name的,因此如果有一个表单元素只定义name,并与我们的目标元素ID同名,并且我们的目标元素在它的后面,那么就会选择到那个表单元素。所以一般在定义表单元素时,都会定义跟name一样的id,就是以防其他元素的id跟表单元素的name一样(文档中的id都是唯一的)。

getElementsByTagName,当参数为"*"通配符时,它会混入注释节点,并且无法选取Object下的元素。

 

属性选择器:

[attr ~= val]  会选择这样的元素:它有属性attr,并且属性的值里面有val。比如:attr = val,attr = val1 val,等都会选择上,一般应用在class属性上。

举例:

如果需要根据属性值中的词列表的某个词进行选择,则需要使用波浪号(~)。

假设您想选择 class 属性中包含 important 的元素,可以用下面这个选择器做到这一点:

p[class~="important"] {color: red;}

如果忽略了波浪号,则说明需要完成完全值匹配。

部分值属性选择器与点号类名记法的区别

该选择器等价于我们在类选择器中讨论过的点号类名记法。

也就是说,p.important 和 p[class="important"] 应用到 HTML 文档时是等价的。

那么,为什么还要有 "~=" 属性选择器呢?因为它能用于任何属性,而不只是 class。

例如,可以有一个包含大量图像的文档,其中只有一部分是图片。对此,可以使用一个基于 title 文档的部分属性选择器,只选择这些图片:

img[title~="Figure"] {border: 1px solid gray;}

这个规则会选择 title 文本包含 "Figure" 的所有图像。没有 title 属性或者 title 属性中不包含 "Figure" 的图像都不会匹配。

[attr |= val]  会选择这样的元素:它有属性attr,并且属性的值是val或者以"val-"开头。

举例:

*[lang|="en"] {color: red;}

上面这个规则会选择 lang 属性等于 en 或以 en- 开头的所有元素。因此,以下示例标记中的前三个元素将被选中,而不会选择后两个元素:

<p lang="en">Hello!</p>
<p lang="en-us">Greetings!</p>
<p lang="en-au">G'day!</p>
<p lang="fr">Bonjour!</p>
<p lang="cy-en">Jrooana!</p>

一般来说,[att|="val"] 可以用于任何属性及其值。

假设一个 HTML 文档中有一系列图片,其中每个图片的文件名都形如 figure-1.jpg 和 figure-2.jpg。就可以使用以下选择器匹配所有这些图像:

img[src|="figure"] {border: 1px solid gray;}

当然,这种属性选择器最常见的用途还是匹配语言值。

[attr *= val]  会选择这样的元素:它有属性attr,并且属性的值包含val字样。比如:attr = val,attr= val1 val,attr = chaojidanval等都会选择上。

 

关系选择器:

E+F  选择E元素后面的F元素(同级的,并且紧挨着E)。

举例:

如果需要选择紧接在另一个元素后的元素,而且二者有相同的父元素,可以使用相邻兄弟选择器(Adjacent sibling selector)。

例如,如果要增加紧接在 h1 元素后出现的段落的上边距,可以这样写:

h1 + p {margin-top:50px;}

这个选择器读作:“选择紧接在 h1 元素后出现的段落,h1 和 p 元素拥有共同的父元素”。

E~F  选择E元素后面的所有F元素(同级的)。

 

伪类选择器:

:link,在IE8-IE10,取:link存在错误,它只能取A标签,而实际上:link指代A,AREA,LINK三种标签,其他浏览器没问题。

我们还可以通过document.links取链接元素,但是它不包含LINK标签。

另外,除了Opera,Safari外,其他浏览器取:focus正常。除了Opera,其他浏览器取:hover正确。

:lang语言伪类。lang虽然是DOM元素的一个属性,但:lang伪类与属性选择器有所不同,举个列子:

<body  lang="de"><p>dddd</p></body>

如果使用[lang=de],则只能选择body 元素。但是使用:lang(de),则可以同时选择到body和p元素。

:root伪类    选择根元素,在HTML文档中通常是html元素。

:nth-child    匹配属于其父元素的第 N 个子元素,不论元素的类型。如果传入n,n是从0开始的。但是选取元素时,元素的计数是从1开始的。

比如:

:nth-child(n)  ,n从0开始,但是0元素没有,所以实际上还是从1开始,相当于   :nth-child(n+1)

:nth-child(2)   ,选择的就是父元素的第二个子元素,第一个元素用 :nth-child(1) 选择。:nth-child(0)不选择任何元素 。

如果前面加了p:nth-child(2) ,选择的是父元素的第二个子元素,而且这个子元素必须是p时,才会选中。

 

:nth-of-type  选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素.

比如:

:nth-of-type(2)   会选择特定类型的第2个子元素。

它跟:nth-child的区别就是,nth-of-type不仅针对的是子元素而且是特定类型(会根据子元素的tagName分类,每一类再调用nth-child)的子元素,而nth-child只是针对子元素。

举个例子:

<h1>这是标题</h1>
<p>第一个段落。</p>
<p>第二个段落。</p>
<p>第三个段落。</p>
<p>第四个段落。</p>
<p>第五个段落。</p>

p:nth-child(odd)           
{
  background:#ff0000;       
}
p:nth-child(even)
{
  background:#0000ff;
}

针对上面的html,由于p元素上面有h1,因此h1是第一项,第一个段落是第二项。这样就会:

这是标题      p:nth-child(odd)       :nth-child(odd) 选择上了,但因为不是p元素,所以没选择上。

第一个段落。    p:nth-child(even)      蓝色

第二个段落。    p:nth-child(odd)       红色

第三个段落。    p:nth-child(even)  蓝色

第四个段落。    p:nth-child(odd)       红色

第五个段落。    p:nth-child(even)  蓝色

但使用

p:nth-of-type(odd)
{
  background:#ff0000;
}
p:nth-of-type(even)
{
  background:#0000ff;
}

结果:

这是标题      h1:nth-of-type(odd)      :nth-of-type(odd)  选择上了,但是不是p元素,所以没选择上。

第一个段落。    p:nth-of-type(odd)      红色

第二个段落。    p:nth-of-type(even)     蓝色

第三个段落。    p:nth-of-type(odd)  红色

第四个段落。    p:nth-of-type(even)     蓝色

第五个段落。    p:nth-of-type(odd)  红色

 

 

 

加油!

posted on 2014-12-02 15:59  chaojidan  阅读(953)  评论(0编辑  收藏  举报