经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS3 » 查看文章
详解利用css3的var()实现运行时改变scss的变量值_css3_CSS
来源:jb51  时间:2021/3/8 11:19:25  对本文有异议

var()介绍与使用

详情(MDN) IE无效,其余主流浏览器有效

var()使用

只能在{}内声明,作用范围由{}的选择器决定

  1. <!-- 声明 -->
  2. body{
  3. --name:value;//body内有效
  4. }
  5.  
  6.  
  7. <!-- 使用 -->
  8. .test{
  9. attr: var(--name,defaultValue) //当--name不存在时,使用defaultValue
  10. var(--name):#369;//错误使用方式
  11. }
  12.  

CSS中原生的变量定义语法是:–*,变量使用语法是:var(–*),其中*表示我们的变量名称。

但是,不能包含$,[,^,(,%等字符,普通字符局限在只要是“数字[0-9]”“字母[a-zA-Z]”“下划线_”和“短横线-”这些组合,但是可以是中文,日文或者韩文。

运行时改变scss变量值

这个方法并不是能直接改变scsss变量的值,但是能做到一样的效果,对于需要一个变量控制多个属性的更为有效简洁
单变量控制单条属性的就没必要用了,这方法就是修改style属性而已,单对单和你之间在style写那条属性是一样的

原理(English)

简单来说就是将scss的变量交由css变量控制

  1. $colors: (
  2. primary: #FFBB00,
  3. secondary: #0969A2
  4. );
  5.  
  6. Selector1{
  7. @each $name, $color in $colors {
  8. --color-#{$name}: $color;
  9. }
  10. }
  11.  
  12. <!-- Selector1的生成效果 -->
  13. :root {
  14. --color-primary: #FFBB00;
  15. --color-secondary: #0969A2;
  16. }
  17.  
  18.  
  19. <!-- 使用方式一 直接使用css变量 -->
  20. Selector{
  21. color:var(--color-primary);
  22. }
  23.  
  24. <!-- 使用方式二 利用scss的函数,以符合scss语法 推荐 -->
  25. @function color($color-name) {
  26. @return var(--color-#{$color-name});
  27. }
  28.  
  29. body {
  30. color: color(primary); //使用
  31. }
  32.  
  33. <!-- body生成效果 -->
  34. body {
  35. color: var(--color-primary); //这样就可以被js设置了
  36. }
  37.  

js设置css变量,即设置运行scss变量

  1. domObject.style.setProperty(name,value);//name为css变量名 e.g: --color-primary

至此完成了scss的运行时改变变量值,具体运用情景我也不太清楚,只是我遇到了。

我的运用情景:

自定义组件需要暴露出一些样式属性给使用者 自由调整 ,类似主题,而我又不想用字符串拼接的方式去完成,太浪费了,每次改完一个值都得把整个style给重写一遍,而且这涉及到了频繁修改dom不符合vue的思想,而且直接用css写太繁琐了。

所以我采用scss来写样式,scss嵌套真好用,less的不支持属性再嵌套,用得很不爽,没scss简洁。
由于scss是预编译的,无法在运行时改变变量值,而我又需要去改变,所以去google了,得到一个满意的解决方案 -> 原理(English)

特别注意

在单文件组件(.vue)中若是使用了scoped 那么:root、:body等选择器的效果并不会如同你所预期的

  1. [data-v-1374924e]:root {
  2. --test:100px;
  3. }

像这种的,变量–test 根本找不到,理由是并没有这个root,vue组件scoped的特性,只在本组件有效,但组件又没有完整的document,即组件内部没有root

所以在vue文件中,仔细思考css变量声明的选择器范围,避免变量无效

到此这篇关于详解利用css3的var()实现运行时改变scss的变量值的文章就介绍到这了,更多相关css3改变scss的变量值内容请搜索w3xue以前的文章或继续浏览下面的相关文章,希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号