减:如何从地图中抓取整个规则集

问题描述 投票:1回答:1

我有一个嵌套规则集(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;
}
less
1个回答
1
投票

"Can't work this way currently (v3.9)".

我担心它不会起作用(特别是地图本身)。直觉上它会是这样的:

#usage {
    @typography[@h1]();
}

但目前这个功能(级联()[]运算符)没有实现。

像“将一个感兴趣的规则集分配给一个临时变量然后'调用'它”这样的第一个猜测解决方法也会失败:

#usage {
    @temp: @typography[@h1];
    @temp(); // error: not callable value
}

(这个实际上被算作一个bug - 我created一张专用票)。

这一切都将我们带到下一部分:


"Consider using mixin-based maps".

请注意,虽然“基于变量的映射”(又称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 and variables interop".

关于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.
}

© www.soinside.com 2019 - 2024. All rights reserved.