目录
- 属性定义
- 使用自定义属性- CSS 自定义属性遵循 CSS 级联及继承规则
- 循环依赖
- 多皮肤主题中的应用
- 组件化开发中的应用
 
- 浏览器检测
- 总结
自2015年12月W3C发布自定义属性级联变量推荐性规范已经有一段时间了,今天本文首先会对自定义属性使用做一个基本的介绍,后面将主要讲述在我们日常组件开发中CSS自定义的应用。浏览器兼容性参见CSS Variables (Custom Properties)
属性定义
基本语法:–: ,以“–”开头(为了和Sass/Less等预处理器变量进行区分),自定义属性名对大小写敏感,--foo 和 --FOO 会映射到不同的值。
| 12
 3
 4
 5
 6
 7
 
 | :root {--btn-color: #fff;
 }
 
 .btn {
 color: var(--btn-color);
 }
 
 | 
使用自定义属性
基本语法:: var([,]);此处括号的意思是如果没有指定值,则使用值。这个扩展非常有用,比如我们做多皮肤主题时,可以使用此语法设置默认皮肤。
CSS 自定义属性遵循 CSS 级联及继承规则
| 12
 3
 4
 
 | :root {--global-variables: 'global-value';
 --bg-color: #f0f;
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | .header {--bg-color: #f00;
 height: 20px;
 background-color: var(--bg-color);
 }
 .main {
 
 background-color: var(--bg-color);
 }
 .footer {
 --bg-color: #00f;
 height: 20px;
 background-color: var(--bg-color);
 }
 
 | 
循环依赖
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | :root {--a: calc(var(--b) + 20px);
 --b: calc(var(--a) - 20px);
 }
 
 .box {
 width: var(--a);
 height: var(--b);
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | <style>:root {
 --font-size: 40px;
 }
 .parent {
 font-size: var(--font-size);
 }
 .son {
 --son: calc(var(--font-size) * 2);
 
 font-size: var(--son);
 }
 .grandson {
 --font-size: calc(var(--son) * 2);
 
 font-size: var(--font-size);
 }
 </style>
 <span class="parent">
 parent
 <span class="son">
 on
 <span class="grandson">grandson</span>
 </span>
 </span>
 
 | 
多皮肤主题中的应用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 
 | <style>:root {
 --default-color: #000;
 }
 
 body {
 margin: 0;
 color: #fff;
 }
 
 .header {
 text-align: center;
 background-color: var(--default-color);
 }
 
 .main {
 background-color: #fff;
 }
 
 .footer {
 position: fixed;
 left: 0;
 bottom: 0;
 width: 100%;
 background: linear-gradient(to bottom, #ccc, var(--default-color));
 }
 select {
 width: 100px;
 height: 24px;
 font-size: 14px;
 line-height: 24px;
 color: #333;
 border: 1px solid #ccc;
 background-color: none;
 }
 </style>
 <header class="header">
 <select id="theme-select">
 <option value="#000" selected>Black</option>
 <option value="#f00">Red</option>
 <option value="#00f">Blue</option>
 </select>
 </header>
 <section class="main">
 Main
 </section>
 <footer class="footer">
 Footer
 </footer>
 <script>
 
 document.querySelector('#theme-select').addEventListener('change', function() {
 document.documentElement.style.setProperty("--default-color", this.value);
 }, false);
 </script>
 
 | 
组件化开发中的应用
开发一个 Button 组件,并使用 CSS 自定义属性。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 | <style>.btn-groups {
 display: flex;
 flex-wrap: wrap;
 padding: 10px 5px;
 background-color: #eee;
 }
 
 .btn {
 --btnColor: #5eb5ff;
 border: 1px solid var(--btnColor);
 color: var(--btnColor);
 background-color: white;
 padding: 10px 25px;
 text-decoration: none;
 font-family: "Output Sans";
 font-weight: 600;
 border-radius: 3px;
 margin: 5px;
 transition: all .3s ease;
 }
 
 .btn-red {
 --btnColor: #ff6969;
 }
 
 .btn-green {
 --btnColor: #7ae07a;
 }
 
 .btn-gray {
 --btnColor: #555;
 }
 
 .btn-purple {
 --btnColor: #ef34ef;
 }
 
 .btn:hover {
 color: #fff;
 background-color: var(--btnColor);
 }
 
 .btn:active {
 opacity: .6;
 }
 </style>
 <div class="btn-groups">
 <a href='javascript:void(0)' class='btn'>Submit</a>
 <a href='javascript:void(0)' class='btn btn-red'>Submit</a>
 <a href='javascript:void(0)' class='btn btn-green'>Submit</a>
 <a href='javascript:void(0)' class='btn btn-gray'>Submit</a>
 <a href='javascript:void(0)' class='btn btn-purple'>Submit</a>
 </div>
 
 | 
浏览器检测
1.CSS @supports 检测
| 12
 3
 4
 5
 6
 7
 
 | @supports ( (--a: 0)) {
 }
 
 @supports ( not (--a: 0)) {
 
 }
 
 | 
2.javascript检测
| 12
 3
 4
 5
 6
 7
 8
 
 | const isSupported = window.CSS &&window.CSS.supports && window.CSS.supports('--a', 0);
 
 if (isSupported) {
 
 } else {
 
 }
 
 | 
总结
通过上面内容,我们了解了CSS自定义属性的定义、语法、检测、应用、示例及与javascript交互,同时我们也了解到 CSS 自定义属性的优点。如果你还没有使用过 CSS 自定义属性,动手get起来吧。
            
            转载申请
            本作品采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,文章内图片请保留全部内容。