從一次項(xiàng)目重構(gòu)說起CSS3自定義變量在項(xiàng)目的使用方法

關(guān)于CSS3變量
聲明變量的時(shí)候,變量名前面要加兩根連詞線(--
)。
body{ --color:red; }
上面代碼中,body選擇器里面聲明了一個(gè)自定義變量:--color
。
它與color等正式屬性沒有什么不同,只是沒有默認(rèn)含義。所以 CSS 變量(CSS variable)又叫做“CSS 自定義屬性"(CSS custom properties)——因?yàn)樽兞颗c自定義的 CSS 屬性其實(shí)是一回事。
而且,各種值都可以‘放入’CSS變量,CSS變量可以放在‘任何地方’。
當(dāng)然,類似的介紹網(wǎng)上一搜一堆,我們就暫且不論,進(jìn)入正題!
但像一些基本應(yīng)用,比如:全局通用顏色/大小值、網(wǎng)頁(yè)換膚之類的本文就不予討論了,大家可自行探索
起因 —— “選項(xiàng)卡”的重構(gòu)
記得筆者曾為社團(tuán)官網(wǎng)做過的一個(gè)項(xiàng)目中有一個(gè)用于宣傳的“選項(xiàng)卡”組件:
<div class="main-left-bottoms"> <div id="tabs"> <ul> <li class="on"><a name="錨點(diǎn)">社團(tuán)活動(dòng) </a></li> <li>社團(tuán)方向</li> <li>社長(zhǎng)寄語(yǔ)</li> <li>人才戰(zhàn)略</li> </ul> <div> <p>優(yōu)C社團(tuán)自成立以來,舉辦了大量的活動(dòng),用以豐富社團(tuán)成員的課余生活,達(dá)到勞逸結(jié)合的目的,事實(shí)證明,這樣也確實(shí)有效。<br> 比如,</p> <ol> <li>在母親節(jié),我們跟隨校方一起舉辦了<a href="http://www.50004.com/play52/fabebbfffcfa/XMzYwMzUwNjM4MA==/"> “孝·母親節(jié)”活動(dòng)</a>(視頻加載可能有些慢),并取得了巨大的成功;</li> <li>在冬至?xí)r,我們跟隨校方,以及各宿舍樓一起舉辦了<a href="http://sfxy.nyist.edu.cn/info/1068/3802.htm">“冬至包餃子”活動(dòng)</a>,大家都玩得非常歡樂;</li> <li>在閑暇時(shí),我們還積極參與院方舉辦的<a href="https://max.book118.com/html/2018/0513/166191393.shtm">“敬老院慰問”活動(dòng)</a>,體會(huì)非凡;</li> </ol> </div> <div class="hide"> <p> 優(yōu)C工作室創(chuàng)建于2009年,距今已有<span id="fffffyear"></span>年歷史。<br> 經(jīng)過這些年的發(fā)展,本社團(tuán)出現(xiàn)了各個(gè)方向的人才,有PHP、java、JavaWeb、 大數(shù)據(jù)等等。。。<font color="red">本社團(tuán)現(xiàn)今主流學(xué)習(xí)方向?yàn)镴avaWeb,即后端實(shí)現(xiàn),較偏向于網(wǎng)站的開發(fā)。</font> <br> 社團(tuán)經(jīng)常通過相應(yīng)的交流活動(dòng)來完成一個(gè)項(xiàng)目的開發(fā), 以增進(jìn)對(duì)知識(shí)的總結(jié),社員會(huì)不定時(shí)的參加一些競(jìng)賽,并都取得了不錯(cuò)的成績(jī)。<br><br> <font color="#ff7f50"> 具體個(gè)人規(guī)劃請(qǐng)掃描右側(cè)彈出二維碼詢問學(xué)長(zhǎng)!</font></p> </div> <script> document.getElementById('fffffyear').innerHTML = (new Date().getFullYear() - 2009) + ''; </script> <div class="hide"> <br><br> <p>雖然伴隨著不斷地有人加入、退出,但是,優(yōu)C仍然在這里,等著你們,并且我堅(jiān)信:優(yōu)C的未來一定會(huì)更加輝煌!</p> <p>——社長(zhǎng)心愿</p> </div> <div class="hide"> <br> <p>加入我們,加入優(yōu)C。<br><font color="#ff7f50">這里,有絕妙的知識(shí)體驗(yàn),腦洞大開的學(xué)長(zhǎng)學(xué)姐,帶你探索知識(shí),學(xué)習(xí)技巧,實(shí)操項(xiàng)目,應(yīng)對(duì)面試。</font><br> 在這里,有你想象不到的快樂!??!</p> </div> </div> </div>
.main-left-bottoms{width: 100%;min-height: 280px;margin-top: 10px;} .main-left-bottoms h1{color: orangered;font-style: italic;} .main-left-bottoms #tabs{width: 99%;padding:5px;min-height: 280px;} .main-left-bottoms #tabs ul{list-style:none;display:block;min-height:30px;line-height:30px;border-bottom:2px red solid;} .main-left-bottoms #tabs ul li{cursor:pointer;float:left;list-style:none;height:28px;line-height:28px;margin:0 3px;border:2px groove orangered;border-bottom:none;display:inline-block;width:65px;text-align:center;font-weight: bold;color: black;padding: 0 10px;} .main-left-bottoms #tabs ul li.on{border-bottom:2px solid skyblue;} .main-left-bottoms #tabs div{min-height: 199px;line-height:25px;border-top:none;padding:0.3125em;overflow:hidden;} #tabs div p{font-size: 0.838rem;} #tabs div ol li{font-size: 0.875rem;margin-top: 5px;} #tabs div ol li a{color: lightcoral;text-decoration: none;} #tabs div ol li a:hover{color: orange;} .main-left-bottoms .hide{display:none;}
然后通過JS為div點(diǎn)擊元素之外的(同級(jí))元素加上類名hide即可,非常簡(jiǎn)單。
后來學(xué)的多了,也越來越重視“用戶體驗(yàn)”,想到:如果能讓瀏覽器“記住”用戶退出前瀏覽的地方,不管是頁(yè)面、tab或者列表?那該多好啊。
于是就嘗試「用ajax輔助瀏覽器state列表」達(dá)到了整體頁(yè)面上的切換保存效果(點(diǎn)擊去這里)。這確實(shí)是一種好方法,但在我逐步推出了CSS系列文章后,就比較“貪心”了:能不能不用JavaScript就達(dá)到這種效果? —— ::target !
(這個(gè)之后我會(huì)再推出專題文章討論,在這里說總會(huì)有些“喧賓奪主”。。。)
再往后,CSS3推出了“自定義變量”屬性,正巧碰上官網(wǎng)頁(yè)面用vue重構(gòu),于是想著用CSS3變量把這一塊重做一遍吧:
CSS3變量實(shí)現(xiàn)tab切換
上面這個(gè)看似順滑的tab切換效果其實(shí)很簡(jiǎn)單(使用vue+scss完成):
要知道:JS中有3個(gè)針對(duì)style操作變量的API
- 讀取變量:
elem.style.getPropertyValue()
- 設(shè)置變量:
elem.style.setProperty()
- 刪除變量:
elem.style.removeProperty()
<div class="tab-navbar"> <nav> <a v-for="(v, i) in list" :key="v" :class="{ active: index === i }" @click="select(i)">標(biāo)題{{i + 1}}</a> </nav> <div> <ul ref="tabs" :style="`--tab-count: ${list.length}`"> <li v-for="(v, i) in list" :key="v" :style="`--bg-color: ${v}`">我是內(nèi)容{{i + 1}}</li> </ul> </div> </div>
.tab-navbar { display: flex; overflow: hidden; border-radius: 10px; width: 300px; height: 200px; nav { display: flex; height: 40px; background-color: #f0f0f0; line-height: 40px; text-align: center; a { flex: 1; cursor: pointer; transition: all 300ms; &.active { background-color: #3c9; color: #fff; } } } div { flex: 1; ul { --tab-index: 0; --tab-width: calc(var(--tab-count) * 100%); --tab-move: calc(var(--tab-index) / var(--tab-count) * -100%); display: flex; flex-wrap: nowrap; width: var(--tab-width); height: 100%; transform: translate3d(var(--tab-move), 0, 0); transition: all 300ms; } li { display: flex; justify-content: center; align-items: center; flex: 1; background-color: var(--bg-color); font-weight: bold; font-size: 20px; color: #fff; } } }
在<ul>
上定義--tab-index
表示Tab當(dāng)前的索引,當(dāng)點(diǎn)擊按鈕時(shí)重置--tab-index
的值,可實(shí)現(xiàn)不操作DOM移動(dòng)<ul>
的位置顯示指定的Tab。不操作DOM而可移動(dòng)<ul>
是因?yàn)槎x了--tab-move
,通過calc()
計(jì)算--tab-index
與--tab-move
的關(guān)系,從而操控transform:translate3d()
移動(dòng)<ul>
。
export default { data() { return { index: 0, list: ["#09f", "#f90", "#66f", "#f66"] }; }, methods: { select(i) { this.index = i; this.$refs.tabs.style.setProperty("--tab-index", i); } } };
另外,在<li>
上定義--bg-color
表示Tab的背景色,也是一種比較簡(jiǎn)潔的模板賦值方式,總比寫<li :style="backgroundColor:${color}">
要好看一些 —— 若多個(gè)屬性依賴一個(gè)變量賦值,那么使用變量賦值到style上就更方便了,那些屬性可在css文件里計(jì)算與賦值,這樣可幫助JS分擔(dān)一些屬性計(jì)算工作,大大提高了渲染性能。
想來,上面的這一個(gè)案例肯定不能過足客官的癮,那么:
CSS3自定義變量實(shí)現(xiàn)‘另類的’loading加載條
<ul class="strip-loading"> <li style="--line-index: 0"></li> <li style="--line-index: 1"></li> <li style="--line-index: 2"></li> <li style="--line-index: 3"></li> <li style="--line-index: 4"></li> <li style="--line-index: 5"></li> </ul>
.strip-loading { display: flex; justify-content: center; align-items: center; width: 200px; height: 200px; li { --time: calc(var(--line-index) * 200ms); border-radius: 3px; width: 6px; height: 30px; background-color: #f66; animation: beat 1.5s ease-in-out var(--time) infinite; & + li { margin-left: 5px; } } } @keyframes beat { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(.5); } }
var()
計(jì)算函數(shù)配合自定義變量作為animation動(dòng)畫的delay出現(xiàn),讓每個(gè)元素都擁有“自己的”延遲時(shí)間 —— CSS3變量大大簡(jiǎn)化了以前CSS中由 :nth-child(N)
帶來的一定程度上的代碼冗余。
炫酷的鼠標(biāo)移入跟蹤特效
說來也巧,在我寫這篇文章之前,恰好有一個(gè)社團(tuán)后端的學(xué)長(zhǎng)建議搞一個(gè)炫酷的button按鈕代替原來的提交按鈕:
改后效果大概是這樣的:
其實(shí)當(dāng)時(shí)“第一版”背景顏色用了linear-gradient+animation+hue-rotate,但是學(xué)長(zhǎng)說太花里胡哨了…嘿嘿,你們可以嘗試下
其實(shí)思路也比較簡(jiǎn)單,先對(duì)按鈕布局和著色,然后使用偽元素標(biāo)記鼠標(biāo)的位置,定義--x
和--y
表示偽元素在按鈕里的坐標(biāo),通過JS獲取鼠標(biāo)在按鈕上的offsetX和offsetY分別賦值給--x
和--y
,再對(duì)偽元素添加徑向漸變的背景色,大功告成,一個(gè)酷炫的鼠標(biāo)懸浮跟蹤效果就這樣誕生了。
<button class="track-btn"> <span>少年,點(diǎn)我吧,我將賜予你力量</span> </button>
.track-btn { margin: 0; padding: 0; /*自定義邊框*/ border: 0; /*消除默認(rèn)點(diǎn)擊藍(lán)色邊框效果*/ outline: none; -webkit-appearence: none; overflow: hidden; position: relative; border-radius: 25px; height: 49.9px; background-color: #66f; cursor: pointer; line-height: 50px; text-align: center; font-weight: bold; font-size: 18px; color: #fff; padding: 0 20px; span { position: relative; pointer-events: none; } &::before { --size: 0; position: absolute; left: var(--x); top: var(--y); width: var(--size); height: var(--size); background-image: radial-gradient(circle closest-side, #09f, transparent); content: ""; transform: translate3d(-50%, -50%, 0); transition: width 200ms ease, height 200ms ease; } &:hover::before { --size: 200px; } }
const btn = document.getElementsByClassName("track-btn")[0]; btn.addEventListener("mousemove", e => { btn.style.setProperty("--x", `${e.offsetX}px`); btn.style.setProperty("--y", `${e.offsetY}px`); });
你還可以在此之上添加更加優(yōu)秀的動(dòng)畫!
現(xiàn)實(shí)&展望
前面說了:css3變量你可以‘放在’任何地方 —— 事實(shí)上,哪怕是“不常為人所知”的 ::root
中,都可以作為單獨(dú)存放變量的“凈土”
//引用/修改style中的css3變量值 document.documentElement.style.setProperty("名",值)
值得注意的是:如果你要在css中修改自定義變量,目前建議最好是放到同一個(gè)“目標(biāo)”中!比如:
#angular { --angular: ""; } #angular:checked { --angular: "angular"; }
現(xiàn)在大多數(shù)網(wǎng)站都會(huì)根據(jù)頁(yè)面響應(yīng)式定義布局中項(xiàng)目之間的默認(rèn)間距及頁(yè)面上所有不同部分的默認(rèn)padding、字體大小甚至排版布局。但很多時(shí)候,我們只能通過不同的“外鏈css文件”切換或者小范圍內(nèi)改變所有相應(yīng)的屬性值。但這會(huì)導(dǎo)致一點(diǎn):在沒有到達(dá)“下一個(gè)“media臨界值”之前,總會(huì)有一些距離出現(xiàn)“意外”,比如:在某一段document.documentElement.clientWidth || document.body.clientWidth;
內(nèi),元素之間的間距會(huì)很大,但在較小的屏幕上空間不足以承受太多空白而且在之前或之后,其間距又會(huì)“突變”。
:root { --size: 1.5em; } @media (min-width: 30em) { :root { --size: 2em; } } .Container { margin: 0 auto; max-width: 60em; font-size: var(--size); }
我們還可以在js中監(jiān)聽resize頁(yè)面大小改變以實(shí)時(shí)改變 --size
的值,而且變量越多,節(jié)省的代碼更多。 —— 這在以前只能寄希望于引入scss / less庫(kù)了。
自定義屬性填補(bǔ)了scss/less中預(yù)處理器變量在某些場(chǎng)景下不能正確使用的空白。但是,不管從兼容性還是目前發(fā)展來看,在許多情況下使用預(yù)處理器變量仍是比較優(yōu)雅的選擇。一段時(shí)間內(nèi)很多網(wǎng)站應(yīng)該仍會(huì)將兩者結(jié)合使用:自定義屬性用于動(dòng)態(tài)主題,預(yù)處理器變量用于靜態(tài)模板。
到此這篇關(guān)于從一次項(xiàng)目重構(gòu)說起CSS3自定義變量在項(xiàng)目的使用方法的文章就介紹到這了,更多相關(guān)CSS3自定義變量在項(xiàng)目使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
CSS3 最強(qiáng)二維布局系統(tǒng)之Grid 網(wǎng)格布局
CS3的Grid網(wǎng)格布局是目前最強(qiáng)的二維布局系統(tǒng),可以同時(shí)對(duì)列和行進(jìn)行處理,將網(wǎng)頁(yè)劃分成一個(gè)個(gè)網(wǎng)格,可以任意組合不同的網(wǎng)格,做出各種各樣的布局,本文介紹CSS3 最強(qiáng)二維布局系2025-02-27- 本文介紹了如何使用CSS3的transform屬性和動(dòng)畫技巧實(shí)現(xiàn)波浪式圖片墻,通過設(shè)置圖片的垂直偏移量,并使用動(dòng)畫使其周期性地改變位置,可以創(chuàng)建出動(dòng)態(tài)且具有波浪效果的圖片墻,同2025-02-27
CSS3模擬實(shí)現(xiàn)一個(gè)雷達(dá)探測(cè)掃描動(dòng)畫特效(最新推薦)
文章介紹了如何使用CSS3實(shí)現(xiàn)一個(gè)雷達(dá)探測(cè)掃描的效果,包括夜色背景、蜘蛛網(wǎng)盤、掃描體的轉(zhuǎn)動(dòng)效果、尾巴陰影以及被掃描到的光點(diǎn),通過HTML和CSS的配合,實(shí)現(xiàn)了豐富的動(dòng)畫效果,2025-02-21- CSS3的Flexbox是一種強(qiáng)大的布局模式,通過設(shè)置display:flex可以輕松實(shí)現(xiàn)對(duì)齊、排列和分布網(wǎng)頁(yè)元素,它解決了傳統(tǒng)布局方法中的對(duì)齊、間距分配和自適應(yīng)布局等問題,接下來通過本2025-02-19
css3 實(shí)現(xiàn)icon刷新轉(zhuǎn)動(dòng)效果
本文給大家介紹css3 實(shí)現(xiàn)icon刷新轉(zhuǎn)動(dòng)效果,文章開頭給大家介紹了webkit-transform、animation、@keyframes這三個(gè)屬性,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一2025-02-19CSS3動(dòng)態(tài)效果之過渡屬性(最新推薦)
CSS3過渡屬性用于實(shí)現(xiàn)元素從一種樣式平滑過渡到另一種樣式,通過設(shè)置transition-property過渡屬性、transition-duration過渡時(shí)長(zhǎng)transition-timing-function過渡函數(shù)和trans2025-02-19CSS3實(shí)現(xiàn)動(dòng)態(tài)旋轉(zhuǎn)加載樣式的示例代碼
本文介紹了如何使用CSS3創(chuàng)建一個(gè)簡(jiǎn)單的動(dòng)態(tài)旋轉(zhuǎn)加載樣式,通過定義一個(gè)帶有類名“l(fā)oader”的HTML元素,并使用CSS樣式和@keyframes規(guī)則來實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫,你可以根據(jù)需要調(diào)整樣式2025-02-19使用CSS3實(shí)現(xiàn)平滑的過渡動(dòng)畫效果(實(shí)例代碼)
這篇文章主要介紹了如何使用CSS3的transition屬性實(shí)現(xiàn)平滑的過渡動(dòng)畫,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-13CSS3中使用flex和grid實(shí)現(xiàn)等高元素布局的示例代碼
本文介紹了使用CSS3中的Flexbox和Grid布局實(shí)現(xiàn)等高元素布局的方法,通過簡(jiǎn)單的兩列實(shí)現(xiàn)、每行放置3列以及全部代碼的展示,展示了這兩種布局方式的實(shí)現(xiàn)細(xì)節(jié)和效果,感興趣的朋2025-02-11使用CSS3和SVG創(chuàng)建圓形進(jìn)度條動(dòng)畫效果
CSS3和SVG的結(jié)合使用為網(wǎng)頁(yè)設(shè)計(jì)帶來了創(chuàng)新的動(dòng)態(tài)視覺效果,本文通過一個(gè)圓形進(jìn)度條的動(dòng)畫特效示例,展示了如何利用CSS3的動(dòng)畫功能和SVG的矢量圖形能力來創(chuàng)建豐富的用戶交互體2024-10-24