其他答案,包括接受的答案,已经令人信服地解释了为什么LESS不能以您想要的方式简化嵌套选择器。
其实,SASS有能力做到这一点:
#global {
.container {
@at-root #sidebar {
.title {
font-weight: bold;
的@at-root
指令基本上忽略了所有的更高筑巢选择。我不知道LESS是否有类似的东西。上述编译成简单
#sidebar {
.title {
font-weight: bold;
但是有一个更深层次的问题在这里,从一个事实,即在你的“爱”嵌套规则更少。别那么爱他们。我不了解你,但是大多数人喜欢嵌套规则,因为他们认为完全模仿HTML的层次结构是很酷的。 SASS文档甚至声称这是一个好处:
Sass将允许您以跟随HTML相同视觉层次结构的方式嵌套您的CSS选择器。
因此,与HTML的人,如
<div class="foo">
<ul>
<li class="item">
写不像
.foo {
ul {
li.item {
这是一个可怕的,可怕的想法,它使CSS的完全依赖的结构的结构HTML。如果您在HTML中更改一个嵌套级别,则CSS会中断。通常,这种方法会与许多针对标签名称(如ul
)定义的规则结合使用,而不是类名称,这会加重依赖关系,因此在HTML中将ul
更改为ol
会再次破坏规则。或者它与基于Bootstrap类的规则相结合,例如col-md-6
,所以如果您将其更改为col-md-4
,则会再次出现问题。
对于HTML,CSS规则应该是正交。它们代表了不同的层面。它们代表着在整个和整个HTML中有选择地应用的造型概念。
我猜测你写
#global {
.container {
#sidebar {
.title {
font-weight: bold;
,因为你是采用在LESS镜像HTML结构的这种错误的想法。然后,您会注意到,这会编译为包含多个ID的选择器,您认为这些ID必须效率低下(尽管实际上效率很低)。你自己在你的LESS中写入多余的嵌套层次,然后抱怨他们可能会降低性能!
更糟的是,您已经将HTML结构的假设硬编码到CSS中。这是无关紧要的,侧边栏碰巧落入global
元素内的.container
。所以不要写它们。也许在某个时候,您决定将container
类更改为container-fluid
。繁荣,即刻您的CSS断裂。这个标题应该大胆地被包含在一个container
类中,这在任何情况下都是一个布局相关的类,它与样式无关(或应该)无关,这有什么意义呢?如果您要使用预处理器嵌套在您的CSS中复制HTML结构,请回头编写内联样式。至少这样,当你改变你的HTML时,你只会有一个文件需要改变。
在设计CSS时,您应该认真考虑设计规则的问题,因为您在编写JS时需要考虑类和方法的设计。在这种情况下,你需要问自己:“什么特征说明我想要一些标题是大胆的情况?是什么驱使的?大胆的本质是什么?我用胆略来表达什么?大胆表达的语义概念是什么?”
假设您希望所有标题都是粗体。然后你只需简单地说:
.title { font-weight: bold }
假设您只希望标题在侧栏中显示为粗体。然后你只是这么说:
#sidebar .title { font-weight: bold; }
我的建议是去冷火鸡。在取款期间停止使用嵌套。用最小编写规则编号的选择器组件。重构您的类以具有语义名称(如title-emphasis
)。一旦你“清醒”,你可以回去谨慎使用较少的嵌套的能力时,它是有用的,比如也许悬停:
#boo {
color: red;
&:hover {
color: blue;
}
}
这实际上是有用的,从写#boo
两次可以节省您和组规则以易懂的方式呈现。
你的建议是不正确的;这样的选择器对于排除其中外部ID不在其中的内部页面或状态是有用的。 – SLaks 2014-09-19 15:36:32
此外,指定多个ID可能会提高规则的优先级,以防还有一个'#myTitle {font-weight:300; }'属性(只有一个ID)。当你和像我这样的ID痴迷开发人员一起工作时,有这些功能是很有用的。 – Katana314 2014-09-19 15:37:51
LESS不能假定在给定页面中'#sidebar'总是以'#global .container#sidebar'出现,即使它在该页面内是唯一的,这就是为什么它不会尝试通过以下方式删除前两个选择器:默认。但真正的问题是,为什么你要把它放在那里呢?这看起来更像是一个创作错误,而不是预处理器的限制。 – BoltClock 2014-09-19 15:37:54