【问题标题】:Generate CSS classes from a list of values in LESS从 LESS 中的值列表生成 CSS 类
【发布时间】:2019-05-15 12:37:04
【问题描述】:

我有一个 LESS 循环,它生成不同的 CSS(增量)类,从列表中提取颜色值。

我目前的 LESS 代码如下:

.generate-detached(#f00, #0f0, #00f);

.generate-detached(@colors...) 
{
    .generate-detached-loop(1, @colors);
}

.generate-detached-loop(@i; @colors) when (@i <= length(@colors)) {
    @color: extract(@colors, @i);

    .detached-@{i} 
    {
        box-shadow: inset 0px 0px 8px 2px @color;

        > .toolbar > .drag-controls_container > .drag-control:before
        {
            box-shadow: inset 0px 0px 5px 1px @color;
        }
    }

    .generate-detached-loop((@i + 1), @colors);
}

生成的 CSS 代码为:

.detached-1 {
    box-shadow: inset 0px 0px 8px 2px #f00;
}
.detached-1 > .toolbar > .drag-controls_container > .drag-control:before {
    box-shadow: inset 0px 0px 5px 1px #f00;
}
.detached-2 {
    box-shadow: inset 0px 0px 8px 2px #0f0;
}
.detached-2 > .toolbar > .drag-controls_container > .drag-control:before {
    box-shadow: inset 0px 0px 5px 1px #0f0;
}
.detached-3 {
    box-shadow: inset 0px 0px 8px 2px #00f;
}
.detached-3 > .toolbar > .drag-controls_container > .drag-control:before {
    box-shadow: inset 0px 0px 5px 1px #00f;
}

也许我正在使用旧的 LESS 结构并且实际上存在一些新技术或一般来说......您有什么想法来改进解决方案吗?

【问题讨论】:

  • 您要解决什么问题?你只是问这是否是一个好的解决方案?
  • 我知道它运行正确,但它非常冗长且有点难以理解。我认为在 LESS 的最新版本中可能会有一些新功能,可以让代码更紧凑或更直观地实现相同的结果(例如新的 if() 语句而不是旧的 when() 守卫)跨度>
  • 一个例子可能是新的 if() 语句而不是旧的 when() 守卫 - 如果您的意思是 Less v3 中的 if 函数不能替代 @987654326 @守卫。

标签: less less-mixins


【解决方案1】:

更多的是关于对现有语言特征的知识和理解,而不是语言特征本身。

即即使在 Less v2(您可能正在使用)中,也很难证明您那里存在 4 行额外的 .generate-detached(@colors...) mixin。

例如为什么不:

@detached-colors: #f00 #0f0 #00f;

.detached-loop(@i: length(@detached-colors)) when (@i > 0) {
    .detached-loop(@i - 1);
    .detached-@{i} {
        @c: extract(@detached-colors, @i);
        box-shadow: inset 0px 0px 8px 2px @c;
        > .toolbar > .drag-controls_container > .drag-control:before {
            box-shadow: inset 0px 0px 5px 1px @c;
        }
    }
} .detached-loop;

.make-detached(#f00 #0f0 #00f);
.make-detached(@colors, @i: length(@colors)) when (@i > 0) {
    .make-detached(@colors, @i - 1);
    .detached-@{i} {
        @c: extract(@colors, @i);
        box-shadow: inset 0px 0px 8px 2px @c;
        > .toolbar > .drag-controls_container > .drag-control:before {
            box-shadow: inset 0px 0px 5px 1px @c;
        }
    }
}

?


Less v3 有each 功能:

each(#f00 #0f0 #00f, {
    .detached-@{index} {
        box-shadow: inset 0px 0px 8px 2px @value;
        > .toolbar > .drag-controls_container > .drag-control:before {
            box-shadow: inset 0px 0px 5px 1px @value;
        }
    }
});

但对于作为插件的 Less v2 也存在类似的情况:

.for-each(@c, @i in @l: #f00 #0f0 #00f) {
    .detached-@{i} {
        box-shadow: inset 0px 0px 8px 2px @c;
        > .toolbar > .drag-controls_container > .drag-control:before {
            box-shadow: inset 0px 0px 5px 1px @c;
        }
    }
}

【讨论】:

  • 我从[stackoverflow.com/questions/28151864/…类似问题解决方案)开始开发这段代码。无论如何,您的第一个解决方案运行正确,但值存储在地图中?第二个有一些错误,因为它也打印“颜色”或“提取(颜色)”(至少尝试使用 [lesscss.org/less-preview/](less-preview))。 v3 版本非常小巧紧凑,唯一的问题是无法将循环定义与值声明分开
  • 我看到可以在声明@detached-colors:#f00 #0f0 #00f;的每个版本中更改一点v3,然后用each(@detached-colors, {替换每个定义真的不错。只是一个剩下的问题,它如何定义 @detached-colors:#f00 #0f0 #00f; 的不同值?我也尝试删除空格并且它继续工作,所以它不是分隔值的空格的存在......我不明白它是什么类型的构造,我无法在官方文档中找到关于它的文档跨度>
  • 至于@detached-colors:#f00 #0f0 #00f; - 我故意没有使用变量(除了示例#2)只是因为 you 没有在你的 sn-p 中(因此.generate-detached(#f00, #0f0, #00f); ->each(#f00 #0f0 #00f ...).
  • #f00 #0f0 #00f -嗯,它 space separated list 的值(通常逗号和空格列表之间没有关键区别(不计算上下文相关的约定,如 func arg list等等))。 我也尝试删除空格并且它继续工作 - 不要依赖它 - 在这种特殊情况下,空格可以被省略,因为# 本身是一个明确的分隔符(所以空格像在压缩的 CSS 中一样自动假定)-但通常必须有空格(好吧,假设您要编写人类可读的代码)。
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 2014-10-13
  • 2014-12-31
  • 2013-12-13
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多