一行代码实现 scss 里用与符号实现组合选择器

发布于 2021-11-18 13:14:40 字数 2168 浏览 1338 评论 0

引题

在我们日常的 css 中,可能会用到这样的选择器组合:

.abc--x.abc--y {
    color: #ddd;
}

而如果用 scss 直观的写是这样的:

.abc {
    &--x&--y {
        color: #ddd;
    }
}

可以在线体验。而如果通过 #{} 字符串方法来写的话:

.abc {
    #{&--x&--y} {
      color: #ddd;
    }
}

// 编译之后是这样的:
.abc .abc --x .abc --y {
  color: #ddd;
}

添加 @at-root 之后:

.abc {
    @at-root #{&--x&--y} {
      color: #ddd;
    }
}

// 编译之后是这样的:
.abc --x .abc --y {
  color: #ddd;
}

以上都可以看到,编译之后的选择器里多了一个空格。

去空格

那么,如何去除空格呢?很可惜,scss 没有内置的直接方法,不过可以自己实现(来源于 Stack Overflow):

@function string-remove-whitespace($string) {
    @while (str-index($string, ' ') != null) {
        $index: str-index($string, ' ');
        $string: #{str-slice($string, 0, $index - 1)}#{str-slice($string, $index + 1)};
    }
    @return $string;
}

#{string-remove-whitespace(".abc .def")} {
  color: #ddd;
}

// 编译结果:
.abc.def {
  color: #ddd;
}

选择器组合

基于以上正确结果,我们封装一个选择组合的方法。

@function unify-selector($selectorA, $selectorB) {
  @return #{string-remove-whitespace(#{$selectorA$selectorB})}
}

.abc {
  @at-root #{unify-selector(&--x, &--y)} {
    color: #ddd;
  }
}

// 编译结果
.abc--x.abc--y {
  color: #ddd;
}

完整结果在 codepen 上体验。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

少女净妖师

暂无简介

0 文章
0 评论
673 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文