我喜欢在 Less 中使用,:extend()就像在 Sass 中一样。
SCSS 中的示例:http ://codepen.io/Grawl/pen/qEeQPG
更少的示例: http: //codepen.io/Grawl/pen/qEeQpz(未工作)
预期输出:
.datalist-item {
display: block;
}
.datalist-item-term {
font-weight: normal;
}
.datalist-item-description {
font-weight: bold;
}
.datalist-float .datalist-item {
display: inline-block;
}
.datalist-float .datalist-item:not(:last-of-type) {
margin-right: 1em;
padding-right: 1em;
border-right: 1px solid;
}Run Code Online (Sandbox Code Playgroud)
目的是不自我重复,因此如果我在 Sass 中重命名一个类,我不必重命名其他类。
我知道我可以将根类放入一个变量中并使用它两次http://codepen.io/Grawl/pen/qEeQpz但它看起来很丑:(
您的 Sass (SCSS) 示例使用@extend-Only 选择器,这是某种特殊形式的扩展,Less 中不存在。
\n\n首先是“正常”扩展:
\n\n社会保障体系:
\n\n.class {\np: 1;\n}\n.class2 {\n@extend .class;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n以及更少:
\n\n.class {\np: 1;\n}\n.class2 {\n&:extend(.class);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n两者都编译为:
\n\n.class,\n.class2 {\n p: 1;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在 Less 中.class2 { &:extend(.class); }也可以写成.class2:extend(.class1){}
现在考虑以下使用 @extend-Only 选择器的 SCSS 代码:
\n\n%class {\n p: 1;\n}\n\n.class2 {\n@extend %class;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n上述代码编译成CSS代码如下:
\n\n.class2 {\n p: 1; }\nRun Code Online (Sandbox Code Playgroud)\n\nSass 文档告诉你:
\n\n\n\n\n@extend-Only 选择器
\n\n有时,您\xe2\x80\x99 会为您只想@extend 的类编写样式,而不想直接在HTML 中使用。在编写 Sass 库时尤其如此,您可以为用户提供样式,以便在需要时@extend,如果不需要则忽略。\xe2\x80\x99t。
\n\n如果为此使用普通类,则在生成样式表时最终会创建大量额外的 CSS,并且存在与 HTML 中使用的其他类发生冲突的风险。这就是为什么 Sass\n 支持 \xe2\x80\x9c 占位符选择器\xe2\x80\x9d(例如,%foo)。
\n\n占位符选择器看起来像类和 id 选择器,除了 #\n 或 . 被替换为%。它们可以在类或 id 可以使用的任何地方使用,并且它们本身可以防止规则集呈现为 CSS。
\n
在 Less 中,您将有两种选择来获得不生成输出的代码:
\n\n1)使用mixin,mixin不生成输出:
\n\n.class() {\np: 1;\n}\n.class2 {\n.class();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n.class2 {\n p: 1; \n}\nRun Code Online (Sandbox Code Playgroud)\n\n2)将不应输出的类放在不同的文件中,并使用referencekewyword 导入该文件:
文件1.less:
\n\n.class {\np: 1;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n文件2.less:
\n\n@import (reference) "file1";\n.class2 {\n&:extend(.class);\n}\nRun Code Online (Sandbox Code Playgroud)\n\nlessc file2.less现在将输出:
.class2 {\n p: 1; \n}\nRun Code Online (Sandbox Code Playgroud)\n\n但我首先同意评论中的@seven-phases-max。在您的示例中,无需使用扩展。@seven-phases-max 向您展示了一些解决此用例的示例。或者您可以考虑;使用父引用更改选择器顺序,这应该在Less和 SASS 中都有效:
\n\n.datalist-item {\n display: block;\n\n &-term {\n font-weight: normal;\n }\n\n &-description {\n font-weight: bold;\n }\n\n .datalist-float & {\n display: inline-block;\n\n &:not(:last-of-type) {\n margin-right: 1em;\n padding-right: 1em;\n border-right: 1px solid;\n } \n\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n编译成:
\n\n.datalist-item {\n display: block;\n}\n.datalist-item-term {\n font-weight: normal;\n}\n.datalist-item-description {\n font-weight: bold;\n}\n.datalist-float .datalist-item {\n display: inline-block;\n}\n.datalist-float .datalist-item:not(:last-of-type) {\n margin-right: 1em;\n padding-right: 1em;\n border-right: 1px solid;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n最后请注意,您正在使用属性的嵌套,例如:
\n\n border: {\n right: 1px solid;\n };\nRun Code Online (Sandbox Code Playgroud)\n\n应该编译成:
\n\nborder-right { \n1px solid; \n}\nRun Code Online (Sandbox Code Playgroud)\n\nLess 不支持属性嵌套。
\n