WEB基础之:CSS选择器

1. 规则结构

有两个基本部分:选择器(selector)和声明块(declaration block)。

1. 选择器用于指定CSS样式作用的HTML对象,声明块(花括号)内是对该对象设置的具体样式。
2. 声明块由一个或多个声明组成,每个声明是一个属性: 值对(property-value)。
3. 属性和值之间用“:”连接。
4. 多个“键值对”之间用“;”进行区分。

2. 元素选择器

CSS还可以包含XML文档的样式。如果设置 HTML 的样式,选择器通常将是某个 HTML 元素,比如 p、h1、em、a,甚至可以是 html 本身:

html {color: black;}
h1 {color: grey;}

3. 选择器分组

3.1 多选择器分组

假设希望 h2 元素和段落都有灰色。为达到这个目的,最容易的做法是使用以下声明:

h2, p {color: gray;}
/*可以将任意多个选择器分组在一起:*/
body, table, th, td, h1, h2, p, pre, strong, em {color: gray;}

3.2 通配选择器

通配选择器(universal selector),显示为一个星号(*)。该选择器可以与任何元素匹配,就像是一个通配符。

* {color: red;}

3.3 声明分组

h1 {font: 18px Helsinki; color: purple; background: aqua;}

3.4 结合选择器和声明的分组

h1, h2, h3, h4, h5, h6 {
    color:gray; 
    background: white; 
    padding: 0.5em; 
    border: 1px solid black; 
    font-family: "Microsoft YaHei", sans-serif;
}

4. 类选择器

4.1 类选择器

实现不考虑文档具体涉及的元素来应用样式。
使用类选择器之前,需要修改具体的文档标记。为了将一个类选择器的样式与元素关联,必须将class属性指定为一个适当的值,

<h1 class="warning">h1元素,类选择器的样式与元素"warning"关联</h1>
<p class="warning">p元素,类选择器的样式与元素"warning"关联</p>
<p>p元素,没有关联类选择器的样式</p>

向该类中应用样式的方法,即类名前有一个点号"."

*.warning {font-style: italic;}

/*类选择器中可以忽略通配符选择器。*/
.warning {font-style: italic;}

/*只匹配class属性包含warning的所有p元素*/
p.warning {color: grey;}

4.2 多类选择器

在 HTML 中,一个 class 值中可能包含一个词列表,各个词之间用空格分隔。例如,如果希望将一个特定的元素同时标记为urgent和warning,就可以写作:

<p class="urgent warning">p元素,多类选择器的样式与元素"urgent warning"关联</p>

class中词的顺序任意。

.warning {font-style: italic;}
.urgent {font-weight: bold;}

/*通过把两个类选择器链接在一起,仅可以选择同时包含这些类名的元素(类名的顺序不限)。*/
.warning.urgent {background: darkred;}

5. ID选择器

5.1 ID 选择器

类似于类选择器。不同的是,ID 选择器前面有一个 # 号 ,也称为棋盘号或井号。

*#first-para {font-weight: bold;}

/*与类选择器一样ID选择器中可以忽略通配符选择器。*/
#first-para {font-weight: bold;}

5.2 类选择器还是 ID 选择器?

  • 与类不同,在一个 HTML 文档中,ID 选择器会使用一次,而且仅一次。
  • 不同于类选择器,ID 选择器不能结合使用,因为 ID 属性不允许有以空格分隔的词列表。
  • ID 能包含更多含义
    类似于类,可以独立于元素来选择 ID。有些情况下,您知道文档中会出现某个特定 ID 值,但是并不知道它会出现在哪个元素上,所以您想声明独立的 ID 选择器。例如,您可能知道在一个给定的文档中会有一个 ID 值为 mostImportant 的元素。您不知道这个最重要的东西是一个段落、一个短语、一个列表项还是一个小节标题。您只知道每个文档都会有这么一个最重要的内容,它可能在任何元素中,而且只能出现一次。
#mostImportant {color:red; background:yellow;}

上面的规则会与以下各个元素匹配(这些元素不能在同一个文档中同时出现,因为它们都有相同的 ID 值):

<h1 id="mostImportant">This is important!</h1>
<em id="mostImportant">This is important!</em>
<ul id="mostImportant">This is important!</ul>

5.3 区分大小写

请注意,类选择器和 ID 选择器可能是区分大小写的。这取决于文档的语言。HTML 和 XHTML 将类和 ID 值定义为区分大小写,所以类和 ID 值的大小写必须与文档中的相应值匹配。

6. 属性选择器

属性选择器可以根据元素的属性及属性值来选择元素。

6.1 简单属性选择

如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器。如:根据元素属性来选择元素

<h1 class="hoopla">hello</h1>
<h1 class="severe">Serenity</h1>
<h1 class="fancy">fooling</h1>

h1[class] {color: silver;}

/*将包含title属性的所有元素变为粗体显示*/
*[class] {font-weight: bold;}

/*将同时有href和title属性的HTML超链接的文本置为粗体显示*/
a[href][title] {font-weight: bold;}

6.2 根据具体属性值选择

除了选择拥有某些属性的元素,还可以进一步缩小选择范围,只选择有特定属性值的元素。

a[href="http://www.css-discuss.org/about.html"] {font-weight: bold;}

a[href="http://www.css-discuss.org/about.html"][title="W3C Home"] {font-weight: bold;}

注意,这种格式要求必须与属性值完全匹配。如果属性值包含用空格分隔的值列表,匹配就可能出问题。

<planet type="barren rocky">Mercury</planet>

要根据具体属性值匹配这个元素,唯一的写法:
planet[type="barren rocky"] {font-weight: bold;}

6.3 根据部分属性值选择

如果需要根据属性值中的词列表的某个词进行选择,则需要使用波浪号(~)。如果忽略了波浪号,则说明需要完成完全值匹配。

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

/*那么,为什么还要有 "~=" 属性选择器呢?因为它能用于任何属性,而不只是 class。*/
img[title~="Figure"] {border: 1px solid gray;}
  • 子串匹配属性选择器
类型描述
[foo^=“bar”]选择 foo 属性值以 “bar” 开头的所有元素
[foo$=“bar”]选择 foo 属性值以 “bar” 结尾的所有元素
[foo*=“bar”]选择 foo 属性值中包含子串 “bar” 的所有元素

6.4 特定属性选择类型

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

这个规则会选择 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.jpgfigure-2.jpg。就可以使用以下选择器匹配所有这些图像:

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

7. 后代选择器

后代选择器(descendant selector)又称为包含选择器或上下文选择器(contextual selector)。

7.1 根据上下文选择元素

定义后代选择器来创建一些规则,使这些规则在某些文档结构中起作用,而在另外一些结构中不起作用。如只对 h1 元素中包含的 em 元素匹配:

h1 em {color:gray;}

h1 em 选择器可以解释为 “作为 h1 元素后代的任何 em 元素”。如果要从左向右读选择器,可以换成以下说法:“包含 em 的所有 h1 会把以下样式应用到该 em”。

7.2 语法解释

在后代选择器中,规则左边的选择器一端包括两个或多个用空格分隔的选择器。选择器之间的空格是一种结合符(combinator)。每个空格结合符可以解释为“… 在 … 中找到”、“… 作为 … 的一部分”、“… 作为 … 的后代”,但是要求必须从右向左读选择器。

两个元素之间的层次间隔可以是无限的。

8. 子元素选择器

应用于不想选择一个任意的后代元素,而是希望缩小范围,只选择某个特定元素的子元素而不是后代元素。

<h1>This is <strong>very</strong> important.</h1>
<h1>This is <em>really <strong>very</strong></em> important.</h1>

/*只会将第一个h1下面出现的strong元素变成红色。*/
h1 > strong {color: red;}

9. 选择相邻兄弟元素

选择紧接在另一个元素后的元素,而且二者有相同的父元素。可以使用相邻兄弟结合符(Adjacent sibling combinator)表示为一个加号(+)。

<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>
/*把ul与ol列表中的第二个和第三个列表项变为灰色*/
li + li {color: grey;}

/*把ul列表中的第二个和第三个列表项变为灰色*/
ul > li + li {color: grey;}

10. 伪类选择器

10.1 伪类

伪类(Pseudo-classes):同一个标签,根据其不同的种状态,有不同的样式。如锚元素(a),如果只看HTML标记无法区别有些锚是否已经访问过或尚未访问,唯一办法是将文档中的链接与用户的浏览历史相比较。而已访问的和未访问的这些类型称为伪类。

10.2 链接伪类(静态伪类)

只能用于超链接的样式。

a:link {color: #FF0000;}	/* 未访问的链接 */
a:visited {color: #00FF00;}	/* 已访问的链接 */

10.3 动态伪类

a:focus {color: #0000FF;}   /* 当前拥有输入焦点时元素 */
a:hover {color: #FF00FF;}	/* 鼠标移动到链接上 */
a:active {color: #FFFF00;}	/* 选定的链接 */

动态伪类可以应用到任何元素。可以对非链接的元素应用动态样式。

input:focus {background:silver;}

10.4 超链接伪类顺序

通常建议是"link-visited-focus-hover-active".否则可能会失效。
“love for hate”

10.5 动态样式的实际问题

如将忆访问和未访问的链接设置为一种字体大小,而让鼠标停留的链接有更大的字体,在锚处于悬停状态时必须重绘文档,要求user-agent重新显示该链接之后的内容。不过应当避免依赖于这种行为的设计。

a:link, a:visited {font-size: 13px;}
a:hover {font-size: 20px;}

10.6 first-child伪类

first-child 伪类来选择元素的第一个子元素。

/*将第一个h1元素颜色设置为灰色*/
h1:first-child {color: grey;}

10.7 lang 伪类

根据元素的语言来选择;从应对的模式来讲,lang()伪类就像是 |= 属性选择器。

*:lang(en) {color: grey;}

10.8 结合伪类

鼠标指针停留在未由于链接上时,将链接变成红色,鼠标指针停留在已访问链接上时,链接变成紫色。

a:link:hover {color: red;}
a:visited:hover {color: maroon;}
  • 注意:不要把互斥的伪类结合在一起使用。如a:link:visited没有意义;

11. 伪元素选择器

11.1 irst-letter 伪元素

“first-letter” 伪元素用于设置一个块级元素首字母的样式:

/* 将h1元素的第一个字母变红色 */
h1:first-letter {color: red;}

11.2 first-line 伪元素

“first-line” 伪元素设置元素中首行的样式。

p:first-line {color: red;}

11.3 first-letter 与 first-line 限制

first-letter 与 first-line 只能用于标记或段落之类的块级元素,不能应用于超链接等行内元素。

所有的伪元素都必须放在出现该伪元素的选择器的最后面。

11.4 before/after 伪元素

“:before” 伪元素可以在元素的内容前面插入新内容。
“:after” 伪元素可以在元素的内容之后插入新内容。

p:before {content: "[[";}
p:after {content: "]]"}
posted @ 2020-12-11 10:34  f_carey  阅读(4)  评论(0编辑  收藏  举报  来源