CSS – Variables
参考:
Youtube – CSS Variables - CSS vs Sass - variables inside media queries
Why we prefer CSS Custom Properties to SASS variables
与 Sass Variables 的区别
变量使我们可以很方便的批量修改设计. 在 Sass 的帮助下, 很久以前就有了这个能力. 但是 Sass 毕竟只是一个 pre-compile 工具.
它的 variable 在 run-time 阶段其实是不存在的.
而 CSS variable 的特色就是它是 CSS 真正的 variable. 你甚至可以在 run-time 的时候通过 JS 修改它.
定义
通常会把 variable 定义到最顶端 :root. 也就是 document.documentElement
:root {
--font-size-xs: 1rem;
--font-size-sm: 1.5rem;
--font-size-md: 2rem;
}
但其实要定义到任何一个 element 都是可以的.
form {
--font-size-xs: 1rem;
}
这样 form element 就有了这个 variable.
调用
h1 {
font-size: var(--font-size-md, 4rem);
}
第 2 个参数是默认值, 当 variable 获取不到时就会用它.
它的寻找流程是这样的, selector 定位到 element, 从这个 element 开始找, 然后一直往上找.
:root {
--font-size-xs: 1rem;
}
.title {
--font-size-xs: 2rem;
font-size: var(--font-size-xs);
}
像这种情况, 最终获取的是 2rem, 如果 .title 没有定义 variable, 那么会一直找到 :root 使用 1rem.
依赖
:root {
--var1: red;
--var2: var(--var1);
} body {
background-color: var(--var2); // red
height: 100vh;
}
var2 depend on var1 是可以的哦. 而且修改 var1, var2 也会修改
document.documentElement.style.setProperty("--var1", "black"); const var2 = window
.getComputedStyle(document.documentElement)
.getPropertyValue("--var2");
console.log("var2", var2); // black
Self Reference (依赖自己)
参考: Self-Referencing CSS Variables
child 想 override parent 的 variable, 但依赖 variable 自身. 这样是不可以的.
re-assign 是 ok 的, 关键是不可以 depend self. 目前只能靠一些 workaround 来实现
参考: Stack Overflow – Unable to overwrite CSS variable with its own value
:root {
--border-width: 50px;
}
.component {
// 巧思在这个 --border-width-modified
border: var(--border-width-modified, var(--border-width)) solid red;
} @media (min-width: 1280px) {
:root {
--border-width-modified: calc(var(--border-width) / 2);
}
}
Work with Unitless
参考:
Can I add unit to a value inside css calc?
How to append a unit to a unitless CSS custom property with calc()
body {
font-size: var(--font-size) + "px";
font-size: var(--font-size) rem;
}
这 2 个都不 work. 解决方案是用 calc
body {
font-size: calc(var(--font-size) * 1px);
font-size: calc(var(--font-size) * 1rem);
}
很聪明的 idea, 但显然会扣一点性能的分数. 希望未来有 property way 去解决.
Not working with @media
参考: stackoverflow – CSS native variables not working in media queries
@media (min-width: var(--breakpoint-md)) {
h1 {
color: pink;
}
}
这样是没有效果的. 目前还不支持, 以后视乎有 solution. 但现在只能用 Sass 的 variables 代替了.
Sass 写法
$breakpoint: (
sm: 640px,
md: 768px,
lg: 1024px,
xl: 1280px,
2xl: 1536px,
);
@function breakpoint($size) {
@return map-get($breakpoint, $size);
}
@mixin media-breakpoint($breakpoint) {
@media (min-width: breakpoint($breakpoint)) {
@content;
}
}
@include media-breakpoint("md") {
h1 {
color: pink;
}
}
JavaScript get/set variable
get variable
const fontSize = window
.getComputedStyle(document.documentElement)
.getPropertyValue("--font-size-xs"); // 1rem
set variable
document.querySelector("h1").style.setProperty("--font-size-xs", "2rem");
动态修改 variable 就意味着修改了 CSS Style. 非常好用. 这也是 Sass 无法做到的.
注意 space
如果有用 prettier 之类的 format 工具. CSS value 通常会有一个空格在前面.
使用 JavaSript 拿到的 value 也会有这个空格哦.
const color = window
.getComputedStyle(document.documentElement)
.getPropertyValue('--color'); // ' red' document.querySelector('h1').style.color = color;
但也不用太担心, 像 style.color = ' red' 是可以跑的, 如果真的有问题就 trim 掉它咯.
总结
CSS variable 是寄宿在 element 身上的. 通过 CSS selector 选中元素并赋予变量.
使用的时候则是从当前的 element 开始找, 然后一直往上找到 root element.
它可以配合 JS 做到动态修改, 来实现批量修改 style. 这是 Sass 无法做到的.
但是 Sass 的 variables 也有它的用途, 比如它可以作为参数传来传去等等.
个人的使用体验是:
1. 有时候做效果, 需要通过 JS 获取 scrollTop 值并用来设置 style, 这种时候用 variable 就可以很干净. 只修改特定变量, 而不负责具体 set style property.
2. type scale
这个 scale 方式适合用来做 RWD. 比如, 手机是 16px (1rem) 作为 base. 电脑是 18px (1.125rem) 作为 base.
然后所有的 font-size 就依据 scale-ratio 往上乘就好了.
完全符合了 type-scale.com 的做法.
当然这不是唯一的做法. 许多人依然会选择一个一个区域通过 break-point 去调每一次的 font-size. 这种批量修改未必就一定会很好看.
CSS – Variables的更多相关文章
- CSS Variables
CSS原生变量(CSS自定义属性) 示例地址:https://github.com/ccyinghua/Css-Variables 一.css原生变量的基础用法 变量声明使用两根连词线"-- ...
- [CSS3] Create Dynamic Styles with CSS Variables
In this lesson we are going to use CSS variables to keep our application's colors consistent. This i ...
- CSS Variables:css自定义属性的使用
CSS Variables,一个并不是那么新的东西,但对css来说绝对是一场革命.之前使用变量的时候,需要借助sass.less等预处理工具来实现,现在我们可以直接使用css来声明变量. 一.兼容性 ...
- css variables & CSS 变量
css variables & CSS 变量 https://gist.github.com/xgqfrms-GitHub/5d022a13292c615d2730e84d909e1aba c ...
- 引人瞩目的 CSS 变量(CSS Variable)
这是一个令人激动的革新. CSS 变量,顾名思义,也就是由网页的作者或用户定义的实体,用来指定文档中的特定变量. 更准确的说法,应该称之为 CSS 自定义属性 ,不过下文为了好理解都称之为 CSS 变 ...
- CSS技巧-rgba函数的妙用
先简单介绍一下: rgba()函数是平时开发中经常遇到的,这篇文章也做了一个比较详细的解读以及一系列的应用. 对它的工作原理做一番分析:就是具有一定透明度的盒子: 还比较了rgba()函数和不透明度属 ...
- CSS变量(自定义属性)实践指南
本文翻译自:https://www.sitepoint.com/practical-guide-css-variables-custom-properties/ 转载请注明出处:葡萄城官网,葡萄城为开 ...
- CSSの変数を使う
この文章はhttps://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_variablesを参考します. これは実験段階の機能です.この機能は複数のブ ...
- CSS 变量教程
一.变量的声明 声明变量的时候,变量名前面要加两根连词线(--). body { --foo: #7F583F; --bar: #F7EFD2; } 上面代码中,body选择器里面声明了两个变量:-- ...
- 原生css 中变量的使用
前两天看到阮大神的一篇在css中使用变量的文章,整理了一下. 这个重要的 CSS 新功能,所有主要浏览器已经都支持了.本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大. 一.变量的声明 ...
随机推荐
- webpack4.15.1 学习笔记(七) — 懒加载(Lazy Loading)
懒加载或者按需加载,是一种很好的优化网页或应用的方式.实际上是先把代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或引用另外一些新的代码块.这样加快了应用的初始加载速度,减轻了它 ...
- django 设置外键的时候,related_name的值大写还是小写,规则怎样
django 设置外键的时候,related_name的值大写还是小写,规则怎样 在Django中,related_name参数用于定义反向关系的名称,即通过外键字段反向查询关联模型的对象.relat ...
- 我从 Python 潮流周刊提取了 800 个链接,精选文章、开源项目、播客视频集锦
你好,我是豌豆花下猫.前几天,我重新整理了 Python 潮流周刊的往期分享,推出了第 1 季的图文版电子书,受到了很多读者的一致好评. 但是,合集和电子书的篇幅很长,阅读起来要花不少时间.所以,为了 ...
- 玄机-第二章日志分析-apache日志分析
前言 出息了,这回0元玩玄机了,因为只是日志分析,赶紧导出来就关掉(五分钟内不扣金币) 日志分析只要会点正则然后配合Linux的命令很快就完成这题目了,非应急响应. 简介 账号密码 root apac ...
- EF6/EFCore Code-First Timestamp SQL Server
EF 6和EF Core都包含TimeStamp数据注解特性.它只能用在实体的byte数组类型的属性上,并且只能用在一个byte数组类型的属性上.然后在数据库中,创建timestamp数据类型的列,在 ...
- Django 继承AbstractUser扩展用户模型
Django 继承AbstractUser扩展用户模型 by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方 ...
- 开源照片管理神器 PhotoPrism 安装和使用教程
如今我们每个人都积累了海量的照片和视频,做自媒体的 UP 主们积累的照片和视频数量可能更多.面对这么多的照片和视频,我们该如何管理呢? 之前我一直用谷歌相册,因为它有很多优势,比如无限空间,支持智能整 ...
- Jmeter函数助手12-threadNum
threadNum函数用于获取当前线程编号.该函数没有参数,直接引用即可. 1.线程数可在组件[测试计划->线程组]设置.如下是不传入循环次数的${__threadNum}. "调试取 ...
- Postman汉化成中文版
postman安装默认是英文版,为使用方便使用汉化包转成中文版 1.查看本地安装的postman版本:Settings->About 2.根据postman的版本下载对应的汉化包,汉化包网址 3 ...
- 树莓派3b+使用官方屏幕后倒置问题——屏幕倒置
树莓派3b+的屏幕本身就是倒置的,因此为了使树莓派在官方屏幕下能显示正常的屏幕画面因此需要通过设置把树莓派的官方屏幕的输出倒置一下,这样树莓派的官方屏幕的输出就是正常的了. 解决方法:(源自:http ...