8

我的主要目标是尝试根据特异性重新排序 CSS 样式块。我以前曾从SO那里得到帮助,我设法产生了这个功能。见要点

这是一个例子:

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)
    };

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

4

1 回答 1

4

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

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

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

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

语义有点混乱,但基本上您是根据已组合到同一规则集中的独立选择器来判断整个声明。

重新更新:特异性不受选择器顺序的影响,即以下规则具有相同的特异性。最后一条规则将优先渲染为 blue,除非您重新安排渲染为 red的规则:

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

<div id="container"><span id="content">Hello world!</span></div>
于 2012-05-24T05:25:43.963 回答