我有一个嵌套规则集(map),如下所示。
@typography: {
@h1: {
font: roboto;
font-weight: 300;
font-size: 9.6rem;
line-height: 9.6rem;
text-transform:none;
}
}
我知道如何检索和输出单个键,如[font],但有没有办法返回并输出整个内部规则集?
.myclass {
font: roboto;
font-weight: 300;
font-size: 9.6rem;
line-height: 9.6rem;
text-transform:none;
}
我担心它不会起作用(特别是地图本身)。直觉上它会是这样的:
#usage {
@typography[@h1]();
}
但目前这个功能(级联()
和[]
运算符)没有实现。
像“将一个感兴趣的规则集分配给一个临时变量然后'调用'它”这样的第一个猜测解决方法也会失败:
#usage {
@temp: @typography[@h1];
@temp(); // error: not callable value
}
(这个实际上被算作一个bug - 我created一张专用票)。
这一切都将我们带到下一部分:
请注意,虽然“基于变量的映射”(又称DR)似乎是一种更广泛的模式,但是Less中有five different methods to define a map(并且这些方法的无限数量排列定义了N维(又名“嵌套”))地图)。
每种方法都有其优点和缺点,到目前为止还不清楚选择哪一种作为“首选”(从长远来看,有可能将它们统一为尽可能整洁,但到目前为止还远远不够)。
现在看看你试图表达的结构,而不是坚持“变量 - > @variable
”刻板印象。它看起来不像常规的CSS规则集:
.typography {
.h1 {
font: roboto;
font-weight: 300;
font-size: 9.6rem;
line-height: 9.6rem;
text-transform: none;
}
}
?
这样你已经有了一个“基于mixin的地图”,你可以像使用“基于变量的地图”一样使用它。 (实际上,“地图”的当前documentation也建议两种方法都不强制执行任何一种作为“主要”)。
您对此“CSS”结构所需的唯一修改是使其内部或外部(或两者)规则集成为参数混合(通过添加()
),以便默认情况下规则不会出现在编译的CSS中。
例如。像这样:
.typography {
.h1() {
...
或者像这样:
.typography() {
.h1 {
...
(如果您更喜欢这些标识符,也可以使用#
而不是.
)。
现在回到您的用例(解决方案):
.typography {
.h1() {
font: roboto;
font-weight: 300;
font-size: 9.6rem;
line-height: 9.6rem;
text-transform: none;
}
}
#usage-1 {
// "expand" the set of rules:
.typography.h1(); // OK
}
#usage-2 {
// use individual value from the map:
r: .typography.h1[font]; // OK
}
#usage-3 {
// iterate through:
each(.typography.h1(), <...>); // OK
}
// etc.
毫不奇怪,扩大一系列规则是mixins首先被发明的。
在“基于变量”和“基于混合”的映射之间要记住的唯一根本区别(除了当前限制/问题如何使用)是“变量(和属性)覆盖”和“规则集”(因此mixins)级联“。当您需要通过“外部代码”(例如“主题/子主题”等)定制/修改CSS数据时,这可能会影响某些特定细节 - 但这是另一个重要故事,所以我不会进入它在这里,虽然请参阅下一节的一些提示。
关于mixins的一个更重要的事情(在用例的上下文中)。
如果我们将变量视为抽象编程事物,即“与值相关联的标识符(符号名称)”,我们很快就会看到mixin就是:变量。
“mixin”(它的名字)实际上只是一个引用值的标识符,即 - >变量。
它只是标识符字符(前面的#
或.
)加上它可以容纳什么样的值的限制是什么使得它被不同的标题引用,即“mixin”而不是“变量”(如“减去@variable
“)。
换句话说,当谈到“我有一些数据并且我需要一些东西(即”变量“)来保持/表示它时,重要的是不要自动落入”一个变量(在一般意义上) - > @variable
“陷阱。
因此,回到Q,要记住的另一个技巧是知道mixin和变量值(特别是如果它是“规则集”值)可以(几乎)自由地分配/重新分配给对方。即基本上,您可以创建一个变量来引用基于mixin的地图,并创建一个mixin来引用基于变量的地图。这对于克服两种方法的当前问题/限制(主要是在使用中)可能是有价值的(或者如果您更喜欢使用地图的@
,.
或#
“code-look”)。
这里有一些提示:
// ................
// "Universal" map:
.typography {
.h1() {
font: roboto;
font-weight: 300;
font-size: 9.6rem;
line-height: 9.6rem;
text-transform: none;
}
@h1: {.typography.h1}; // assign mixin to variable
.h2() {@h1()} // assign variable to mixin
.h3() {.typography.h1} // assign mixin to mixin
@h2: @h1; // assign variable to variable
}
@typography: {.typography}; // assign mixin to variable
.graphytypo {.typography} // assign mixin to mixin
// etc.
// ................
// Usage:
#usage-1 {
// use individual values from the map (all roboto):
1: .typography.h1[font];
2: .typography[@h1][font];
3: .typography.h2[font];
4: .typography.h3[font];
5: .typography[@h2][font];
6: @typography[@h1][font]; // <- like your original map
7: .graphytypo.h3[font];
// etc.
}
#usage-2 {
// expand a set of .h1 rules (all the same):
.typography.h1();
.typography.h2();
.graphytypo.h3();
// etc.
}