博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CSS自定义变量属性——像less,sass那样在css中使用变量(译)
阅读量:7048 次
发布时间:2019-06-28

本文共 3442 字,大约阅读时间需要 11 分钟。

介绍

通常大型文档或者应用(甚至小规模的文档或应用)会包括大量的CSS。在这些CSS文件中通常会有大量相同的数据;例如,一个网站可能用了一个颜色主题并反复用三到四种颜色贯穿始终。改动这些数据会非常困难并且容易出错,因为它零散地分布在CSS文件(甚至多个文件)中,可能无法使用寻找替换实现。

于是CSS自定义变量属性应运而生,它允许用户使用特定语法定义相关变量,并在一定范围内反复使用var()引用,改动这些变量,引用这些变量的地方的CSS也将对应地发生变化。

亲测:ios9环境下没有效果,ios9不支持ES56,推测与此有关 2017-11-5注。

语法

定义自定义属性:--*

--开头,后加变量名,具有继承性,适用于所有元素,计算属性,不适用于动画

Name:             --*Value:            
Initial: (nothing, see prose)Applies to: all elementsInherited: yesPercentages: n/aMedia: allComputed value: specified value with variables substituted (but see prose for "invalid variables")Canonical order: per grammarAnimatable: no

使用举例

  1. 初步使用

    :root {     --main-color: #06c;     --accent-color: #006;   }   /* The rest of the CSS file */   #foo h1 {     //引用变量     color: var(--main-color);   }

    以下使用方法错误!!!

    他错误地尝试使用变量名代替属性名:   .foo {     --side: margin-top;     var(--side): 20px;   } 这并不能实现`margin-top: 20px`,会抛出语法错误。
  2. 大小写敏感

    尽管--FOO--foo都是合法的变量,但是当你引用前者指代的就是前者的值,后者亦然。

    h1 {    --font-color: lightblue;    --Font-color: lightgreen;    color: var(--Font-color);    //lightgreen}
  3. 设置值的注意事项

    自定义属性可以以!important结尾, 但是CSS解析器会自动移除这个属性的值,并按瀑布流的形式确定其优先属性。换句话说,虽然可以使用!important,但是顶级优先“!”的禁止其它同类CSS生效的作用并没有实现CSS。

    h1 {    --font-color: lightblue!important;    --Font-color: lightgreen;    color: var(--font-color);    color: var(--Font-color);    //lightgreen    }
  4. 继承性与优先级(可正常理解)

    :root { --color: blue; }div { --color: green; }#alert { --color: red; }* { color: var(--color); }

I inherited blue from the root element!

//blue
I got green set directly on me!
//green
While I got red set directly on me! //red

I’m red too, because of inheritance!

//red
```
  1. 可与正常属性混用

    :root {  --main-color: #c06;  --accent-background: linear-gradient(to top, var(--main-color), white);}
  2. 互相调用无效

    body {            font-size: 16px;        }        //h1最终大小为16px        h1 {            --font-color: lightblue!important;            --Font-color: lightgreen;            --one: calc(var(--two) + 30px);            --two: calc(var(--one) - 50px);            color: var(--font-color);            color: var(--Font-color);            font-size: var(--one);        }

    在不同范围内合法,事实上两者在不同范围内指代了不同的变量

    one { --foo: 10px; } //10 two { --bar: calc(var(--foo) + 10px); } //20 three { --foo: calc(var(--bar) + 10px); } //30

    calc()使用通用的数学运算规则,但是也提供更智能的功能:

    • 使用“+”、“-”、“*” 和 “/”四则运算;

    • 可以使用百分比、px、em、rem等单位;

    • 可以混合使用各种单位进行计算;

    • 表达式中有“+”和“-”时,其前后必须要有空格,如"widht: calc(12%+5em)"这种没有空格的写法是错误的;

    • 表达式中有“*”和“/”时,其前后可以没有空格,但建议留有空格。

  3. 变量初始默认值

    .component .header {     color: var(--header-color, blue);   }   .component .text {     color: var(--text-color, black);   }      /* In the larger application’s style: */   .component {     --text-color: #080;     /* header-color 为默认值blue     注: var(--header-color, blue, red)无效     */   }
  4. 变量的替换使用规范

    var()并不是按照原文替换CSS字符

    .foo {         --gap: 20;         margin-top: var(--gap)px;       }

    这无法设置 margin-top: 20px;(a length),而是等同于 margin-top: 20 px; (a number followed by an ident空格),这是一个不合法的属性值. 不过, calc() 可以实现:

    .foo {         --gap: 20;         margin-top: calc(var(--gap) * 1px);       }

    下面的代码从语法上江是无错误的,但是并无实际效果。因为20px并不是一个背景色的有效值,如果没有其他设置(必须优先级高于这里的设置)继承背景色,将会使用全局默认的透明背景色

    :root { --not-a-color: 20px; }       p { background-color: red; }       p { background-color: var(--not-a-color); }
//这里虽然有背景色的设置但是优先级并没有自定义属性的高,故而`p`的背景色是透明色

翻译参考:

转载地址:http://hfcol.baihongyu.com/

你可能感兴趣的文章
Spring MVC常用客户端参数接收方式
查看>>
用koa开发一套内容管理系统(CMS),支持javascript和typescript双语言
查看>>
Promise面试题,控制异步流程
查看>>
css-从笔试题中看知识
查看>>
LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
查看>>
前嗅ForeSpider教程:数据浏览与可视化
查看>>
7个开放式的前端面试题
查看>>
dubbo源码解析(二十三)远程调用——Proxy
查看>>
图片无法加载的情况下的优化
查看>>
数据结构与算法 | Leetcode 141:Linked List Cycle
查看>>
推荐给新手的35个好用的Vue开源库
查看>>
简述原型链是什么,有什么用处?若想访问一个对象的原型,应该使用什么方法?...
查看>>
[LeetCode] 675. Cut Off Trees for Golf Event
查看>>
SQLServer之锁简介
查看>>
从点餐小程序说起,谈谈如何从0到1设计一款toB类产品
查看>>
CSS相对定位和绝对定位
查看>>
断开TCP连接
查看>>
我的前端集成测试(一)- 认识node的assert模块
查看>>
【跃迁之路】【465天】程序员高效学习方法论探索系列(实验阶段222-2018.05.16)...
查看>>
spring4.x 集成quartz2.x 集群化配置项目实例
查看>>