<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>丰歌 &#187; specificity</title>
	<atom:link href="http://fengyouyi.com/tag/specificity/feed" rel="self" type="application/rss+xml" />
	<link>http://fengyouyi.com</link>
	<description>荒芜之地，没有收获的喜悦。</description>
	<lastBuildDate>Wed, 08 Feb 2012 09:09:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>如何计算 CSS 选择器的权重？</title>
		<link>http://fengyouyi.com/74</link>
		<comments>http://fengyouyi.com/74#comments</comments>
		<pubDate>Wed, 21 Oct 2009 06:22:17 +0000</pubDate>
		<dc:creator>Ulysses</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[specificity]]></category>

		<guid isPermaLink="false">http://fengyouyi.com/?p=74</guid>
		<description><![CDATA[虽然接触 CSS 有相当年头了，但是对于样式的优先级，一直都是一知半解的，以至于某些时候编写的 CSS 代码并不能达到预期的呈现效果。查阅官方文档后，终于对此有了一个新的认识。]]></description>
			<content:encoded><![CDATA[<p>之前在编写 CSS 的时候，多次遇到类选择器“无效”（优先级不够）的情况，例如下面的 HTML 代码：</p>
<pre class="code">&lt;div class=&quot;entry&quot;&gt;
    &lt;p&gt;段落内容。
        &lt;a class=&quot;links&quot; href=&quot;http://fengyouyi.com&quot;&gt;链接&lt;/a&gt;
    &lt;/p&gt;
&lt;/div&gt;</pre>
<p>对应 CSS 代码如下：</p>
<pre class="code">.entry a {
    color: red;
}
.links {
    color: blue;
}</pre>
<p>一直以来都简单地按照先后顺序来理解，以为这里链接会呈现蓝色，事实不然。我所理解的先后顺序，只是样式表的层叠顺序。在具体执行时，还需要考虑到样式的权重（原文作 specificity，我个人理解为权重）。</p>
<p>参考官方 CSS2.1 文档中的<a title="Calculating a selector's specificity" rel="external" href="http://www.w3.org/TR/CSS21/cascade.html#specificity">《6.4.3 Calculating a selector&#8217;s specificity》</a>部分，我们可以了解到权重计算遵循以下规则：</p>
<ul>
<li>如果是通过 ‘style’ 属性声明而不是通过选择器来声明的规则，算作 1，否则为 0 （a 位）（在 HTML 中，一个元素的“style”属性的值是一组样式规则。这些规则没有选择器，所以 a=1、b=0、c=0、d=0）；</li>
<li>计算选择器中的 ID 属性个数（b 位）；</li>
<li>计算选择器中的其它属性（选择器）和伪类个数（c 位）；</li>
<li>计算选择器中的元素名和伪元素个数（d 位）。</li>
</ul>
<p>这个计算方法仅基于选择器的形式。需要特别说明的是，“[id=p33]”形式的选择器是算作属性选择器的（a=0, b=0, c=1, d=0），即使在源文档的 DTD 中 id 属性被定义为“ID”。</p>
<p>将四个数字串联成 a-b-c-d ，就可以获得选择器的权重了。</p>
<p>我们要如何理解这个呢？其实很简单。所有的选择器的权重都用 a-b-c-d 的形式表示，我们只要按照从 a 到 d 四个位置的数字，对应比较就可以得到权重顺序了。例如 1-0-0-0 的权重高于 0-2-1-2 ，因为在 a 位置，前者为 1 ，后者为 0 ，这样后面的就无须比较了。</p>
<p><strong>更新</strong></p>
<p><em>2009-10-21 23:38</em></p>
<p>看到 junp 在这里的评论，我才醒悟过来，他给我参考的那篇文章中那句“HTML标记的权重是 1，CLASS的权重是 10，ID的权重是 100，继承的权重为 0 ”，使我误以为作者将这几组值当作十进制来处理了。这里，如果按照 a-b-c-d 的形式，我们需要将其理解为“HTML标记的权重是 0-0-0-1，CLASS的权重是 0-0-1-0，ID的权重是 0-1-0-0，继承的权重为 0-0-0-0 ”。所以最底部的那部分更新内容，就当作加深了解的范例吧。</p>
<p>对原作者飘零雾雨表示歉意，同时也对 junp 表示由衷的感谢。</p>
<p><em>2009-10-21 14:22</em></p>
<p><a title="站长资讯论坛" rel="external" href="http://bbs.chinahtml.com/">站长资讯论坛</a>上的 <a title="junp's blog" rel="external" href="http://junp.yo2.cn/">junp</a> 给了我一篇<a title="老调重弹的CSS优先级 " rel="external" href="http://blog.doyoe.com/article.asp?id=133">网络上的文章</a>，也是介绍这个的。但是看了作者计算权重的方法，好像是不正确的。因为按照他的方式，得到的最终权重值是 a*1000 + b*100 + c*10 + d 。这个是不正确的。我们可以构想一下，如果两个选择器，A 在 d 位上有 11 个元素名，例如 div div div div div div div div div div div ，而 B 在 c 位上只有 1 个属性选择器，例如 p[id="p33"] ，按照他的计算方式，A 的权重为 11 ，B 的权重为 10 。参考下面 HTML 和 CS 代码：</p>
<pre class="code">&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;div&gt;
              &lt;div&gt;
                &lt;div&gt;
                  &lt;div&gt;
                    &lt;div&gt;
                      &lt;p id=&quot;p33&quot;&gt;看看文本显示的颜色&lt;/p&gt;
                    &lt;/div&gt;
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<pre class="code">div div div div div div div div div div div {
    color: red;
}
p[id="p33"] {
    color: blue;
}</pre>
<p>结果是蓝色。</p>
<p>所以权重的计算，是按“位”比较，而不是十进制的。不过作者也提到了“按照从左到右的顺序逐位比较”，或许只是表述不清吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://fengyouyi.com/74/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

