溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

CSS變量帶來(lái)的質(zhì)變有哪些

發(fā)布時(shí)間:2021-03-18 14:59:41 來(lái)源:億速云 閱讀:155 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了CSS變量帶來(lái)的質(zhì)變有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、CSS變量帶來(lái)的質(zhì)變

CSS變量帶來(lái)的提升絕不僅僅是節(jié)約點(diǎn)CSS代碼,以及降低CSS開發(fā)和維護(hù)成本。

更重要的是,把組件中眾多的交互開發(fā)從原來(lái)的JS轉(zhuǎn)移到了CSS代碼中,讓組件代碼更簡(jiǎn)潔,同時(shí)讓視覺(jué)表現(xiàn)實(shí)現(xiàn)更加靈活了。

我們通過(guò)幾個(gè)案例來(lái)說(shuō)明這一變化。

二、簡(jiǎn)化了JS對(duì)DOM設(shè)置的介入

案例1:loading進(jìn)度效果

例如實(shí)現(xiàn)下圖所示的變量效果:

CSS變量帶來(lái)的質(zhì)變有哪些

外面有一層背景層,然后里面有進(jìn)度條,還有進(jìn)度值。

在過(guò)去,會(huì)使用兩層div元素,然后JS去改變里面有顏色條條的寬度,同時(shí)設(shè)置進(jìn)度值。

也就是,loading的進(jìn)度效果和進(jìn)度值全部都是JS直接設(shè)置的,JS同時(shí)對(duì)應(yīng)多個(gè)HTML信息。

現(xiàn)在,有了CSS變量,JS所做的工作就非常簡(jiǎn)單,僅僅在容器元素上設(shè)置loading進(jìn)度值即可,其他什么都不需要做,至于樣式表現(xiàn),或者進(jìn)度值如何顯示,全部都是CSS的事情。

相關(guān)代碼如下:

<label>圖片1:</label>
<div class="bar" style="--percent: 60;"></div>
<label>圖片2:</label>
<div class="bar" style="--percent: 40;"></div>
<label>圖片3:</label>
<div class="bar" style="--percent: 20;"></div>
.bar {
    height: 20px; width: 300px;
    background-color: #f5f5f5;
}
.bar::before {
    display: block;
    counter-reset: progress var(--percent);
    content: counter(progress) '%\2002';
    width: calc(1% * var(--percent));
    color: #fff;
    background-color: #2486ff;
    text-align: right;
    white-space: nowrap;
    overflow: hidden;
}

可以看到,我們只需要一層div標(biāo)簽,DOM層級(jí)簡(jiǎn)單了,然后,需要修改的HTML變化項(xiàng)僅僅是一個(gè) --percent 自定義屬性而已。

眼見為實(shí),您可以狠狠地點(diǎn)擊這里: CSS百分比變量與進(jìn)度條demo

三、CSS變量成為了CSS API接口

過(guò)去點(diǎn)擊出現(xiàn)提示,切換等效果都需要JS針對(duì)特定的元素進(jìn)行樣式設(shè)置,現(xiàn)在有了CSS變量,我們只需要一段通用的非常簡(jiǎn)單的全局JS就可以了,JS就可以自己玩耍去了,其他效果,全部交給JS處理。

這段JS如下:

/**
 * @author zhangxinxu(.com)
 * @description 點(diǎn)擊頁(yè)面任意位置,標(biāo)記坐標(biāo)位置
 */
document.addEventListener('mousedown', function (event) {
    var target = event.target;
    var body = document.body;
    var html = document.documentElement;

    // 設(shè)置自定義屬性值
    body.style.setProperty('--pagex', event.pageX);
    body.style.setProperty('--pagey', event.pageY);

    html.style.setProperty('--clientx', event.clientX);
    html.style.setProperty('--clienty', event.clientY);
    html.style.setProperty('--scrolly', window.pageYOffset);

    target.style.setProperty('--offsetx', event.offsetX);
    target.style.setProperty('--offsety', event.offsetY);
    target.parentElement.style.setProperty('--target-width', target.clientWidth);
    target.parentElement.style.setProperty('--target-height', target.clientHeight);
    target.parentElement.style.setProperty('--target-left', target.offsetLeft);
    target.parentElement.style.setProperty('--target-top', target.offsetTop);
});

可以看到,JavaScript代碼再也不負(fù)責(zé)任何與交互行為相關(guān)的邏輯,直接變成了工具人,一個(gè)單純地傳遞點(diǎn)擊坐標(biāo)位置,以及點(diǎn)擊元素偏移和尺寸信息的工具人。

CSS得到了什么呢?

得到了一個(gè)巨大的寶藏,一個(gè)隨時(shí)可以拿來(lái)使用的寶藏。

我想要點(diǎn)擊按鈕的時(shí)候有什么花哨的反饋,或者點(diǎn)擊頁(yè)面空白也來(lái)個(gè)創(chuàng)意的交互提示,完全不成問(wèn)題,隨用隨取,無(wú)比方便,無(wú)比自由。

可以說(shuō),上面這段JS,或者類似的JS代碼是未來(lái)web開發(fā)的標(biāo)配。

我們來(lái)看看上面的代碼可以實(shí)現(xiàn)怎樣的效果。

案例2:按鈕點(diǎn)擊圈圈效果

點(diǎn)擊按鈕的時(shí)候有個(gè)圈圈放大的效果,圈圈放大的中心點(diǎn)就是點(diǎn)擊的位置。

效果如下GIF所示:

CSS變量帶來(lái)的質(zhì)變有哪些

核心CSS代碼如下:

.btn:not([disabled]):active::after {
    transform: translate(-50%,-50%) scale(0);
    opacity: .3;
    transition: 0s;
}
.btn::after {
    content: "";
    display: block;
    position: absolute;
    width: 100%; height: 100%;
    left: var(--x, 0); top: var(--y, 0);
    pointer-events: none;
    background: radial-gradient(circle, currentColor 10%, transparent 10.01%) no-repeat 50%;
    transform: translate(-50%,-50%) scale(10);
    opacity: 0;
    transition: transform .3s, opacity .8s;
}

:active 時(shí)候隱藏,同時(shí)設(shè)置過(guò)渡時(shí)間為0。于是,點(diǎn)擊釋放的時(shí)候,就會(huì)有過(guò)渡效果。

大家可以訪問(wèn)這個(gè)地址進(jìn)行體驗(yàn): https://xy-ui.codelabo.cn/docs/#/xy-button

案例3:點(diǎn)擊頁(yè)面出現(xiàn)文字效果

又例如,點(diǎn)擊本文頁(yè)面任意位置都會(huì)出現(xiàn)下圖所示的提示信息。

CSS變量帶來(lái)的質(zhì)變有哪些

就是下面上面那段萬(wàn)能工具人JS加下面這段CSS實(shí)現(xiàn)的:

body:active::after {
    transform: translate(-50%, -100%);
    opacity: 0.5;
    transition: 0s;
    left: -999px;
}
body::after {
    content: 'zhangxinxu.com';
    position:fixed;
    z-index: 999;
    left: calc(var(--clientx, -999) * 1px);
    top: calc(var(--clienty, -999) * 1px);
    transform: translate(-50%, calc(-100% - 20px));
    opacity: 0;
    transition: transform .3s, opacity .5s;
}

案例3:兩個(gè)按鈕下劃線滑來(lái)滑去效果

以前,下圖這種點(diǎn)擊選項(xiàng)卡按鈕,然后下劃線滑來(lái)滑去,尺寸還變化效果,使用純CSS實(shí)現(xiàn)很考驗(yàn)功力,幾乎99.99%的開發(fā)都是借助JS去查詢對(duì)應(yīng)DOM元素,然后設(shè)置寬高和位置實(shí)現(xiàn)的交互效果。

CSS變量帶來(lái)的質(zhì)變有哪些

現(xiàn)在,有了工具人JS,只需要一段CSS就可以搞定了,甚至文字的高亮切換都可以純CSS搞定,就是這么神奇。

下面這里的效果就是實(shí)現(xiàn)的實(shí)時(shí)效果(若沒(méi)有效果,請(qǐng)?jiān)L問(wèn)原文 張?chǎng)涡?https://www.zhangxinxu.com/wordpress/?p=9477 ):

點(diǎn)擊任意的選項(xiàng)卡元素,就可以看到下劃線滑到對(duì)應(yīng)位置,同時(shí)為高亮的效果。

相關(guān)代碼如下:

<div class="yw-tab-tab"> 
  <a href="javascript:" class="yw-tab-a">QQ閱讀</a>
  <a href="javascript:" class="yw-tab-a">起點(diǎn)讀書</a>
  <a href="javascript:" class="yw-tab-a">紅袖讀書</a>
  <a href="javascript:" class="yw-tab-a">飛讀免費(fèi)小說(shuō)</a>
</div>
.yw-tab-tab {
    position: relative;
    display: flex;
    max-width: 414px;
    justify-content: space-between;
    border-bottom: 1px solid #717678;
    background-color: #fff;
    margin: 30px auto;
}
.yw-tab-tab::before,
.yw-tab-tab::after {
    position: absolute;
    width: calc(var(--target-width, 0) * 1px);
    left: calc(var(--target-left, -299) * 1px);
    color: #2a80eb;
}
.yw-tab-tab[style]::before,
.yw-tab-tab[style]::after  {
    content: '';
}
.yw-tab-tab::before {
    background-color: currentColor;
    height: calc(var(--target-height) * 1px);
    mix-blend-mode: overlay;
}
.yw-tab-tab::after {
    border-bottom: solid;    
    bottom: -2px;
    transition: left .2s, width .2s;
}
.yw-tab-a {
    color: #717678;
    padding: 10px 0;
}

如果是移動(dòng)端訪問(wèn),需要 mousedown 事件修改成 touchstart ,我就懶得調(diào)整了。

四、web組件的很多API接口可以拜拜了

以前web組件有一個(gè)什么功能,就新增一個(gè)API接口,看上去很厲害,實(shí)際上,加著加著,API越來(lái)越多,組件也越來(lái)越重,學(xué)習(xí)成本也越來(lái)越高,最后走向了死胡同,變得笨重,迎來(lái)了滅亡。

現(xiàn)在,可以改變思路了。

那些與交互表現(xiàn)密切相關(guān)的功能,事實(shí)上僅僅在組件容器元素上傳遞CSS自定義屬性就可以了,無(wú)需負(fù)責(zé)具體的定位,顯隱,或者樣式變化,全部交給CSS。

因?yàn)樵O(shè)計(jì)表現(xiàn)的東西是上層的,靈活的,個(gè)性的,應(yīng)該在CSS層面進(jìn)行駕馭才是合理的,匹配的。

例如上面提到的loading組件,無(wú)論是條狀的還是餅狀的都是這樣的處理邏輯,只負(fù)責(zé)傳遞進(jìn)度值,樣式無(wú)需關(guān)心。

又例如滑條框(如下圖Ant Design中的滑條的位置和提示效果)、popup提示框等都可以通過(guò)一個(gè)CSS自定義屬性完成,JS僅傳參不負(fù)責(zé)UI樣式。

CSS變量帶來(lái)的質(zhì)變有哪些

實(shí)在太晚了,已經(jīng)0:56了,我就不出demo演示了,大家領(lǐng)會(huì)去精神即可。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“CSS變量帶來(lái)的質(zhì)變有哪些”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI