Ali*_*ati 3 css less twitter-bootstrap
我试图命名一些遗留引导程序css,直到我可以完全删除它.
大多数命名空间都有效,但使用.clearfix mixin的任何内容都在.legacy类下嵌套两次.
任何想法为什么会发生这种情况,或者如何避免它?
//原始index.less:
...
@import "../vendor/bootstrap/3.3.5/less/scaffolding.less";
@import "../vendor/bootstrap/3.3.5/less/type.less";
...
Run Code Online (Sandbox Code Playgroud)
//更新index.less:
.legacy {
...
@import "../vendor/bootstrap/3.3.5/less/scaffolding.less";
@import "../vendor/bootstrap/3.3.5/less/type.less";
...
}
Run Code Online (Sandbox Code Playgroud)
//预期输出:
...
.legacy h1 { ... }
.legacy .clearfix:before { ... }
.legacy .row:before { ... }
...
Run Code Online (Sandbox Code Playgroud)
//实际输出:
...
.legacy h1 { ... }
.legacy .clearfix:before { ... }
.legacy .legacy .row:before { ... }
...
Run Code Online (Sandbox Code Playgroud)
您可以通过导入已编译的CSS并使用(less)标志将其视为LESS 来避免这种情况:
.legacy {
@import (less) "../vendor/bootstrap/3.3.5/dist/css/bootstrap.css";
}
Run Code Online (Sandbox Code Playgroud)
您看到的有问题的双重嵌套实际上是预期的行为.
以下是对所发生情况的简化表示:
.legacy {
// The clearfix mixin
.clearfix() {
color: red;
}
// Implementation of the mixin so that the class can be used
.clearfix {
.clearfix();
}
// Extend:
.row {
&:extend(.clearfix all);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
.legacy .clearfix,
.legacy .legacy .row {
color: red;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,实现了简化.clearfix()方法,.row类使用语法扩展它&:extend(.clearfix all).值得注意的是,&符号&是一个LESS父选择器,表示父选择器字符串.
换句话说,如果我们&用父选择器替换它,它将是:
.legacy .row:extend(.clearfix all) {}
Run Code Online (Sandbox Code Playgroud)
由于.clearfix嵌套在下.legacy,你会得到双嵌套:
.legacy .legacy .row {
color: red;
}
Run Code Online (Sandbox Code Playgroud)
所有实现此mixin的类都在使用&:extend(.clearfix all),这导致您看到的双重冗余嵌套.