【问题标题】:Prevent duplication of CSS custom properties when using prefers-color-scheme使用 prefers-color-scheme 时防止重复 CSS 自定义属性
【发布时间】:2020-11-25 14:58:57
【问题描述】:

我使用大约 60 个自定义属性在我的 Web 应用程序上处理主题。目前我有 2 个主题:光明和黑暗(我知道的原创)。

因为可以使用用户的偏好(通过类)以及基于他们的操作系统偏好使用:@media (prefers-color-scheme: dark) 来设置深色主题,所以我最终复制了深色主题属性。这在维护方面不是一个大问题,因为我使用 SCSS 生成主题。但它确实在输出中复制了它,我可能会删除 60 行。

为了您的观看乐趣,我删除了一些属性:

:root,
.theme--light {
  --theme-style-1: #fff;
  --theme-style-2: rgba(0, 0, 0, 0.05);
}    
@media (prefers-color-scheme: dark) {
    :root {
        --theme-style-1: #444; // duplicated
        --theme-style-2: rgba(255, 255, 255, 0.1); // duplicated
    }
}    
.theme--dark {
    --theme-style-1: #444; // duplicated
    --theme-style-2: rgba(255, 255, 255, 0.1); // duplicated
}

那么我的问题是,有没有办法防止重复?

这是生成主题的 SCSS,除了重复之外,它可以完美地工作:

:root,
.theme--light{
    @each $varName, $value in $themeBase__map {
        --#{$varName}: $value;
    }
}    
@media (prefers-color-scheme: dark) {
    :root {
    @each $varName, $value in $themeDark__map {
        --#{$varName}: $value;
    }
    }
}    
.theme--dark {
    @each $varName, $value in $themeDark__map {
        --#{$varName}: $value;
    }
}

但我尝试在媒体查询中使用 @extend .theme__dark,如下所示:

@media (prefers-color-scheme: dark) {
    :root {
        @extend .theme--dark;
    }
}

这会产生这个可爱的错误(这很明显):

欣赏您可能有的任何想法。

【问题讨论】:

    标签: css sass themes custom-properties


    【解决方案1】:

    您不能媒体查询中,@extend 不能在媒体查询之外。如果它只是简单地复制它而不是尝试编写选择器,那肯定会很好。但它没有,所以你不能。

    解决方案:- 使用 mixin

    如果您要在媒体查询内部外部重用一段代码,并且仍想扩展它,那么同时编写@mixin还有一个@extend 类:

    @mixin foo {
        // Put something here...
    }
    
    %foo {
        @include foo;
    }
    
    // usage
    .foo {
        @extend %foo;
    }
    
    @media (min-width: 1024px) {
        .bar {
            @include foo;
        }
    }
    

    如果有人不知道 % 选择器是什么,它只是一个占位符选择器,也就是说,它不会被编译成 CSS,但你可以重用代码。

    【讨论】:

    • 感谢您的回复,但我试图防止编译文件中的重复。 mixin / extend 方法仍然会复制样式。
    • @ChrisSpittles 除非 Sass 允许从媒体内部扩展外部选择器,否则我们无法摆脱重复。此功能存在一些未解决的问题。我希望它会尽快实施。
    • 可以不用SASS吗?因为我没有使用扩展。我正在从地图中为每个类生成属性。
    • @ChrisSpittles 使用 Sass,编译后的 css 将产生重复。这就是我的想法。但我会把它留给更有经验的开发人员。如果我找到解决方案,我会与您分享。
    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2019-12-18
    • 2022-09-24
    • 2019-09-11
    • 2022-07-29
    • 1970-01-01
    • 2020-11-18
    • 2021-05-27
    相关资源
    最近更新 更多