【CSS】357- 坚定地使用 CSS Custom Properties
自定义属性(Custom Properties)是一个很有魅力的 CSS 新特性,现代浏览器广泛 支持。但是遇到那些不支持 CSS Custom Properties 的老掉牙浏览器我们该怎么办?等着这些浏览器死翘翘了再支持,还是使用预处理武装 CSS?又或者强硬起来,对它们一笑了之?
之前借助 LESS 或者 Sass 这样预处理工具在样式中使用变量,而今Custom Properties 在 CSS 实现变量的原生支持。
如何使用自定义属性?其实很简单,在样式规则钱添加 -- 即可:
--color-text-default: black;
偏爱用下划线?下面这样也没问题:
--color_text_default: black;
在属性名称中,横线和下划线都可以使用,作死使用空格是不行的。
自定义属性名大小写敏感,--color-text-default 和 --Color-Text-Default 是不一样的哦。
使用 var() 函数可以获取到自定属性的值,这样就可以在样式规则中使用自定义属性。如下例,浏览器获取 --color-text-default 的值 black,应用到 body 元素上。
body {color: var(--color-text-default);}
与 LESS 或者 Sass 中的变量一样,CSS Custom Properties 可以避免重复地在样式表中编写颜色、字体或者尺寸等样式;不过除了这些 CSS Custom Properties 还有更多的特点,级联——可以根据平台的不同,通过 media query 查询来修改;更厉害的是, JavaScript 可以修改自定义属性的值。
译注:Custom Properties 本质上是自定义属性,即 CSS 属性前面添加 — 即是自定义属性;借助 CSS 的 var() 函数,才可以使用这些自定义属性。例如:var(--header-color)。比起预处理器提供的变量特性,自定义属性还有三个特点:层叠/级联,运行时,JavaScript API。
Serg Hospodarets 写了一篇极好的文章介绍 CSS Custom Properties,示例详尽,探索了各种可能用法。
https://www.smashingmagazine.com/2017/04/start-using-css-custom-properties/
浏览器支持
看到这里你因该会问浏览器支持情况如何?那我们就来看看。最新版的 Chrome、Edge、Firefox、Opera 和 Safari 支持,IE 11 及以前、Opera Mini 情况不容乐观。
总是这样对不对?
不过别担心,可以使用 @support 指令来检查浏览器是否支持自定义属性:
--color-text-default: black;body {color: black;}@supports((--foo: bar)) {body {color: var(--color-text-default);}}
在 Demo 中,一开始把 body 文本颜色设置为黑色,后面如果浏览器支持我们伪造的 foo 变量,则用一个自定义属性值覆盖之。
默认替代
如果使用的变量未定义会怎么样?没有问题,浏览器会忽略这一条规则。如果你想确保万无一失,可以使用替代指定一个备选值。
body {color: var(--color-text-default, black);}
替代与 CSS 中的字体定义有点像,一个使用逗号隔开的列表。如果自定义属性没有值,浏览器忽略之使用列表中的下一个值。
译注:原文这里的说并不准确。var( <custom-property-name> [, <declaration-value> ]? ),第一个逗号之后的内容都会被当作备选值。例如,var(--foo, red, blue),备选值是 red, blue。
参考:https://drafts.csswg.org/css-variables/#using-variables
预处理器
我们确实可以利用预处理器来把 Custom Properties 转为兼容的 CSS 代码,不过先打住,兄弟。
同样的方式以前是不是也搞过?过去为了使用 CSS3 的那些“高级”特性,比如 border-radius、css columns、Flexbox 等等,我们工程师各种小技巧还少么?问题确实解决了,只是代码写得恶心。
我想还有一种更好的方式——在支持的浏览器中尽情使用 CSS Custom Properties ,为不支持的浏览器提供合适的稍有差别的体验。怎么地?之前我们也这么干过呀!
两种色调的 Stuff & Nonsense
译注:Stuff & Nonsense 是原作者的站点。
在 IE6 臭名昭著的时代,我为我的站点提供了两套设计。
针对那个时代的现代浏览器,网站上到处都是新潮的各种颜色的箭头和靶子。我使用了 CSS 属性选择来实现,当年这可是高级特性:
[class="banner"] {background-colour: red;}
IE6 会忽略那些无法解析的选择器,因此,如果用户用 IE6 访问,会看到一个黑白为主的站点,这些样式我使用类选择器实现的:
.banner {background-colour: black;}[class="banner"] {background-colour: red;}
不用说,我这样做大家会觉得我脑子不正常,但是 Microsoft 曾今使用我的网站作为 IE7 支持属性选择器的参考。他们确实做了,就像我说的一样:”做一个更好的浏览器吧!”。
过时浏览器,一边呆着去
好了,这个例子和浏览器不支持 CSS Custom Properties,有什么关系?如何才能利用这些高级特性?不用担心浏览器不支持,不用实现复杂的替代方案,不用花数个小时让替代方案和设计保持一致。
答案就在于 CSS 本身,而且一直如此,浏览器会直接忽略它们不认识的东西。
我们要做的很简单,首先指定一个与设计大相径庭的值,然后在再使用 CSS 自定义属性覆盖之。
body{color: black;color:var(--color-text-default, black);}
所有浏览器都懂第一个值(black),如果浏览器足够聪明,懂得 第二个值(var(--color-text-default)),就会覆盖第一个值。过时浏览器不理解就会装作看不到,没效果。这没有问题,更不会死人。
对所有的自定义属性都做这样的处理。为使用过时浏览器的用户提供更简单的替代设计到样式中,就像我在 Stuff & Nonsense 上做的一样。
结论
我相信没人愿意看到网站变坏或者不被别人喜欢——我也不想这样——但是没必要要求在每个浏览器里展示都一致。我们可以为使用过时浏览器的用提供一个设计相对简单的替代方案。
做是否启用新的 CSS 特性的决定时,不要老往技术上考量,有时候可能需要改变一下对所有浏览器都要支持的态度。对老旧浏览器不要心慈手软,接受 CSS Custom Properties 带来的红利,坚定地用起来!
原文:
https://24ways.org/2017/getting-hardboiled-with-css-custom-properties/
译文:https://qianduan.group/posts/5a38d32f485c1a4c84948ceb
译者:寸志
【CSS】357- 坚定地使用 CSS Custom Properties的更多相关文章
- switchable css dark theme in js & html custom element
switchable css dark theme in js & html custom element dark theme / dark mode https://codepen.io/ ...
- CSS自定义属性 —— 别说你懂CSS相对单位
前段时间试译了Keith J.Grant的CSS好书<CSS in Depth>,其中的第二章<Working with relative units>,书中对relative ...
- [Codecademy] HTML&CSS 第七课:CSS: An Overview
本文出自 http://blog.csdn.net/shuangde800 [Codecademy] HTML && CSS课程学习目录 --------------------- ...
- 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧
记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...
- Atitit.css 规范 bem 项目中 CSS 的组织和管理
Atitit.css 规范 bem 项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 ...
- CSS基础篇之了解CSS和它的基本属性
CSS是什么? CSS英文全名是Cascading Style Sheets翻译过来就是层叠样式表,它主是把网页表现与内容分离的一种样式设计语言.这种语言能优化我们编程,把东西简化和优化写法,而且不同 ...
- 移除project,testsuite,testcase级别所有的custom properties
// Remove all custom properties on Project level. If removed, custom properties cannnot be injected ...
- Groovy解析xml并且注入Project,TestSuite,TestCase级别的custom properties
import com.eviware.soapui.support.GroovyUtils import groovy.util.XmlParser def groovyUtils = new Gro ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列六》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
随机推荐
- B2B电商正在向一个新的方向转变
在互联网+.中国制造2025等国家战略规划的不断催发下,淡出舆论风口多时的B2B电商,开始重新回归公众视野,B2B行业也就此得到一剂强心剂.不过值得关注的是,B2B平台商业模式已经开始发生变革. 互联 ...
- git Lab ssh方式拉取代码失败
gitLab在linux上已经安装好了, 在配置项目的时候报如下异常 使用http方式没问题, 但是用ssh方式设置repository URL 提示资源库不存在. returned status c ...
- mysql 创建用户及授权(2)
一. MySQL初始密码 新安装的MySQL默认是没有密码的,设置初始密码可以用以下命 mysqladmin -u root password 'new-password' mysqladmin -u ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- Elasticsearch从入门到放弃:文档CRUD要牢记
在Elasticsearch中,文档(document)是所有可搜索数据的最小单位.它被序列化成JSON存储在Elasticsearch中.每个文档都会有一个唯一ID,这个ID你可以自己指定或者交给E ...
- PostGIS安装教程
安装环境: win10专业版 postgresql-10.6-1-windows-x64 ---因为使用的是ArcGIS10.4版本,pg10.6对于ArcGIS10.4版本过高,建议选择安装pg9. ...
- 【Luogu P3834】可持久化线段树(主席树)
Luogu P3834 可持久化数据结构就是支持在历史版本上进行查询和修改操作的数据结构. 主席树就是对线段树的改进,使之可持久化. 前置知识:动态开点线段树 我们利用权值(值域)线段树统计区间内的数 ...
- 02 JavaScript数据类型、类型转换、注释
JavaScript 数据类型 JavaScript 变量能够保存多种数据类型:数值.字符串值.数组.对象.undefined.null等等 var length = 7; // 数字 var las ...
- Selenium+Java(九)Selenium键盘与鼠标事件
一.键盘事件 ctrl+a driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "a"); ctrl+ ...
- JSON.parse() 报错和一些解决方法
js 报错 Unexpected end of JSON input,Unexpected token u in JSON at position 0 JSON 通常用于与服务端交换数据. 在接收服务 ...