使用“&”选择器混合而不更改 HTML class

Mixin using "&" selector without changing HTML class

我想请教一个关于mixin uage的问题

我的目标是使用 mixin 根据不同的语言更改 TESTING 的字体大小。主页 class 和语言 class 必须在 HTML 标签中设置。

<html class='Home en'>
    <body>
        <div class='text'>TESTING</div>
    </body>
</html>

CSS设置

.Home {
    .text {
        @include font(20)
    }
}

我写了一个 mixin 来根据不同的语言处理字体大小

@mixin font($size) {
    font-size: $size + px;

    .en & {
        font-size: $size - 5 + px;
    }
}

但是,输出将变为:.en .Home .text { ... } 而不是 .en.Home .text { ... }

我如何使用 mixin 处理这种情况?或者我可以使用任何其他替代方法来解决此问题而不更改 HTML 标记中的 class 吗?

谢谢大家!

您需要解析 & 引用并使用第一个选择器与 .en 连接,然后获取选择器的其余部分以构建完整的选择器。 & 是包含所有父选择器的列表列表,因此您可以使用 Sass 列表函数遍历列表。

尝试以下操作:

@mixin font($size) {
    font-size: $size + px;

    // Get the first parent selector, to aply the '.en'
    $root: nth(nth(&, 1), 1);

    // Get all the other parent selectors
    $rest : ();
    @for $i from 2 through length(nth(&, 1)) {
        $rest: append($rest, nth(nth(&, 1), $i));
    }

    // Create the selector
    $selector: unquote(".en#{$root} #{$rest}");

    // Print it at root
    @at-root #{$selector} {
        font-size: $size - 5 + px;
    }
}

检查工作代码here