通过scss变量对elementUI进行主题色变更是否能使用var()函数?

需求是:在vue项目初始化前,拿到当前url中的color参数的值,作为elementUI的主题色,达到换肤的效果。(color参数是去掉#的十六进制颜色值)

那么根据官网的提供的方式,创建element-variables.scss,通过改变$--color-primary变量的形式可以达到切换主题色的效果,所以我现在的思路是:
main.js中截取当前url参数,拿到color的颜色值,通过以下方式绑定变量到根元素上

document.documentElement.style.setProperty("--color-primary", `颜色值`)

然后在element-variables.scss中直接使用var()函数引入--color-primary变量

/* 改变主题色变量 */
$--color-primary: var(--color-primary);

现在问题来了,编译器直接报错

 error  in ./src/assets/css/element-variables.scss

Syntax Error:
$--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
                         ^
      Argument `$color-2` of `mix($color-1, $color-2, $weight: 50%)` must be a color

所以,请教各位大佬,是scss中不能使用var()函数,还是我这种方式用的不对?如果要实现这个需求,通过改变scss变量值的方式要怎么实现?

阅读 3.5k
2 个回答

你可以在CSS中使用CSS变量和calc()函数来计算,而不是用mix()函数:

element-variables.scss:

scss

$--color-primary: #409EFF !default; // 默认的主题色

:export {
  colorPrimary: $--color-primary;
}

main.scss:

scss

@import './element-variables.scss';

:root {
  --color-primary: var(--color-primary, #{$colorPrimary}); 
}


.element-button {
  // 用CSS变量计算颜色值
  background-color: var(--color-primary);
  border-color: var(--color-primary);

  &:hover {
    background-color: rgba(var(--color-primary), 0.8);
    border-color: rgba(var(--color-primary), 0.8);
  }
}

sass函数无法使用带有 var() 函数变量的参数,因为 css 的 var 是在运行时工作的,而sass是要编译的,你改css变量之后sass并不会跟着编译
功能可以参考这篇文章换肤功能(scss、css变量)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题