這篇文章的內(nèi)容主要圍繞怎么使用純CSS仿AntDesign的Logo彩蛋效果進行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學習,值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供望城企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站設計、網(wǎng)站建設、H5開發(fā)、小程序制作等業(yè)務。10年已為望城眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
最近項目中 Ant Design 接入比較多,還是非常不錯的。不知道大家有沒有發(fā)現(xiàn)這樣的效果,在官網(wǎng)上,如果鼠標放在Logo上,字母i
上的圖標會不停的變化,離開后停止,放上去重新變化,算得上是一個小彩蛋(可能我之前沒發(fā)現(xiàn)),演示如下:
不過沒發(fā)現(xiàn)也不意外,因為這個效果是 js 實現(xiàn)的,必須等待加載完成才能生效,而官網(wǎng)有時候又特別的慢,比如像這種還在加載的情況下,大概率是不會有以上的hover
效果的
嗯,思考了一下,這種效果完全可以用純 CSS 來完成呀,實現(xiàn)成本又低,又能有效避免上述的加載問題,一起看看吧
整個實現(xiàn)原理大致如下
準備一個包含所有小圖標的素材
創(chuàng)建一個改變背景位置的CSS逐幀動畫
通過鼠標 hover 來控制動畫運行
為了避免多次請求,也為了方便創(chuàng)建動畫,這里把所有小圖標素材組合在一塊(從官網(wǎng)另存下來的),就像以前的“雪碧圖”一樣,如下
假設 HTML 結(jié)構(gòu)是這樣的
<h2 class="logo">Ant Design</h2>
為了更好的語義化,這里的文字建議保留,然后通過其他方式隱藏文字(比如透明度),可以將 logo 作為背景圖片,然后可變化的小圖標用偽元素生成(裝飾性的元素都可以用偽元素來生成,保證HTML的整潔),CSS 如下
.logo{ width: 500px; height: 100px; position: relative; color: transparent; background: url('https://imgservices-1252317822.image.myqcloud.com/image/012420220165011/c0e82c29.svg') center/contain no-repeat; cursor: pointer; } .logo::after{ content: ''; position: absolute; width: 32px; height: 32px; background: url('https://imgservices-1252317822.image.myqcloud.com/image/012420220165415/b0005044.svg') 0 / cover no-repeat; right: 113px; top: -18px; }
靜態(tài)布局就算出來了
然后是動畫,只需要利用 CSS 動畫函數(shù)中的 steps() 功能符,就可以實現(xiàn)逐幀動畫
首先定義一個關鍵幀,改變背景位置就行了
@keyframes random { to { background-position: 100%; } }
這里小圖標總共有 11張,相互之間的變化就是 10步,所以動畫設置如下
.logo::after{ /*其他樣式*/ animation: random 1s steps(10) infinite; }
這樣就得到了一個無限循環(huán)的逐幀動畫
默認情況下,CSS動畫是默認運行的,但是現(xiàn)在的需求是,只有鼠標 hover
上去才會動起來。
可能有同學會這樣做,默認情況下沒有動畫,hover 的時候創(chuàng)建動畫,如下
.logo::after{ /*默認無動畫*/ } .logo:hover::after{ animation: random 1s steps(10) infinite; }
但是這樣做會有兩個問題:
每次實時創(chuàng)建動畫會有更多的性能消耗
每次鼠標離開后位置就還原成初始狀態(tài)了
因此,這種方式并不可取
除了上述方式可以控制動畫運行之外,還可以通過animation-play-state
主動設置暫停,如下
.logo::after{ /*其他樣式*/ animation: random 1s steps(10) infinite; animation-play-state: paused; /*動畫暫停*/ }
這樣下來,默認就不會動了,然后在hover
的時候“運行”就行了
.logo:hover::after{ animation-play-state: running; /*動畫運行*/ }
現(xiàn)在默認是小圖標是第一個,如果想指定另外一個,比如
這種情況如何處理呢
首先我們想到,可以手動改變背景位置就行了,在第8個,所以
.logo::after{ /*其他樣式*/ background-position: -224px; /* 32 * 7 */ }
效果如下
這樣下來,問題更多,由于改變了動畫的起始位置,動畫從第 8 個的地方運動到最右側(cè),左邊的都不經(jīng)過了,step 也需要重新調(diào)整。
除了這種方式,還可以通過動畫的“負延遲”來實現(xiàn),給動畫添加一個負的延遲后,動畫會提前運動到未來位置。
比如這里想指定到未來第7幀的位置,就可以延遲負的總運動時長的 7/ 10 ,實現(xiàn)如下
.logo::after{ /*其他樣式*/ animation-delay: -.7s; /* 7 / 10 * 1s*/ }
這樣就不會影響原有的動畫了,完美實現(xiàn)
完整代碼可以訪問:Ant Design Logo (codepen.io)
https://codepen.io/xboxyan/pen/LYOPoxz
附上完整代碼(最近codepen貌似不太穩(wěn)定)
.logo{ width: 500px; height: 100px; position: relative; color: transparent; background: url('https://imgservices-1252317822.image.myqcloud.com/image/012420220165011/c0e82c29.svg') center/contain no-repeat; cursor: pointer; } .logo::after{ content: ''; position: absolute; width: 32px; height: 32px; background: url('https://imgservices-1252317822.image.myqcloud.com/image/012420220165415/b0005044.svg') 0 / cover no-repeat; right: 113px; top: -18px; animation: random 1s -.7s steps(10) infinite; animation-play-state: paused; } .logo:hover::after{ animation-play-state: running; } @keyframes random { to { background-position: 100%; } }
上面就是針對 Ant Design 官網(wǎng) Logo 效果的 CSS 實現(xiàn),代碼量非常少,而且也避免了 js 未加載完成時的問題,體驗更好,下面簡單總結(jié)一下
CSS 渲染是及時的,只要頁面可見,就不會影響 CSS 交互
逐幀動畫可以通過 CSS 動畫 中的 step() 函數(shù)實現(xiàn)
CSS 動畫可以自動運行,也可以手動暫停
通過設置負的延時,可以讓 CSS 動畫提前運行
當然,CSS 的優(yōu)點還不只這些,打開 Ant Design 控制臺,讓我有點崩潰的是,居然是不斷更換svg
鏈接實現(xiàn)的,如果一直放在 Logo 上就會源源不斷的請求圖片,小圖標也會出現(xiàn)“閃爍”的情況
感謝你的閱讀,相信你對“怎么使用純CSS仿AntDesign的Logo彩蛋效果”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關知識點,可以關注創(chuàng)新互聯(lián)網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>
網(wǎng)站題目:怎么使用純CSS仿AntDesign的Logo彩蛋效果
標題鏈接:http://www.rwnh.cn/article40/jgpoeo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、網(wǎng)站排名、企業(yè)建站、網(wǎng)站內(nèi)鏈、搜索引擎優(yōu)化、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)