CSS自定义变量属性——像less,sass那样在css中使用变量(译)

介绍

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

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

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

语法

定义自定义属性:--*

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

Name:             --*
Value:            <declaration-value>
Initial:          (nothing, see prose)
Applies to:       all elements
Inherited:        yes
Percentages:      n/a
Media:            all
Computed value:    specified value with variables substituted (but see prose for "invalid variables")
Canonical order:   per grammar
Animatable:            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); }
<p>I inherited blue from the root element!</p> //blue
<div>I got green set directly on me!</div>        //green
<div id=‘alert‘>
  While I got red set directly on me!     //red
  <p>I’m red too, because of inheritance!</p>  //red
</div>
```
  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><two><three /></two></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`的背景色是透明色

翻译参考:

原文地址:https://www.cnblogs.com/jlfw/p/12208801.html

时间: 2025-01-05 05:58:28

CSS自定义变量属性——像less,sass那样在css中使用变量(译)的相关文章

C语言变量和变量属性

数据类型 数据类型可以理解为固定内存大小的别名. 数据类型是创建变量的模子. 1byte char 2byte short 4byte int 变量本质 变量是一段实际连续存储空间的别名. 程序中通过变量来申请并命名存储空间. 通过变量的名字可以使用存储空间. --------------------------------------------------------------- C语言中的变量可以有自己的属性. 在定义变量的时候可以加上 "属性" 关键字. "属性&q

关于css的定位属性

关于css的定位属性 一.什么是定位 css中的定位属性为position,它规定元素的定位类型,选择不同的参照物和定位方式.分为五种:默认 绝对 相对 固定 黏性 二.属性值逐一描述 1.默认属性值 position:static; . 不特别设置的情况下,每个元素默认的属性值 . 不会识别left right top bottom指定坐标 .不能通过z-index进行层次分级 2.绝对定位 position:absolute; . 通过 left right top bottom 指定坐标,

MySQL 5.6中的变量

这篇文章介绍的是MySQL  5.6中的变量,基本是我以前学习MySQL 5.6手册时整理而来. 基础概念 MySQL中的变量可分为以下几种: 1. MySQL系统变量:该类型变量反映了MySQL服务器是如何配置的.每一个系统变量都有一个默认值.系统变量可以在MySQL配置文件中进行设置,或使用MySQL启动选项进行设置.大多数系统变量都可以在MySQL运行时使用SET命令进行动态修改. 2. MySQL状态变量:该类型变量反映了MySQL服务器的运行状态. 变量按作用范围可分为: 1. 全局变

PHP中的变量与常量详解

几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外.本节将介绍PHP语言中的变量和常量的应用方法. 一.什么是变量和常量 在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不可以改变的. 变量用于存储临时数据信息.某一变量被定义的时候,系统会自动为该变量分配一个存储空间存放变量的值.我们可以在定义变量的时候对其赋值,如果需要改动变量的值,只需再次对其进行赋值即可.对于那些临时数据信息或者处理过程,都可以存放在变量中. 常量用于存储不经常改变的数据信息.定义常量的时候可以

C语言extern引用AT&T汇编中的变量,任意转换类型

今天研究出了一个小问题,在C语言里引用汇编的变量,会是什么结果,汇编中的变量没有像C语言中int类型那样的类型约束,可以把数据当作任何类型处理,那么传到C语言中我们应该当作什么类型处理呢. 换句话说,在汇编里定义变量var,在C语言里引用,我们肯定要用extern声明var外部变量,那么extern后面接什么类型?难道是extern int var么?还是 extern short var 实例: 一. 汇编程序:(是的,就这么短小) .global var  #注意现在的汇编器不再要求被C语言

jQuery库中的变量$和其它类库的变量$冲突解决方案

jQuery.noConflict();//把变量$给其它插件 /* 由于把jQuery插件中的变量$给了其它插件使用 那么在调用jQuery插件的时候只能使用jQuery 但是这样很不方便 1.其实可以按照jQuery的做法,再次把jQuery封装 其实就是闭包的使用 2.另一种方法是给jQuery变量另外取一个别名 var jq = jQuery.noConflict(); 3.第三种方法是,把jQuery移动到一个新的命名空间 和第二种方式差不多 var dom = {}; dom.que

(10)mysql中的变量

定义变量 语法如下 declare var_name[,...] type [default value]; MYSQL 变量定义只能在存储过程或函数里面定义,不像 Oracle / SQL Server.该变量的作用范围只能在begin-end块中.变量定义必须写在复合语句的开头,并且在任何其他语句的前面.可以一次声明多个相同类型的变量.可以使用default赋默认值.declare只能用在局部变量定义中. #举例 declare v_test int default 10; 设置变量 方式一

Java中静态变量(类变量)、实例变量、局部变量和成员变量

导读 学习Java的过程中,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别. 例程 package com.cunyu.demo public class Demo { private String name; //成员变量.实例变量 private int age; //成员变量.实例变量 private int ID; //成员变量.实例变量 public static final String school = "卡塞尔学院"; //成员变量.静态变

Python 之面向对象:类和对象调用类中的变量和方法

面向对象的核心是对象,用对象来操控类里面的方法和变量,加上类还具有继承.封装.多态三大特性,提高了代码的复用性和规范性. 一.对象 调用类中的变量和方法 二 .类  调用类中的变量和方法 原文地址:https://www.cnblogs.com/tianpin/p/11283032.html

C#的HttpModule中及Java的Servlet中成员变量乱用导致的不易重现的BUG

3年前写的在HttpModule中记录访问日志的代码,在最近使用日志数据分析登录账号的IP情况时,才发现了一个不易重现的BUG——日志中记录的登录账号出现串掉的情况.之所以这个时候才发现该问题,是因为部分用户的IP是固定的,但是日志里却出现了别人的IP.而之所以3年后才发现,是因为这块日志数据一直没怎么用过.回头想想,根本原因还是在用成员变量的时候没考虑到多线程的情况,或者说多用户同时访问的情况.因为HttpModule里的事件,是所有页面实例共用的. 问题代码: string dateBegi