Mixin使用"&"选择器而不更改HTML类

时间:2018-06-01 07:25:27

标签: html sass mixins

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

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

<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标记中的类吗?

全部谢谢!

1 个答案:

答案 0 :(得分:2)

您需要解析&引用并使用第一个选择器与.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