在 less 中扩展父子嵌套选择器
extend parent and children nested selectors in less
背景:
我在使用 Bootstrap 3 作为 CSS 框架创建新项目时尝试使用语义标记,我主要使用 less 的扩展功能来应用 bootstrap样式。但是,当我尝试扩展嵌套选择器时,less 并没有创建我期望的 CSS 输出。
这是我 运行 遇到的问题的一个简单示例:
HTML 标记:
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
</ul>
</nav>
更少
.parent-class{
parentProperty: value;
.child-class { parentChildProperty: value; }
}
.child-class {
childProperty:value;
& > li{ childLiProperty:value; }
}
nav{
&:extend(.parent-class all);
ul{
&:extend(.child-class all);
}
}
实际CSS输出:
.parent-class,
nav {
parentProperty: value;
}
.parent-class .child-class,
nav .child-class,
.parent-class nav ul {
parentChildProperty: value;
}
.child-class,
nav ul {
childProperty: value;
}
.child-class > li,
nav ul > li {
childLiProperty: value;
}
问题
输出的问题是 parentChildProperty 不会应用于 ul 元素,因为选择器 nav ul 未生成。我最初的期望是少根据嵌套来推断这个选择器。但是,这似乎不起作用。
此外,正在生成不需要的 .parent-class nav ul 选择器。我意识到这是因为在使用 .child-class 扩展 ul 时使用了 all 关键字。但是,如果没有 all 关键字,childLiProperty 将无法正确应用。理想情况下,我的首选输出如下例所示。
期望的输出
.parent-class,
nav {
parentProperty: value;
}
.parent-class .child-class,
nav ul {
parentChildProperty: value;
}
.child-class,
nav ul {
childProperty: value;
}
.child-class > li,
nav ul > li {
childLiProperty: value;
}
是否有任何方法可以使用 less 实现预期的行为,或者是否有更好的方法来构造 less 样式以实现使用语义 html 和 bootstrap 的目标?
parentChildProperty
未应用于 ul
元素的问题可以通过在 ul
样式
中扩展 .parent-class .child-class
来解决
这并不能解决所有问题。它仍然会在生成的 CSS 中留下许多不必要的选择器,但它会生成所需的 CSS 以允许页面正确显示。
更新少:
.parent-class{
parentProperty: value;
.child-class { parentChildProperty: value; }
}
.child-class {
childProperty:value;
& > li{ childLiProperty:value; }
}
nav{
&:extend(.parent-class all);
ul{
&:extend(.child-class all);
&:extend(.parent-class .child-class);
}
}
背景:
我在使用 Bootstrap 3 作为 CSS 框架创建新项目时尝试使用语义标记,我主要使用 less 的扩展功能来应用 bootstrap样式。但是,当我尝试扩展嵌套选择器时,less 并没有创建我期望的 CSS 输出。
这是我 运行 遇到的问题的一个简单示例:
HTML 标记:
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
</ul>
</nav>
更少
.parent-class{
parentProperty: value;
.child-class { parentChildProperty: value; }
}
.child-class {
childProperty:value;
& > li{ childLiProperty:value; }
}
nav{
&:extend(.parent-class all);
ul{
&:extend(.child-class all);
}
}
实际CSS输出:
.parent-class,
nav {
parentProperty: value;
}
.parent-class .child-class,
nav .child-class,
.parent-class nav ul {
parentChildProperty: value;
}
.child-class,
nav ul {
childProperty: value;
}
.child-class > li,
nav ul > li {
childLiProperty: value;
}
问题
输出的问题是 parentChildProperty 不会应用于 ul 元素,因为选择器 nav ul 未生成。我最初的期望是少根据嵌套来推断这个选择器。但是,这似乎不起作用。
此外,正在生成不需要的 .parent-class nav ul 选择器。我意识到这是因为在使用 .child-class 扩展 ul 时使用了 all 关键字。但是,如果没有 all 关键字,childLiProperty 将无法正确应用。理想情况下,我的首选输出如下例所示。
期望的输出
.parent-class,
nav {
parentProperty: value;
}
.parent-class .child-class,
nav ul {
parentChildProperty: value;
}
.child-class,
nav ul {
childProperty: value;
}
.child-class > li,
nav ul > li {
childLiProperty: value;
}
是否有任何方法可以使用 less 实现预期的行为,或者是否有更好的方法来构造 less 样式以实现使用语义 html 和 bootstrap 的目标?
parentChildProperty
未应用于 ul
元素的问题可以通过在 ul
样式
.parent-class .child-class
来解决
这并不能解决所有问题。它仍然会在生成的 CSS 中留下许多不必要的选择器,但它会生成所需的 CSS 以允许页面正确显示。
更新少:
.parent-class{
parentProperty: value;
.child-class { parentChildProperty: value; }
}
.child-class {
childProperty:value;
& > li{ childLiProperty:value; }
}
nav{
&:extend(.parent-class all);
ul{
&:extend(.child-class all);
&:extend(.parent-class .child-class);
}
}