You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LESS中向Mixin传递变量生成CSS类的问题求助

问题描述

刚接触LESS和Mixin,尝试编写Mixin动态生成带特定变量的CSS类,但代码无法正常工作,尤其是background-color: var(--var-@{color}-bg-subtle);开始失效。

现有LESS代码

@colors: primary, secondary, succes, info, warning, danger;

.create-inbox(@index) when (@index > 0) {
    @color: extract(@colors, @index);

    .inbox-@{color}-lighten {
        --var-inbox-color: var(--var-@{color});
        background-color: var(--var-@{color}-bg-subtle); // 从此处开始失效

        &[href] {
            color: var(--var-@{color});
            text-decoration: none;
            background-color: var(--var-@{color}-bg-subtle);

            &:is(:hover, :focus) {
                color: var(--var-@{color});
                text-decoration: none;
                background-color: var(--var-@{color}-bg-subtle)
            }
        }
    }

    .create-inbox(@index - 1);
}

.create-inbox(length(@colors));

期望编译结果

.inbox-primary-lighten {
    --var-inbox-color: var(--var-primary);
    background-color: var(--var-primary-bg-subtle)
}

.inbox-primary-lighten[href] {
    color: var(--var-primary);
    text-decoration: none;
    background-color: var(--var-primary-bg-subtle)
}

.inbox-primary-lighten[href]:is(:hover, :focus) {
    color: var(--var-primary);
    text-decoration: none;
    background-color: var(--var-primary-bg-subtle)
}
问题分析与解决
  • CSS变量插值语法问题:LESS中直接在var()内嵌套@{color}插值时,部分版本解析器无法正确识别拼接后的变量名。解决方法是先将完整的CSS变量名拼接成LESS变量,再传入var()中。
  • 拼写错误:@colors列表里的succes是拼写错误,应改为success,否则会生成错误的类名.inbox-succes-lighten。
  • 递归生成顺序(可选):原递归从列表最后一个元素开始生成类(先danger,后warning…最后primary),如果需要和@colors列表顺序一致(先primary,后secondary…),可调整递归逻辑从索引1开始递增到列表长度。

修改后的LESS代码

@colors: primary, secondary, success, info, warning, danger;

// 按列表顺序生成的版本
.create-inbox(@index) when (@index <= length(@colors)) {
    @color: extract(@colors, @index);
    // 先拼接完整的CSS变量名
    @cssVar: ~"--var-@{color}";
    @cssVarBg: ~"--var-@{color}-bg-subtle";

    .inbox-@{color}-lighten {
        --var-inbox-color: var(@cssVar);
        background-color: var(@cssVarBg);

        &[href] {
            color: var(@cssVar);
            text-decoration: none;
            background-color: var(@cssVarBg);

            &:is(:hover, :focus) {
                color: var(@cssVar);
                text-decoration: none;
                background-color: var(@cssVarBg);
            }
        }
    }

    .create-inbox(@index + 1);
}

.create-inbox(1);

编译后的CSS(以primary为例)

.inbox-primary-lighten {
    --var-inbox-color: var(--var-primary);
    background-color: var(--var-primary-bg-subtle);
}
.inbox-primary-lighten[href] {
    color: var(--var-primary);
    text-decoration: none;
    background-color: var(--var-primary-bg-subtle);
}
.inbox-primary-lighten[href]:is(:hover, :focus) {
    color: var(--var-primary);
    text-decoration: none;
    background-color: var(--var-primary-bg-subtle);
}

内容的提问来源于stack exchange,提问作者Jochem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:44