Technicalarticles
<style>
/* 在 body 选择器中声明了两个变量 */
body {
--primary-color: red;
/* 变量名大小写敏感,--primary-color 和 --PRIMARY-COLOR 是两个不同变量 */
--PRIMARY-COLOR: initial;
}
/** 同一个 css 变量,可以在多个选择器内声明。优先级高的会替换优先级低的 */
main {
--primary-color: blue;
}
/** 使用 css 变量 */
.text-primary {
/* var() 函数用于读取变量。*/
color: var(--primary-color)
}
<style>
<!-- 呈现红色字体,body 选择器的颜色 -->
<div>red</div>
<!-- 呈现蓝色字体,main 选择器定义的颜色 -->
<main>blue</main>
<!-- 呈现紫色字体,当前内联样式表的定义 -->
<div>purple</main>
:root { --primary-color: #06c;}
<style>
/* ...和上面 CSS 一致 */
</style>
<!-- 呈现黄色字体 -->
<div>red</div>
<!-- 呈现蓝色字体,main 选择器定义的颜色 -->
<main id='primary'>blue</main>
<!-- 呈现紫色字体,当前内联样式表的定义 -->
<div id="secondary" style='--primary-color: purple">purple</main>
<script>
// 设置变量
document.body.style.setProperty('--primary-color', 'yellow');
// 设置变量,js DOM 元素 ID 就是全局变量,所以直接设置 main 即可
// 变为 红色
primary.style.setProperty('--primary-color', 'red');
// 变为 黄色,因为当前样式被移除了,使用 body 上面样式
secondary.style.removeProperty('--primary-color');
// 通过动态计算获取变量值
getComputedStyle(document.body).getPropertyValue('--primary-color')
</script>
:root { --border-radius: 5px; --box-shadow: 2px 2px 10px; --color: #118bee; --color-accent: #118bee0b; --color-bg: #fff; --color-bg-secondary: #e9e9e9; --color-secondary: #920de9; --color-secondary-accent: #920de90b; --color-shadow: #f4f4f4; --color-text: #000; --color-text-secondary: #999; --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; --hover-brightness: 1.2; --justify-important: center; --justify-normal: left; --line-height: 150%; --width-card: 285px; --width-card-medium: 460px; --width-card-wide: 800px; --width-content: 1080px;}
/* 没有设置过 --primary-color,颜色默认使用 #7F583F */color: var(--primary-color, #7F583F);
/* 对于不支持 CSS 变量的浏览器,可以采用下面的写法。*/a { /* 颜色默认值 */ color: #7F583F; /* 不支持则不识别该条规则 */ color: var(--primary);}
// 先导入所有 Less 变量
@import (reference) './var.less';
// 利用正则去替换 Less 变量 为 CSS 变量
.theme(@property, @imp) {
@{property}: e(replace(@imp, '@([^() ]+)', '@{$1}', 'ig'));
@{property}: e(replace(@imp, '@([^() ]+)', 'var(--$1, @{$1})', 'ig'));
}
@import '../common/style/theme.less';
.van-button {
// ... 其他省略
.theme(height, '@button-default-height');
.theme(line-height, '@button-line-height');
.theme(font-size, '@button-default-font-size');
}
// => less 编译之后生成
.van-button{
// ... 其他省略
height:44px;
height:var(--button-default-height,44px);
line-height:20px;
line-height:var(--button-line-height,20px);
font-size:16px;
font-size:var(--button-default-font-size,16px);
}
<style> .red-box { --toggler: ; --red-if-toggler: var(--toggler) red; background: var(--red-if-toggler, green); /* will be red! */ } .green-box { --toggler: initial; --red-if-toggler: var(--toggler) red; background: var(--red-if-toggler, green); /* will be green! */ }</style><!-- 宽度高度为 100px 的 红色盒子 --><div style="height: 100px; width: 100px" class="red-box"></div><!-- 宽度高度为 100px 的 绿色盒子 --><div style="height: 100px; width: 100px" class="green-box"></div>
.red-box {
/* 当前为空值 */
--toggler: ;
/* 因为 var(--toggler) 得到了空,所以得到结果 为 --red-if-toggler: red */
--red-if-toggler: var(--toggler) red;
/** 变量是 red, 不会使用 green */
background: var(--red-if-toggler, green); /* will be red! */
}
.green-box {
/** 当前为无效值 */
--toggler: initial;
/** 仍旧无效数据,因为 var 只会在参数不是 initial 时候进行替换 */
--red-if-toggler: var(--toggler) red;
/** 最终无效值没用,得到绿色 */
background: var(--red-if-toggler, green); /* will be green! */
/* 根据当前的功能,我们甚至可以做到 and 和 or 的逻辑
* --tog1 --tog2 --tog3 同时为 空值时是 红色
*/
--red-if-togglersalltrue: var(--tog1) var(--tog2) var(--tog3) red;
/*
* --tog1 --tog2 --tog3 任意为 空值时是 红色
*/
--red-if-anytogglertrue: var(--tog1, var(--tog2, var(--tog3))) red;
}
.breakpoints-demo > * {
width: 100%;
background: red;
}
@media (min-width: 37.5em) and (max-width: 56.249em) {
.breakpoints-demo > * {
width: 49%;
}
}
@media (min-width: 56.25em) and (max-width: 74.99em) {
.breakpoints-demo > * {
width: 32%;
}
}
@media (min-width: 56.25em) {
.breakpoints-demo > * {
background: green;
}
}
@media (min-width: 75em) {
.breakpoints-demo > * {
width: 24%;
}
}
/** 移动优先的样式规则 */
.breakpoints-demo > * {
/** 小于 37.5em, 宽度 100% */
--xs-width: var(--media-xs) 100%;
/** 小于 56.249em, 宽度 49% */
--sm-width: var(--media-sm) 49%;
--md-width: var(--media-md) 32%;
--lg-width: var(--media-gte-lg) 24%;
width: var(--xs-width, var(--sm-width, var(--md-width, var(--lg-width))));
--sm-and-down-bg: var(--media-lte-sm) red;
--md-and-up-bg: var(--media-gte-md) green;
background: var(--sm-and-down-bg, var(--md-and-up-bg));
}
/**
* css-media-vars
* BSD 2-Clause License
* Copyright (c) James0x57, PropJockey, 2020
*/
html {
--media-print: initial;
--media-screen: initial;
--media-speech: initial;
--media-xs: initial;
--media-sm: initial;
--media-md: initial;
--media-lg: initial;
--media-xl: initial;
/* ... */
--media-pointer-fine: initial;
--media-pointer-none: initial;
}
/* 把当前变量变为空值 */
@media print {
html { --media-print: ; }
}
@media screen {
html { --media-screen: ; }
}
@media speech {
html { --media-speech: ; }
}
/* 把当前变量变为空值 */
@media (max-width: 37.499em) {
html {
--media-xs: ;
--media-lte-sm: ;
--media-lte-md: ;
--media-lte-lg: ;
}
}
DO U LIKE?