三、 CSS选择器
在CSS语法部分,我们已经了解CSS规则由 选择器
和 声明
组成。如下所示:
选择器
就是{ }之前的部分,它指明了{ }中的声明的作用对象,也就是声明作用于网页中的哪些元素。在CSS(主要是CSS2、CSS2.1,部分CSS3)中,选择器主要有以下: 元素选择器
、通配选择器
、类选择器
、ID选择器
、多类选择器
、属性选择器
、派生选择器
、伪类选择器
、伪元素选择器
。
3.1 元素选择器
最常见的 CSS 选择器是元素选择器。换句话说,文档的元素就是最基本的选择器。如果设置 HTML 的样式,选择器通常将是某个 HTML 元素,比如 p、h1、em、a,甚至可以是 html 本身:
说明:
关于 元素选择器 和 标签选择器 ,这两个概念其实是一样的。在《CSS权威指南》这本书中讲到选择器时提到的是 “元素选择器” ;而在其他的资料中,讲到选择器,提到的是 “标签选择器” 。这是因为,CSS 依赖于元素,规则作用于元素,所以 CSS 中习惯称为 “元素选择器” 。而 CSS 样式作用的元素通常就是 HTML 文档的标签,所以,”元素选择器” 也常被称为 “标签选择器” 。
3.2 通配选择器
CSS2引入了一种新的简单的选择器,叫做通配选择器,显示为一个星号 (∗) 。通配选择器可以与任何元素匹配,就像是一个通配符,通配选择器后的声明将应用于文档中的所有元素。例如,下面的这条规则是将文档中的每一个元素都设置为红色:
注意:
考虑到通配选择器的特殊性,在使用的时候,我们要小心。
3.3 类选择器
区别与元素选择器,类选择器的使用不需要考虑具体涉及的元素,使用的时候只需要为那些要应用样式的元素的class属性指定一个恰当的值,这样,这些元素就会被归类到一起,之后要做的,就是为这些归类的元素应用样式。其语法是 .类选择器名称 {CSS代码;}
,如下所示,是为所有类名为 important 的元素设置了字体为红色、加粗:
上面的写法是常用的书写方式,类选择器忽略了通配选择器,完整的写法应该是:
例如,如果有以下的元素,其class属性指定为important,那么,他们都会应用上述的CSS样式。
3.4 多类选择器
类选择器应用于元素的class属性值为单个词的情况,而在HTML中,元素的class值可能会被设定为多个词组成的一个词列表,每个词之间用空格分隔。例如,如果希望将一个特定的元素同时标记为重要(important)和强调(stress),就可以写作:
提示:
需要注意的是,这两个词:重要(important)和强调(stress)的顺序无关紧要,写成 stress important 也可以。
下面我们举个例子来详细的说明多类选择器的使用:假设class属性为important的类,其所有的元素都是红色、粗体;而class属性为warning的类,其所有的元素都是斜体、下划线;class属性同时设置为important和warning的类,其背景为银色。具体的表现如下所示:
提示:
通过把两个类选择器链接在一起,仅可以应用到同时包含这些类名的元素(类名的顺序不限)。
也就是说,如上面的代码中那样,将important和stress两个选择器链接在一起,形成多类选择器 .important.stress {background: silver;}
,则只有某个元素的class属性的值 同时 包含important和stress时,多类选择器中的样式才会被应用。
注意:
- 如果一个多类选择器包含类名列表中没有的一个类名,匹配就会失败。就像下面的这种情况:
123 p.important.stress {background: silver;}
上面的选择器将只匹配class属性同时包含 important 和 stress 的那些p元素。因此,如果一个p元素的 class 属性是 important 和 warning,将不能匹配。
- 匹配的条件 同时包含 是指多类选择器中的多个类要被某一个要应用样式的元素的class属性同时包含。比如,元素要应用
.important.stress {background: silver;}
,则其class属性的值至少要包含 important 和 stress。如下所示的元素也能匹配.important.stress {background: silver;}
多类选择器中的样式:123<p class="important stress warning">According to the weather forecast, there will be a storm tomorrow.</p>
3.5 ID选择器
ID选择器和类选择器很类似,他们有着以下的差别:
- ID选择器前面有一个#号 ——— 也称为棋盘号而不是点号。如下所示,这个规则会让id属性为font的所有元素显示为粗体、sans-serif 字体的文本:1234*#font {font-weight: bold;font-family: sans-serif;}
说明:
与类选择器一样,ID选择器中的通配选择器通常是被忽略的,所以通常的写法都如下所示:
1234 #font {font-weight: bold;font-family: sans-serif;}
- ID选择器不引用class属性的值,对比于类选择器,毫无疑问,它要引用id属性中的值。如下所示:12345678910111213141516<html><head><meta http-equiv="content-type" content="text/html" charset="utf-8"><title>ID选择器示例</title><style type="text/css">#font {font-weight: bold;}</style></head><body><h1 id="font">My maxim</h1><p>Ba all you can be!</p></body></html>
类选择器和ID选择器的区别:
- 相同点:可以应用到任何元素。
不同点:
- 在一个HTML文档中,ID选择器仅允许使用一次;而类选择器可以使用多次。
- ID选择器不能结合使用,因为ID属性不允许有以空格分隔的词列表;而类选择器class属性可以通过词列表为一个元素同时设置多个样式。
- ID能包含更多含义。有些情况下,您知道文档中会出现某个特定 ID 值,但是并不知道它会出现在哪个元素上,所以您想声明独立的 ID 选择器。例如,您可能知道在一个给定的文档中会有一个 ID 值为 mostImportant 的元素。您不知道这个最重要的东西是一个段落、一个短语、一个列表项还是一个小节标题。您只知道每个文档都会有这么一个最重要的内容,它可能在任何元素中,而且只能出现一个。在这种情况下,可以编写如下规则:1234#mostImportant {color:red;background:yellow;}
注意:
类选择器和ID选择器可能是区分大小写的,这取决于文档语言。HTML和XHTML将类和ID值定义为区分大小写,所以类和ID的大小写必须与文档中的相应值匹配。因此,下面元素中的元素h1不会变成粗体:12345678910111213141516<html><head><meta http-equiv="content-type" content="text/html" charset="utf-8"><title>ID选择器示例</title><style type="text/css">#font {font-weight: bold;}</style></head><body><h1 id="Font">My maxim</h1><p>Ba all you can be!</p></body></html>
由于字母 f 的大小写不同,所以选择器不会匹配上面的元素。
3.6 属性选择器
对于类选择器和ID选择器,在使用的时候,我们只是设置适当的属性值。因为,这些属性是某些标记语言(例如HTML、SVG、MathML)的元素本来就具备的。可能在其他标记语言中,这些类和ID选择器就不能使用了。所以,CSS2引入属性选择器,这样,我们就可以通过自定义元素属性并为其设置值来选择元素,而不仅限于class 和 id 属性。CSS 共有4种类型的属性选择器,分别是 简单属性选择器
、具体属性选择器
、部分属性选择器
、特定属性选择器
。
3.6.1 根据简单属性选择
如果只考虑选择有某个属性的元素,而不论该属性的值是什么,可以使用简单选择器。例如,要选择有title属性(值不限)的所有p元素,可以写作:
根据简单属性选择的例子还有很多,例如可以只对有href属性的锚(a元素)应用样式:
此外,还可以根据多个属性进行选择,只需将属性选择器链接在一起即可。例如,为了将同时有 href 和 title 属性的 HTML 超链接的文本设为粗体,可以这样写:
还可以采用一些创造性的方法使用这个特性。例如,可以对所有带 alt 属性的图像应用某种样式,从而判断图像是否有效:
3.6.2 根据具体属性值选择
相比于简单选择器的对象是某些属性整体,具体属性选择器进一步缩小选择范围,只选择有特定属性值的元素,使得元素的选择更加具体。例如,上面的例子我们针对所有带 alt 属性的图像应用了某种样式,现在我们具体到只对 alt="动漫"
的图片应用样式,判断这类的图像是否有效:
同样,跟简单属性选择器一样,我们可以把多个属性-值选择器链接在一起来选择一个文档。例如,为了将 title="音乐"
且 href="http://music.163.com/"
的所以 HTML 超链接的文本加粗并设为红色,可以这样写:
注意:
在使用具体属性选择器时,一定要注意 属性与属性值必须完全匹配 。尤其要注意属性值包含空格的值列表,这种情况下的匹配很容易出问题。例如:
1 <a type="audio music" href="http://music.163.com/">网易云音乐</a>
要根据具体属性正确地匹配上面这个元素,唯一的写法是:
3.6.3 根据部分属性值选择
如果属性能接受词列表,可以根据其中的任意一个词进行选择。也就是说,对于属性包含多个词的元素,使用部分选择器可以根据其中的某个词来进行选择。例如,我们想选择 class 属性包含 coding 的 p 元素,就可以用部分属性选择器做到:
上面的样式就可以使 class 属性包含 coding 的 p 元素的文本为粗体,这些 p 元素可以是:
注意:
使用部分选择器必须注意不要忽略波浪号(~)。如果忽略,则说明需要完成完全值匹配。
在某些情况下,部分属性选择器等价于我们在类选择器中讨论过的点号类名记法。也就是说, p.coding
和 p[class="coding"]
应用于 HTML 时是等价的。
子串匹配属性选择器
部分属性选择器还有一个更高级的选择器模块,它是 CSS2 完成之后发布的,其中包含了更多的部分值属性选择器。按照规范的说法,应该称之为 “子串匹配属性选择器”
。下表是对这些选择器的简单总结:
例如,如果希望对指向 music.163 的所有链接应用样式,不必为所有这些链接指定 class,再根据这个类编写样式,而只需编写以下规则:
3.6.4 特定属性选择类型
特定属性选择器的使用如下所示:
上面的规则会选择 lang 属性等于 en 或者以 en- 开头的所有元素。也就是说属性[att|=value]的(比如 ·lang=”en-us”)含义就是:匹配值为“value”或者以“value”开始并立即跟上一个“-”字符,也就是“value-”的 att 属性。
3.7 派生选择器
CSS语法中通过依据元素在其位置的上下文关系来定义样式,这样可以使标记更加简洁。在CSS1中,通过这种方式来应用规则的选择器被称为上下文选择器,这是由于它们依赖于上下文关系来应用或者避免某项规则。在CSS2中,它们称为派生选择器,但是无论你如何称呼它们,它们的作用都是相同的。派生选择器允许你根据文档的上下文关系来确定某个标签的样式。通过合理地使用派生选择器,我们可以使HTML代码变得更加整洁。CSS 中,派生选择器包括: 后代选择器
、子元素选择器
、相邻兄弟选择器
。
3.7.1 后代选择器
后代选择器,其语法:规则左边的选择器由两个或多个用空格分隔的元素组成。并且,这些元素之间是有继承关系的,一般越靠左的元素在继承树中越是 辈份
高。后代选择器,也就是将规则作用于某元素的后代元素。例如:
上面的规则会将 h1 元素后代的 em 元素的文本变成灰色。
注意:
关于后代选择器,构成后代关系的两个元素之间的层次间隔可以是无限的。例如,ul em
, 这个选择器会将规则应用于从 ul 元素继承的所有 em 元素, 而不论 em 的嵌套层次多深。如下所示:
123456789101112131415161718 <ul><li>List item 1<ol><li>List item 1-1</li><li>List item 1-2</li><li>List item 1-3<ol><li>List item 1-3-1</li><li>List item <em>1-3-2</em></li><li>List item 1-3-3</li></ol></li><li>List item 1-4</li></ol></li><li>List item 2</li><li>List item 3</li></ul>
3.7.2 子元素选择器
与后代选择器不同,子元素选择器只能选择作为某元素子元素的元素。也就是说,后代选择器将规则作用于父类元素的后代,这个后代可以是直接的子元素,也可以是隔代的元素;而子元素选择器是将规则作用于父类元素直接的子元素。例如:
可以看出,子元素选择器是在两个元素之间使用了子结合符,即大于号(>)。子结合符两边可以有空白符,因此,h1 > strong 、h1> strong 和 h1>strong 都是一样的。
为了详细说明子元素选择器的使用,举个例子。下面的两个 h1 元素都有嵌套了 <strong>
,但只有第一个 h1 元素中的 <strong>
样式作用成功了,而第二个 h1 中的 <strong>
不受影响。这是因为第一个 h1 元素中的 strong 是 h1 的直接子类,而第二个 h1 中的 <strong>
是 <em>
直接的子元素, 是 h1 的后代。
3.7.3 相邻兄弟选择器
如果需要选择紧接在另一个元素后的元素,而且二者有相同的父元素,可以使用相邻兄弟选择器。例如,如果要增加紧接在 h1 元素后出现的段落的上边距,可以这样写:
相邻兄弟选择器使用了加号(+),即相邻兄弟结合符。与子结合符一样,相邻兄弟结合符旁边可以有空白符。
注意:
使用相邻兄弟选择器时要注意,用一个结合符只能选择两个相邻兄弟中的第二个元素。因为在定义中,使用相邻选择器是选择紧接在另一个元素后的元素
且二者有相同的父元素
。例如:
12345678910111213141516171819 li + li {font-weight:bold;}```上面这个选择器只会把列表中的第二个和第三个列表项变为粗体。第一个列表项不受影响。```HTML<div><ul><li>List item 1</li><li>List item 2</li><li>List item 3</li></ul><ol><li>List item 1</li><li>List item 2</li><li>List item 3</li></ol></div>
3.8 伪类选择器
在解释伪类选择器之前,我们先来弄清楚 伪类
和 伪元素
。
伪类
:表示一些元素的动态状态,用于向某些选择器添加特殊的效果,典型的就是链接的各个状态(LVHA)。伪元素
:用于将特殊的效果添加到某些选择器,代表了某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中。
CSS中常用的伪类如下所示(包括CSS、CSS2):
使用伪类选择器的语法是:
与CSS类结合使用的语法是:
CSS 中最常用的伪类是锚伪类,它可以分为 链接伪类
、动态伪类
。
链接伪类
:12a:link {color: #FF0000;} /* 未访问的链接 */a:visited {color: #00FF00;} /* 已访问的链接 */动态伪类
:根据用户行为改变文档的外观,可以应用到任何元素。12a:hover {color: #FF00FF;} /* 鼠标移动到链接上 */a:active {color: #0000FF;} /* 选定的链接 */
提示:
在CSS中,伪类的使用是有顺序的。一般建议按 link-visited-hover-active (LVHA) 的顺序声明。
在 CSS2.1 中,还定义了 :focus
、:first-child
、:lang()
:
:focus
:指示当前拥有输入焦点的元素。例如,下面的规则可以突出显示一个准备接受键盘输入的表单元素。1234input:focus {background: silver;font-weight: bold;}:first-child
:选择元素的第一个子元素。也就是在其他元素内选择第一个该元素,而不是该元素的第一个子元素。123456789<div><p>These are the necessary steps:</p><ul><li>Intert Key</li><li>Turn key <strong>clockwise</strong></li><li>Push accelerator</li></ul><p>Do <em>not</em> push the brake at the same time as the accelerator.</p></div>
上面的 HTML 文件,作为第一个子元素的元素包括第一个 p 、第一个 li 和 strong 及 em 元素。给定一下规则:
其最终的效果是:
:lang()
::lang() 伪类就像是|=
属性选择器,可以为不同的语言定义特殊的规则。例如,把所有的法语元素变成斜体,可以写作:123*:lang(fr) {font-style: italic;}
3.9 伪元素选择器
CSS中常用的伪元素如下所示(包括CSS、CSS2):
与伪类的语法一样,使用伪元素选择器的语法是:
与CSS类结合使用的语法是:
CSS2.1中的定义了4个常用的伪元素::first-line
、:first-letter
、:before
、:after
。
:first-line
:可以用来影响元素中第一个文本行。例如,可以让文档中第一段的第一行变成粉色:123p::first-line {}:first-letter
:用于设置一个块级元素首字母的样式,而且仅对该字母设置样式。例如,下面的规则会把每一段的第一个字母变成红色:123p::first-letter {color: red;}:before
:可以在元素的内容前面插入新内容。例如,在每个 h1 元素前面插入一幅图片:123h1:before {content:url(logo.gif);}:after
:可以在元素的内容之后插入新内容。例如,在文档的最后用一个适当的结束语结束:123body:after {content:" The End.";}
注意:
- 可以应用到伪元素
:first-line
和:first-letter
的属性是有限制的。- 所有伪元素都必须放在出现该伪元素的选择器的最后面。