aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/guide/css/getting_started/selectors/index.html
blob: 69f0700b193c681ba969fb1ddeed0e809eee66b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
---
title: 选择器
slug: Web/Guide/CSS/Getting_started/Selectors
translation_of: Learn/CSS/Building_blocks/Selectors
translation_of_original: Web/Guide/CSS/Getting_started/Selectors
---
<p>{{ CSSTutorialTOC() }}</p>

<p>{{ previousPage("/zh-CN/docs/CSS/开始/Cascading_and_inheritance", "层叠和继承")}}这是<span class="seoSummary"> <a href="/zh-CN/docs/Web/Guide/CSS/Getting_Started" title="en-US/docs/Web/Guide/CSS/Getting Started">CSS入门教程</a> 的第五节; 本节将讲述如何应用样式;不同的选择器有不同的优先级;你在样例文档中为标签增加一些属性,在样式中使用这些属性。</span></p>

<h2 class="clearLeft" id="资料_选择器(Selectors)">资料: 选择器(Selectors)</h2>

<p>CSS有一套用于描述其语言的术语。在前面的教程中,你应该已经写过这个样式:</p>

<pre class="brush: css">strong {
  color: red;
}
</pre>

<p><span style="line-height: 1.5;">在CSS的术语中,上面这段代码被称为一条规则(rule)。这条规则以选择器strong开始,它选择要在DOM中哪些元素上使用这条规则。</span></p>

<div class="tuto_details">
<div class="tuto_type">更多细节</div>

<p>花括号中的部分称为<strong>声明(declaration)</strong></p>

<p><code>关键字color是一个属性</code><code>red</code> 是其对应的值.</p>

<p>同一个声明中的 属性和值组成一个名值对(property-value pairs),名值对用分号分隔.</p>

<p><code>这个教程中将类似strong的选择器称为标签选择器(tag selector)</code>.CSS规范中称之为类型选择器(<em>type</em> selector).</p>
</div>

<p>本节将介绍更多的选择器。</p>

<p>除了标签名称,你还可以在选择器中使用属性值。这样你就可以更具体的描述你的规则.</p>

<p>其中 <a href="/en-US/docs/Web/HTML/Global_attributes#attr-class" title="en-US/docs/Web/HTML/Global_attributes#attr-class"><code>class</code></a> 和 <code><a href="/en-US/docs/Web/HTML/Global_attributes#id" title="en-US/docs/Web/HTML/Global_attributes#id">id</a> 两个属性具有比较重要的地位。</code></p>

<h3 id="类选择器(Class_selectors)">类选择器(Class selectors)</h3>

<p>通过设置元素的 <a href="/en-US/docs/Web/HTML/Global_attributes#attr-class" title="en-US/docs/Web/HTML/Global_attributes#attr-class"><code>class</code></a> 属性,可以为元素指定类名。类名由开发者自己指定。 文档中的多个元素可以拥有同一个类名。</p>

<p>在写样式表时,类选择器是以英文句号(.)开头的。</p>

<h3 id="ID选择器(ID_selectors)">ID选择器(ID selectors)</h3>

<p>通过设置元素的 <a href="/en-US/docs/Web/HTML/Global_attributes#id" title="en-US/docs/Web/HTML/Global_attributes#id"><code>id</code></a> 属性为该元素制定ID。ID名由开发者指定。每个ID在文档中必须是唯一的。</p>

<p>在写样式表时,ID选择器是以#开头的。</p>

<div class="tuto_example">
<div class="tuto_type">例:</div>
下面的p标签同时具有 <code>class</code> 属性和<code>id</code> 属性:

<pre class="brush: html">&lt;p class="key" id="principal"&gt;
</pre>

<p><strong>id</strong> 属性值 <code>principal</code>必须在文档中是唯一的;但文档中的其他标签可以有和p相同的 <strong>class </strong>属性值 <code>key</code>.</p>

<p>在一个CSS样式表中, 下面的规则将使所有class属性等于key的元素文字颜色呈现绿色。(这些元素不一定都是 {{ HTMLElement("p") }} 元素。)</p>

<pre class="brush: css">.key {
  color: green;
}
</pre>

<p>下面的规则将使 <strong>id</strong> 等于 <code>principal 的那个元素的文字变为粗体</code>:</p>

<pre class="brush: css">#principal {
  font-weight: bolder;
}
</pre>
</div>

<p>如果多于一个规则指定了相同的属性值都应用到一个元素上,CSS规定拥有更高确定度的选择器优先级更高。ID选择器比类选择器更具确定度, 而类选择器比标签选择器(tag selector)更具确定度。</p>

<div class="tuto_details">
<div class="tuto_type">更多细节</div>

<p>你也可以将多个选择器组合起来构成更确定的选择器。</p>

<p>比如,选择器<code>.key</code> 选中所有class属性为 <code>key的元素</code>. 选择器 <code>p.key</code> 选中所有class属性为<span style="font-family: courier new,andale mono,monospace; line-height: normal;">key的</span>{{ HTMLElement("p") }} 元素。</p>

<p>除了<code>class</code> 和 <code>id,你还可以用方括号的形式指定其他属性。比如</code>,选择器 <code>[type='button']</code> 选中所有 <code>type</code> 属性为 <code>button 的元素。</code></p>
</div>

<p>如果样式中包含冲突的规则,且它们具有相同的确定度。那么,后出现的规则优先级高。</p>

<p>如果你遇到规则冲突,你可以增加其中一条的确定度或将之移到后面以使它具有更高优先级。</p>

<h3 id="伪类选择器(Pseudo-classes_selectors)">伪类选择器(Pseudo-classes selectors)</h3>

<p>CSS伪类(<a href="/en-US/docs/Web/Guide/CSS/Pseudo-classes" title="en-US/docs/Web/Guide/CSS/Pseudo-classes">pseudo-class</a>)是加在选择器后面的用来指定元素状态的关键字。比如,{{ Cssxref(":hover") }} 会在鼠标悬停在选中元素上时应用相应的样式。</p>

<p>伪类和伪元素(pseudo-elements)不仅可以让你为符合某种文档树结构的元素指定样式,还可以为符合某些外部条件的元素指定样式:浏览历史(比如是否访问过 ({{ cssxref(":visited") }}), 内容状态(如 {{ cssxref(":checked") }} ), 鼠标位置 (如{{ cssxref(":hover") }}). 完整列表参见 <a class="external" href="http://www.w3.org/TR/selectors/#selectors" rel="external nofollow" title="CSS3 Selectors working spec">CSS3 Selectors working spec</a>.</p>

<div class="tuto_example">
<div class="tuto_type">语法</div>

<pre class="brush:css">selector:pseudo-class {
  property: value;
}
</pre>
</div>

<h4 id="伪类列表">伪类列表</h4>

<ul>
 <li>{{ Cssxref(":link") }}</li>
 <li>{{ Cssxref(":visited") }}</li>
 <li>{{ Cssxref(":active") }}</li>
 <li>{{ Cssxref(":hover") }}</li>
 <li>{{ Cssxref(":focus") }}</li>
 <li>{{ Cssxref(":first-child") }}</li>
 <li>{{ Cssxref(":nth-child") }}</li>
 <li>{{ Cssxref(":nth-last-child") }}</li>
 <li>{{ Cssxref(":nth-of-type") }}</li>
 <li>{{ Cssxref(":first-of-type") }}</li>
 <li>{{ Cssxref(":last-of-type") }}</li>
 <li>{{ Cssxref(":empty") }}</li>
 <li>{{ Cssxref(":target") }}</li>
 <li>{{ Cssxref(":checked") }}</li>
 <li>{{ Cssxref(":enabled") }}</li>
 <li>{{ Cssxref(":disabled") }}</li>
</ul>

<h2 id="资料_基于关系的选择器">资料: 基于关系的选择器</h2>

<p>CSS还有多种基于元素关系的选择器。通过它们你可以更精确的选择元素。</p>

<table id="relselectors">
 <caption>常见的基于关系的选择器</caption>
 <tbody>
  <tr>
   <td style="width: 10em;"><strong>选择器</strong></td>
   <td><strong>选择的元素</strong></td>
  </tr>
  <tr>
   <td><code>A E</code></td>
   <td>元素A的任一后代元素E (后代节点指A的子节点,子节点的子节点,以此类推)</td>
  </tr>
  <tr>
   <td><code>A &gt; E</code></td>
   <td>元素A的任一子元素E(也就是直系后代)</td>
  </tr>
  <tr>
   <td><code>E:first-child</code></td>
   <td>任一是其父母结点的第一个子节点的元素E</td>
  </tr>
  <tr>
   <td><code>B + E</code></td>
   <td>元素B的任一下一个兄弟元素E</td>
  </tr>
  <tr>
   <td><code>B ~ E</code></td>
   <td>B元素后面的拥有共同父元素的兄弟元素E</td>
  </tr>
 </tbody>
</table>

<p>你可以任意组合以表达更复杂的关系。</p>

<p>你还可以使用星号(*)来表示”任意元素“。</p>

<div class="tuto_example">
<div class="tuto_type"></div>

<p>一个HTML表格有<code style="font-size: 14px;">id</code> 属性,但是它的行和单元格没有单独的id:</p>

<pre class="brush: html">&lt;table id="data-table-1"&gt;
...
&lt;tr&gt;
&lt;td&gt;Prefix&lt;/td&gt;
&lt;td&gt;0001&lt;/td&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;/tr&gt;
...
</pre>

<p>下面的规则使表格每行的第一个单元格字体为粗体,使第二个单元格使用等宽字体。这条规则只影响id为data-table-1的表格:</p>

<pre class="brush:css">    #data-table-1 td:first-child {font-weight: bolder;}
    #data-table-1 td:first-child + td {font-family: monospace;}
</pre>

<p>最终效果:</p>

<table style="background-color: white; border: 2px outset #3366bb; padding: 1em;">
 <tbody>
  <tr>
   <td>
    <table style="margin-right: 2em; width: 18em;">
     <tbody>
      <tr>
       <td><strong>Prefix</strong></td>
       <td><code>0001</code></td>
       <td>default</td>
      </tr>
     </tbody>
    </table>
   </td>
  </tr>
 </tbody>
</table>
</div>

<div class="tuto_details">
<div class="tuto_type">更多细节</div>

<p>一般情况下,如果你提高了某个选择器的的确定度,你便<span style="line-height: 1.5;">提高它的优先级。</span></p>

<p>使用这个技巧,可以避免为大量标签指定 <code>class</code> 或 <code>id</code> 属性。CSS(引擎)会帮你做的。</p>

<p>在复杂设计中速度非常重要,避免使用复杂的依赖元素关系的规则可以使你的样式更有效率。</p>

<p>更多关于表格的例子,见 <a href="/en-US/docs/Web/Guide/CSS/Getting_Started/Tables" title="en-US/docs/Web/Guide/CSS/Getting_Started/Tables">Tables</a></p>
</div>

<h2 id="实例_使用类选择器和ID选择器">实例: 使用类选择器和ID选择器</h2>

<ol>
 <li>创建一个HTML文件</li>
 <li>将下面内容拷贝到HTML文件中
  <pre class="brush: html">&lt;!doctype html&gt;
&lt;html&gt;
  &lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Sample document&lt;/title&gt;
  &lt;link rel="stylesheet" href="style1.css"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p id="first"&gt;
      &lt;strong class="carrot"&gt;C&lt;/strong&gt;ascading
      &lt;strong class="spinach"&gt;S&lt;/strong&gt;tyle
      &lt;strong class="spinach"&gt;S&lt;/strong&gt;heets
    &lt;/p&gt;
    &lt;p id="second"&gt;
      &lt;strong&gt;C&lt;/strong&gt;ascading
      &lt;strong&gt;S&lt;/strong&gt;tyle
      &lt;strong&gt;S&lt;/strong&gt;heets
    &lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
 </li>
 <li>创建style1.css:
  <pre class="brush:css">strong { color: red; }
.carrot { color: orange; }
.spinach { color: green; }
#first { font-style: italic; }
</pre>
 </li>
 <li>保存文件,在浏览器中查看效果:
  <table style="border: 2px outset #3366bb; height: 53px; padding: 1em; width: 494px;">
   <tbody>
    <tr>
     <td style="font-style: italic;"><em><strong style="color: orange;">C</strong>ascading <strong style="color: green;">S</strong>tyle <strong style="color: green;">S</strong>heets //此处应为斜体</em></td>
    </tr>
    <tr>
     <td><strong style="color: red;">C</strong>ascading <strong style="color: red;">S</strong>tyle <strong style="color: red;">S</strong>heets</td>
    </tr>
   </tbody>
  </table>

  <p>重新组织样式中规则的顺序,你会发现改变这几条规则的顺序不会影响最终效果。</p>

  <p>类选择器 <code>.carrot</code><code>.spinach</code> 比标签选择器 <code>strong 拥有更高优先级。</code></p>

  <p>ID 选择器 <code>#first</code> 比类选择器和标签选择器更优先。</p>
 </li>
</ol>

<div class="tuto_example">
<div class="tuto_type">挑战</div>

<ol>
 <li>不改变HTML内容, 增加一条规则,不改变首字母颜色,将第二个p标签中的其他文字变成蓝色:
  <table style="background-color: white; border: 2px outset #3366bb; padding: 1em;">
   <tbody>
    <tr>
     <td style="font-style: italic;"><strong style="color: orange;">C</strong>ascading <strong style="color: green;">S</strong>tyle <strong style="color: green;">S</strong>heets</td>
    </tr>
    <tr>
     <td style="color: blue;"><strong style="color: red;">C</strong>ascading <strong style="color: red;">S</strong>tyle <strong style="color: red;">S</strong>heets</td>
    </tr>
   </tbody>
  </table>
 </li>
 <li>现在改变上面增加的那条规则(不改变其他任何内容)让第一个p标签中的其他文字也变成蓝色:
  <table style="background-color: white; border: 2px outset #3366bb; padding: 1em;">
   <tbody>
    <tr>
     <td style="font-style: italic; color: blue;"><strong style="color: orange;">C</strong>ascading <strong style="color: green;">S</strong>tyle <strong style="color: green;">S</strong>heets</td>
    </tr>
    <tr>
     <td style="color: blue;"><strong style="color: red;">C</strong>ascading <strong style="color: red;">S</strong>tyle <strong style="color: red;">S</strong>heets</td>
    </tr>
   </tbody>
  </table>
 </li>
</ol>

<div class="tuto_details" id="tutochallenge">
<div class="tuto_type">Possible solution</div>

<ol>
 <li>Add a rule with an ID selector of <code>#second</code> and a declaration <code>color: blue;</code>, as shown below:

  <pre class="brush: css">#second { color: blue; }
</pre>
  A more specific selector, <code>p#second</code> also works.</li>
 <li>Change the selector of the new rule to be a tag selector using <code>p</code>:
  <pre class="brush: css">p { color: blue; }
</pre>
 </li>
</ol>
<a class="hideAnswer" href="#challenge">Hide solution</a></div>
<a href="#tutochallenge" title="Display a possible solution for the challenge">See a solution for the challenge.</a></div>

<h2 id="实例_使用伪类选择器">实例: 使用伪类选择器</h2>

<ol>
 <li>创建如下 HTML:
  <pre class="brush: html">&lt;!doctype html&gt;
&lt;html&gt;
  &lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Sample document&lt;/title&gt;
  &lt;link rel="stylesheet" href="style1.css"&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;Go to our &lt;a class="homepage" href="http://www.example.com/" title="Home page"&gt;Home page&lt;/a&gt;.&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
 </li>
 <li>编辑CSS:
  <pre class="brush: css">a.homepage:link, a.homepage:visited {
  padding: 1px 10px 1px 10px;
  color: #fff;
  background: #555;
  border-radius: 3px;
  border: 1px outset rgba(50,50,50,.5);
  font-family: georgia, serif;
  font-size: 14px;
  font-style: italic;
  text-decoration: none;
}

a.homepage:hover, a.homepage:focus, a.homepage:active {
  background-color: #666;
}
</pre>
 </li>
 <li>保存文件用浏览器查看HTML文件 (将鼠标放到链接上查看效果):
  <table style="border: 2px outset #3366bb; padding: 1em;">
   <tbody>
    <tr>
     <td>Go to our <a class="tutospecial" href="#" title="Home page">Home page</a><span style="display: none;"> </span><span style="display: none;"> </span></td>
    </tr>
   </tbody>
  </table>
 </li>
</ol>

<h2 id="实例_使用基于关系的选择器和伪类选择器">实例: 使用基于关系的选择器和伪类选择器</h2>

<p>通过使用基于关系的选择器和伪类选择器,你可以构造出复杂的叠加算法。这是一个常用的技巧,比如可以用来创建纯CSS无JavaScript的下拉菜单(<strong style="font-size: 14px; line-height: 1.5;">pure-CSS dropdown menus</strong><span style="font-size: 14px; line-height: 1.5;">)。关键点就是创建下面这类规则:</span></p>

<pre class="brush: css">div.menu-bar ul ul {
  display: none;
}

div.menu-bar li:hover &gt; ul {
  display: block;
}</pre>

<p>然后将这些规则应用到下面的HTML结构中:</p>

<pre class="brush: html">&lt;div class="menu-bar"&gt;
  &lt;ul&gt;
    &lt;li&gt;
      &lt;a href="example.html"&gt;Menu&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;
          &lt;a href="example.html"&gt;Link&lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
          &lt;a class="menu-nav" href="example.html"&gt;Submenu&lt;/a&gt;
          &lt;ul&gt;
            &lt;li&gt;
              &lt;a class="menu-nav" href="example.html"&gt;Submenu&lt;/a&gt;
              &lt;ul&gt;
                &lt;li&gt;&lt;a href="example.html"&gt;Link&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="example.html"&gt;Link&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="example.html"&gt;Link&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="example.html"&gt;Link&lt;/a&gt;&lt;/li&gt;
              &lt;/ul&gt;
            &lt;/li&gt;
            &lt;li&gt;&lt;a href="example.html"&gt;Link&lt;/a&gt;&lt;/li&gt;
          &lt;/ul&gt;
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
</pre>

<p>学习实例 <a class="internal" href="https://mdn.mozillademos.org/files/3700/css_dropdown_menu.html" title="css_dropdown_menu.html">CSS-based dropdown menu example</a>.</p>

<h2 id="接下来是什么">接下来是什么?</h2>

<p>你的样式表变得多而复杂。下面章节将讲述如何让样式表更 <a href="/zh-CN/docs/Web/Guide/CSS/Getting_started/Readable_CSS" title="/zh-CN/docs/Web/Guide/CSS/Getting_started/Readable_CSS">易读</a>.{{nextPage("/zh-CN/docs/CSS/开始/Readable_CSS", "易读的 CSS")}}</p>