【问题标题】:Order by CSS Specificity按 CSS 特异性排序
【发布时间】:2012-05-29 19:47:23
【问题描述】:

我的主要目标是尝试根据特定性重新排序 CSS 样式块。我之前曾在SO 提供过帮助,并且我设法生成了这个功能。 See gist

这是一个例子:

function specificity($selector){
// https://gist.github.com/2774085
}

$compare = function($a, $b) use ($specificity) {
    return $specificity($a) - $specificity($b)
};

$array = css_array();

uksort($array, $compare);

在我遇到这个 CSS 之前,上述方法一直很好用:

html, body, body div{
    background: transparent;
}
body {
    background-color: #D96F02;
}

这被重新排序为:

body { // 1 point
    background-color: #D96F02;
}
html, body, body div{ // 4 points
    background: transparent;
}

但是,这不是浏览器应用 CSS 的方式。

我认为我的特异性函数可能缺少 CSS 顺序的重要性,而不是基于选择器特异性的排序?这是真的吗?

更新

我认为我应该做的是在比较函数中,我应该总是添加一个额外的点,比如10,因为特异性不仅仅基于选择器,它也基于选择器的顺序。所以是这样的:

 $compare = function($a, $b) use ($specificity) {
        return ($specificity($a) + 10) - $specificity($b)
    };

这看起来如何,我如何确定在这种情况下要给出的分数!?

【问题讨论】:

  • 默认的背景速记不是更有选择性吗?你试过背景色:透明吗?
  • @albert 你是说我应该在 CSS 属性级别订购吗?我认为浏览器只能按选择器排序,然后应用 CSS 属性,对吧?
  • Hmmm 有趣的问题 :) Firefox 扩展 Firebug 已经解决了这个问题,但是对于一个元素来说是正确的(检查功能)。试着弄清楚他们是如何做到的。起点,也许是code.google.com/p/fbug/source/browse/branches/firebug1.10/…
  • 除非您完全了解 CSS 和浏览器如何处理此问题,否则您永远不会制作防弹“CSS 内联”。如果你只是猜测(+10 到特异性?!),它不会很健壮。规格:w3.org/TR/CSS2/cascade.html.
  • 我不同意您的特异性计算是正确的。您显示为 4 points 的内容实际上应该是计算三个单独的特异性等级 1、1 和 2。逗号将三个不同的 css 选择器放在一行中,而不是像 html > body > div 之类的组合选择器。

标签: php css css-selectors css-specificity


【解决方案1】:

如果你序列化,问题应该会消失

html, body, body div{ 
    background: transparent; 
} 

作为单独的规则,就好像它们是按以下方式编写的:

html{ 
    background: transparent; 
} 
body{ 
    background: transparent; 
} 
body div{ 
    background: transparent; 
} 

The semantics is a bit confusing,但基本上您是根据已组合到同一规则集中的独立选择器来判断整个声明。

您的更新:specificity is not affected by selector order,即以下规则具有相同的特异性。最后一条规则将优先于rendering in blue,除非您重新排列规则rendering in red

<style>
    #container span {color:red;}
    div #content {color:blue;}
</style>

<div id="container"><span id="content">Hello world!</span></div>

【讨论】:

  • 而且特异性也不会受到组合器和选择器与实际匹配元素的“接近”程度的影响,因为在选择器中没有这样的接近概念。
  • @BoltClock:当适用于子选择器 a&gt;b 不比后代选择器 a b 更具体时,这有点令人困惑;子选择器只是“感觉”更具体(毕竟,根据定义,子选择器通常会比后代选择器处理更小的元素子集)
  • @o.v.很棒的答案。这正是我实施了一个很好的方法来解决我的问题!这次真是万分感谢! :)
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 2011-07-06
  • 2012-01-10
  • 2014-05-14
  • 1970-01-01
  • 2014-02-04
  • 2019-11-03
相关资源
最近更新 更多