热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

具有旧版浏览器后备的CSS变量

如何解决《具有旧版浏览器后备的CSS变量》经验,为你挑选了2个好方法。

TL; DR:如何使用SCSS使CSS变量具有旧版浏览器的回退.

我试图理解这篇文章.在我看来,你必须已经是一个先进的SASS用户才能理解它,我不是.更糟糕的是,这是我在这个主题上发现的唯一一篇文章.

这是我想要实现的目标:

我的scss应该是这样的:

body {
  @include v(background-color, primary)
}

然后处理过的CSS应该是

body{
   background: yellow; /* Yellow being defined above as the primary color */
   background: var(--color-primary);
}

通过玩一下,我已经可以获得CSS变量的值,如下所示:

$colors: (
  primary: yellow,
);

:root {
  @each $name, $color in $colors {
    --color-#{$name}: $color;
  }
}

@mixin background-color($color_) {
  background: var(--color-#{$color_});
}

要使用它:

body{
  @include background-color(primary);
}

这将导致:

body {
    background: var(--color-primary);
    /* But the fallback is missing :(, I tried  things with the map-get but it's really eluding me... */
}

Ced.. 11

更新: Postcss自定义属性可以执行回退,并且比下面的代码更容易

第1步:声明scss变量

所以首先我们要把一些变量放在a中$map,我将使用颜色变量:

$colors: (
  primary: #FFBB00,
  secondary: #0969A2
);

第2步:自动化css 4 var生成

// ripped CSS4 vars out of color map
:root {
  // each item in color map
  @each $key, $value in $colors {
    --colors-#{$key}: $value;
  }
}

root中发生的是:对于颜色映射中的每个键和值,我们打印以下内容:

--colors-#{$key}: $value;

这对应于css变量声明.我相信在#{}键周围的奇怪位置是在值周围没有空格.结果是:

--colors-primary: #FFBB00,
--colors-secondary: #0969A2

请注意,prefix(--colors-)与其上方的scss颜色映射名称相同.为什么在最后一步会变得清晰.


第3步:大量的地图!

$props: (
  background-color: $colors
);

$map-maps: (
  background-color: colors
);

在这里,我们添加将$propscss属性映射到包含值的地图的地图.background-color将保持颜色,所以正确的地图是$colors.

map-maps是道具的副本,而不是地图,我们有所说的地图的名称.(这与步骤2中的注释有关).

第4步:让它成功!

@mixin v($prop, $var) {
  // get the map from map name
  $map: map-get($props, $prop);
  // fallback value, grab the variable's value from the map
  $var-fall: map-get($map, $var);
  // our css4 variable output
  $var-output: var(--#{$map}-#{$var});    
  #{$prop}: $var-fall;
  // css4 variable output
  #{$prop}: $var-output;
}

body{
  @include v(background-color, primary);
}

我简化了文章中的代码,它仍然有效,至少在这个例子中,文章中的代码需要更多考虑.

无论如何,这是发生的事情.

首先,我们将mixin称为:

  @include v(background-color, primary);

然后进入,

 $map: map-get($props, $prop); // map-get($props, background-color)

我们有一个变量调用$map,我们在$props映射中分配background-color恰好是$colors映射的键的值.这是一个迷宫,但一旦解决它并不复杂.

然后为后备:

 $var-fall: map-get($map, $var);

这只是获取我们刚刚得到的地图(这是值$colors)在$var键(这恰好是初级).结果是#FFBB00.

对于css var

  $map-name: map-get($map-maps, $prop);
  $var-output: var(--#{$map-name}-#{$var});

我们重新创建了我们在@each循环中生成var的方法


整个代码是:

$colors: (
  primary: #FFBB00,
  secondary: #0969A2
);

// ripped CSS4 vars out of color map
:root {
  // each item in color map
  @each $name, $color in $colors {
    --colors-#{$name}: $color;
  }
}



$props: (
  background-color: $colors,
  color:            $colors
);

$map-maps: (
  background-color: colors
);



@mixin v($prop, $var) {
  // get the map from map name
  $map: map-get($props, $prop);
  // fallback value, grab the variable's value from the map
  $var-fall: map-get($map, $var);
  // our css4 variable output

  $map-name: map-get($map-maps, $prop);
  $var-output: var(--#{$map-name}-#{$var});

  #{$prop}: $var-fall;
  // css4 variable output
  #{$prop}: $var-output;
}

body{
  @include v(background-color, primary);
}

现在,这是对本文所做内容的简化.您应该检查它以使代码更健壮.



1> Ced..:

更新: Postcss自定义属性可以执行回退,并且比下面的代码更容易

第1步:声明scss变量

所以首先我们要把一些变量放在a中$map,我将使用颜色变量:

$colors: (
  primary: #FFBB00,
  secondary: #0969A2
);

第2步:自动化css 4 var生成

// ripped CSS4 vars out of color map
:root {
  // each item in color map
  @each $key, $value in $colors {
    --colors-#{$key}: $value;
  }
}

root中发生的是:对于颜色映射中的每个键和值,我们打印以下内容:

--colors-#{$key}: $value;

这对应于css变量声明.我相信在#{}键周围的奇怪位置是在值周围没有空格.结果是:

--colors-primary: #FFBB00,
--colors-secondary: #0969A2

请注意,prefix(--colors-)与其上方的scss颜色映射名称相同.为什么在最后一步会变得清晰.


第3步:大量的地图!

$props: (
  background-color: $colors
);

$map-maps: (
  background-color: colors
);

在这里,我们添加将$propscss属性映射到包含值的地图的地图.background-color将保持颜色,所以正确的地图是$colors.

map-maps是道具的副本,而不是地图,我们有所说的地图的名称.(这与步骤2中的注释有关).

第4步:让它成功!

@mixin v($prop, $var) {
  // get the map from map name
  $map: map-get($props, $prop);
  // fallback value, grab the variable's value from the map
  $var-fall: map-get($map, $var);
  // our css4 variable output
  $var-output: var(--#{$map}-#{$var});    
  #{$prop}: $var-fall;
  // css4 variable output
  #{$prop}: $var-output;
}

body{
  @include v(background-color, primary);
}

我简化了文章中的代码,它仍然有效,至少在这个例子中,文章中的代码需要更多考虑.

无论如何,这是发生的事情.

首先,我们将mixin称为:

  @include v(background-color, primary);

然后进入,

 $map: map-get($props, $prop); // map-get($props, background-color)

我们有一个变量调用$map,我们在$props映射中分配background-color恰好是$colors映射的键的值.这是一个迷宫,但一旦解决它并不复杂.

然后为后备:

 $var-fall: map-get($map, $var);

这只是获取我们刚刚得到的地图(这是值$colors)在$var键(这恰好是初级).结果是#FFBB00.

对于css var

  $map-name: map-get($map-maps, $prop);
  $var-output: var(--#{$map-name}-#{$var});

我们重新创建了我们在@each循环中生成var的方法


整个代码是:

$colors: (
  primary: #FFBB00,
  secondary: #0969A2
);

// ripped CSS4 vars out of color map
:root {
  // each item in color map
  @each $name, $color in $colors {
    --colors-#{$name}: $color;
  }
}



$props: (
  background-color: $colors,
  color:            $colors
);

$map-maps: (
  background-color: colors
);



@mixin v($prop, $var) {
  // get the map from map name
  $map: map-get($props, $prop);
  // fallback value, grab the variable's value from the map
  $var-fall: map-get($map, $var);
  // our css4 variable output

  $map-name: map-get($map-maps, $prop);
  $var-output: var(--#{$map-name}-#{$var});

  #{$prop}: $var-fall;
  // css4 variable output
  #{$prop}: $var-output;
}

body{
  @include v(background-color, primary);
}

现在,这是对本文所做内容的简化.您应该检查它以使代码更健壮.



2> rdhainaut..:

如果您使用的是Sass,则可以通过Sass mixin自动执行后备。创建一个CSS变量名称及其值的映射,然后可以在mixin中查找这些值,以输出后备样式和首选样式

$vars: (
  primary: yellow,
);

:root {
  --primary: map-get($vars, primary);
}

@mixin var($property, $varName) {
  #{$property}: map-get($vars, $varName);
  #{$property}: var(--#{$varName});
}

上面的mixin的用法如下:

body {
  @include var(background-color, primary);
}

并输出以下CSS:

:root {
  --primary: yellow;
}

body {
  background-color: yellow;
  background-color: var(--primary);
}

Etvoilà:)


顺便说一句,不错,某些postCSS插件会自动执行此操作(如果我没记错的话,这称为自定义属性)。我最终使用它,因为它更方便
仅供参考,您需要插值map-get,因此--- primary:#{map-get($ vars,primary)};`
推荐阅读
author-avatar
8877Lyt_953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有