如何讓css像js同樣擁有變量保存屬性值,在開發中快速複用應該已經有了多種方案,相似less,sass等預處理器。那麼如今css已經支持了本身的變量。學習了一波大佬們的知識javascript
聲明變量的時候,變量名前面要加兩根連詞線 -- 。css
:root {
--color:#000;
--Color:#001;
}複製代碼
:root僞類能夠看作是一個全局做用域,在裏面聲明的變量,他下面的全部選擇器均可以拿到java
body {
color : var(--color);
color : var(--Color);
}複製代碼
使用自定義屬性來設置變量名,並使用特定的 var() 來訪問,區分大小寫 編程
var(--color); var(--Color);是不一樣的兩個瀏覽器
它們與color、font-size等正式屬性沒有什麼不一樣,只是沒有默認含義。因此 CSS 變量(CSS variable)又叫作"CSS 自定義屬性"(CSS custom properties)。由於變量與自定義的 CSS 屬性實際上是一回事。sass
var()函數還可使用第二個參數,表示變量的默認值。若是該變量不存在,就會使用這個默認值。bash
var(--bg, #111)這種狀況只存在於沒有默認值less
:root {
--color:#000;
}
body {
--color:#002;
color : var(--color);
}
//這裏用個大佬們的例子,下面每一個字的顏色都是按選擇器的優先級現實的
<style>
:root { --color: blue; }
div { --color: green; }
#alert { --color: red; }
* { color: var(--color); }
</style>
<p>藍色</p>
<div>綠色</div>
<div id="alert">紅色</div>複製代碼
須要注意的是 CSS 變量並不支持 !important 聲明。ide
var()函數還能夠用在變量的聲明。函數
:root {
--color: red;
--bg: var(--color);
}複製代碼
注意,變量值只能用做屬性值,不能用做屬性名。
:root { --color: color; var(--color): red; }複製代碼
這樣是不合法的
--one: '1px';
--border: var(--one)' solid red';複製代碼
.foo {
--top: 20;
/* 無效,至關於沒有設置 */
margin-top: var(--top)px;
}複製代碼
.foo {
--top: "20px";
/* 無效,至關於沒有設置 */
margin-top: var(--top);
}複製代碼
.foo {
--top: 20;
margin-top: calc(var(--top) * 1px);
}複製代碼
在傳統的CSS概念裏,屬性的有效性(validity)對於自定義屬性來說,並不適用。當自定義屬性被解析,瀏覽器不知道哪裏爲調用到它們,因此幾乎全部的值都是有效的。
不幸的是,這些有效值能經過var()函數操做符來調用,即便在當前上文沒有意義。因此屬性和自定義的值會致使無效的CSS聲明。
:root {
--mainWidth:1000px;
--leftMargin:100px;
}
.main {
width: var(--mainWidth);
margin-left: var(--leftMargin);
}
@media screen and (min-width:1480px) {
:root {
--mainWidth:800px;
--leftMargin:50px;
}
}複製代碼
a {
color: #7F583F;
color: var(--primary);
}
/* 用屬性值得無效聲明 */
@supports ( (--a: 0)) {
/* supported */
}
@supports ( not (--a: 0)) {
/* not supported */
}
/* 也可使用@support命令進行檢測。 */
const isSupported =
window.CSS &&
window.CSS.supports &&
window.CSS.supports('--a', 0);
if (isSupported) {
/* supported */
} else {
/* not supported */
}
/* JavaScript 檢測瀏覽器是否支持 CSS 變量。 */複製代碼
:root{
--testMargin:75px;
}
var root = getComputedStyle(document.documentElement);
// 讀取
var cssVariable = root.getPropertyValue('--testMargin').trim();
console.log(cssVariable); // '75px'
// 寫入
root.setProperty('--testMargin', '100px');
// 刪除變量
root.removeProperty('--testMargin');複製代碼
這意味着,JavaScript 能夠將任意值存入樣式表。
const btn = document.getElementById("button");
const docStyle = document.documentElement.style;
btn.onClick = function(){
docStyle.style.setProperty('--tplColor', 'yellow');
}複製代碼
const docStyle = document.documentElement.style;
document.addEventListener('mousemove', (e) => {
docStyle.setProperty('--mouse-x', e.clientX);
docStyle.setProperty('--mouse-y', e.clientY);
});複製代碼
其實CSS也是一個很是牛逼的東西善用他的各類屬性頁面也會變得很是有趣,而他也在慢慢向可編程的方向發展。