css - 在 SASS 中生成动态颜色图

标签 css sass

我正在尝试生成一个相当自动化的系统来定义 SASS 中的颜色。我有一个颜色列表,用十六进制值定义(像这样:$color--deep-ocean: #123143;)和全局 $colors: (); 定义。

然后我想动态地创建它们的 RGBA 值,并且考虑到变量插值在 SASS 中不是一个选项,我已经尝试过贴图。

我的想法是为 set-color 函数提供一个名称和一种颜色,以使用 map-merge 填充我的 $colors 变量,然后我可以使用 get-color 检索它。下面是我的两个函数定义以及我如何尝试使用它们:

@function color-set($name, $hex) {
    $submap: (hex: $hex);

    @for $o from 0 to 20 { // Going in increments of 5
        $percentage-decimal: $o*0.05;
        $percentage: $o*5;
        $submap: map-merge($submap, ($percentage: rgba($hex, $percentage-decimal)));
    }

    $colors: map-merge($colors, ($name: $submap));
    /* We should then have a map that looks like this:
    $colors: (colorname: (
    hex: #000000,
    0: rgba(0,0,0,0),
    5: rgba(0,0,0,.05),
    // and so on…
    100: rgba(0,0,0,1)
    )
    )
    … right? */
}

@function color-get($name, $opacity: hex) {
    @if $opacity != hex { // Returns RGBA value
        @return map-get(map-get($colors,$name), $opacity);
    }
    @else { // Returns hexidecimal value
        @return map-get(map-get($colors,$name), hex);
    }
}

如果我的功能令人困惑,请告诉我!我会尝试更好地评论它们。

这就是我尝试定义颜色的方式(_variables.scss 的一部分):

color-set(bkgrnd, $color--deep-ocean);

下面是我尝试使用我的颜色的方式:

body { // These colours have been defined, too …supposedly
    background-color: color-get(bkgrnd, 80);
    color: color-get(white);
}

这是我在 _variables.scss 上遇到的错误:

“...ackground color”后的 CSS 无效:需要 1 个选择器或 at-rule,是“color-set(bkgrnd, $”

所以我觉得我错过了什么。我已经为这个问题纠结了四个小时,我快要疯了。这可能是 super 简单的东西,但我似乎无法弄清楚。我随便使用 SASS,所以我可能没有意识到一些语法问题,但如果有人知道如何解决这个问题,我将不胜感激。

祝你有美好的一天,感谢你花时间阅读我的帖子!

问候, 克里斯

PS:如果该信息相关,我会使用 Brackets SASS 插件在 Brackets 中编译它。

最佳答案

在进一步挖掘之后,我发现了我的问题所在。 SASS 函数必须有一个 @return 指令才能工作。因此,我更新了我的 color-set 函数,并在它的末尾添加了 @return $colors;。然后,我只需要给出一些指令,这样该函数就不会被“突然”调用,所以我将我的 $colors 变量分配给它,如下所示:

$colors: color-set(bkgrnd, $color--deep-ocean);

我认为一直将 $colors 重新分配给它自己可能有点重复,但考虑到这只会影响编译期间的性能,而不影响我最终的 CSS 文件,我可以摆脱它。可能有更好的方法(如果你有想法,我会洗耳恭听!)但现在这正好符合我的需要。

这样,我就可以使用贴图处理我的颜色。感谢任何看过我的问题的人,很抱歉张贴这个 - 我应该花一些时间冷静下来再考虑一下。我希望这可以帮助遇到同样问题的其他人解决他们的问题!

保重,

克里斯

PS:如果你想要它,下面是完整的代码。

_colors.scss

$color--deep-ocean: #123143;
$color--yellow: #ffce00;
// And so on, and so forth…

_mixins.scss

@function color-set($name, $hexval) {
    @return map-merge($colors, ($name: $hexval));
}

@function color-get($name, $opacity: hex) {
    @if $opacity != hex { // Returns RGBA value
        $opacity-decimal: $opacity/100;
        @return rgba(map-get($colors,$name), $opacity-decimal);
    }
    @else { // Returns hexidecimal value
        @return map-get($colors, $name);
    }
}

_variables.scss

$colors: color-set(bkgrnd, $color--deep-ocean);
$colors: color-set(main, $color--yellow);
// And so on, and so forth again…

使用示例:

body {
    background-color: color-get(bkgrnd); // Returns #123143
    color: color-get(main); // Returns #ffce00
}

button {
    border: 2px solid color-get(main, 50); // Returns rgba(255, 206, 0, 0.5)
}

关于css - 在 SASS 中生成动态颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42984945/

相关文章:

reactjs - 如何在我的 React 组件中使用 SCSS 变量

html - 为什么 ul 不使用完整导航的高度?

css - 宽度过渡不适用于 FF 中的::之后

ruby - 您可以配置 Compass 以删除不需要的开发文件,即 sourcemaps 吗?

HTML 表格在隐藏单元格时留下空白

html - 文本有边框环绕

html - 如何保证两个词在同一行?

css - 转换 css 在 ajax 调用时丢失

javascript - 如何验证 uploadFile js 中的格式

html - 为什么文本被推向圆圈的顶部