摘要:就像上圖這樣的動(dòng)畫(huà)效果在導(dǎo)航欄里的時(shí)候,下劃線跟隨鼠標(biāo)移動(dòng),鼠標(biāo)移出導(dǎo)航欄時(shí),下劃線回到初始位置,同時(shí)要適應(yīng)導(dǎo)航的寬度為了適應(yīng)導(dǎo)航的寬度,就不能給導(dǎo)航元素設(shè)置,然后將導(dǎo)航元素的設(shè)置給下劃線然后需要讓下劃線獨(dú)立于導(dǎo)航之外,從而保證
就像上圖這樣的動(dòng)畫(huà)效果
在導(dǎo)航欄里的時(shí)候,下劃線跟隨鼠標(biāo)移動(dòng),鼠標(biāo)移出導(dǎo)航欄時(shí),下劃線回到初始位置,同時(shí)要適應(yīng)導(dǎo)航的寬度
?
為了適應(yīng)導(dǎo)航的寬度,就不能給導(dǎo)航元素設(shè)置 margin,然后將導(dǎo)航元素的 clientWidth 設(shè)置給下劃線
然后需要讓下劃線獨(dú)立于導(dǎo)航之外,從而保證它的無(wú)縫滑動(dòng)(其實(shí)也可以用偽類(lèi)元素實(shí)現(xiàn),不過(guò)效果不夠好)
再根據(jù)左側(cè)導(dǎo)航的寬度總和,計(jì)算出下劃線左移的距離
?
?
一、基本結(jié)構(gòu)
基于上面的思路,HTML 結(jié)構(gòu)可以設(shè)計(jì)成這樣:
并將下劃線的 width 和 left 設(shè)置為動(dòng)態(tài) style,在鼠標(biāo)滑動(dòng)時(shí)實(shí)時(shí)修改
?
然后給 MainHeader 和 Underline 添加 CSS 樣式:
.main {
position: relative;
width: fit-content;
margin: 0 auto;
text-align: center;
}
.nav-underline {
position: absolute;
bottom: 0;
display: block;
height: 2px;
background-color: #000;
transition: all .2s ease-out;
}
?
?
二、移動(dòng)下劃線
因?yàn)樾枰獙?shí)時(shí)修改下劃線的寬度,所以需要監(jiān)聽(tīng)?mouseenter 事件,獲取當(dāng)前元素
但如果導(dǎo)航元素 nav 還有子元素 (比如上面的 nav-title),直接用 event.target 就有問(wèn)題
經(jīng)過(guò)取舍,我決定獲取 MainHeader 的 childNodes,然后根據(jù) v-for 的 index 去查找對(duì)應(yīng)的導(dǎo)航元素
在對(duì)應(yīng)的事件處理函數(shù)里面,將導(dǎo)航元素的 clientWidth 設(shè)置為下劃線的寬度
同時(shí)計(jì)算當(dāng)前導(dǎo)航的左側(cè)所有導(dǎo)航的寬度之和,作為下劃線的左移距離
setCurrentNav (index) {
// 鼠標(biāo)移動(dòng)到導(dǎo)航時(shí),記錄臨時(shí)狀態(tài)
this.currentNav = index
this.currentNavStyle = this.getNavStyle(index)
},
getNavStyle (index) { // 根據(jù)導(dǎo)航的 index 移動(dòng)下劃線
let childNodes = this.$refs.MainHeader.childNodes
// 根據(jù)當(dāng)前導(dǎo)航的寬度,設(shè)置下劃線的寬度
let width = childNodes[index].clientWidth
// 設(shè)置下劃線的默認(rèn)位置
let left = 0
if (index > 0) {
// 計(jì)算左邊導(dǎo)航的總寬度,設(shè)置為下劃線的左移距離
for (let i = 0; i < index; i++) {
left += childNodes[i].clientWidth
}
}
return {width, left}
}
最后在 computed 里面動(dòng)態(tài)修改下劃線樣式
?
?
三、完善激活狀態(tài)
上面實(shí)現(xiàn)了鼠標(biāo)移動(dòng)時(shí)候的下劃線跟隨效果
但對(duì)于點(diǎn)擊導(dǎo)航后但激活狀態(tài) active 還沒(méi)有做處理
在導(dǎo)航元素上添加 click 事件的處理函數(shù),記錄下激活元素的 index
setActiveNav (index) {
// 點(diǎn)擊導(dǎo)航時(shí),設(shè)置激活樣式
this.activeNav = index
this.activeNavStyle = this.getNavStyle(index)
}
?
當(dāng)鼠標(biāo)移出 MainHeader 的時(shí)候,下劃線還得回到 active 的位置
上面已經(jīng)對(duì)?navLineStyle() 做了兼容處理,所以只需要在鼠標(biāo)移出的時(shí)候,清空?currentNavStyle 即可
handleLeaveMainHeader () {
// 鼠標(biāo)離開(kāi)導(dǎo)航欄時(shí),重置下劃線狀態(tài)
this.currentNavStyle = null
}
?
?
四、純CSS實(shí)現(xiàn)下劃線跟隨
參考鏈接:https://github.com/chokcoco/iCSS/issues/33?
如果對(duì)于整個(gè)動(dòng)畫(huà)效果的要求不是特別高, 可以用偽類(lèi)元素實(shí)現(xiàn)下劃線跟隨
所以 HTML 結(jié)構(gòu)里面就不用將下劃線獨(dú)立出來(lái)
然后使用 after 畫(huà)出下劃線
.nav {
position: relative;
overflow: hidden;
&::after {
content: ";
position: absolute;
bottom: 0;
left: 100%;
width: 0;
height: 2px;
background-color: #000;
transition: all 0.3s ease-out;
}
}
這里設(shè)置了 width: 0; left: 100%; 這是為了讓下劃線默認(rèn)從右向左出現(xiàn),然后從左向右消失
然后在 hover 狀態(tài)下,將對(duì)應(yīng)的 after 設(shè)置為 width: 100%; left: 0;
最后使用 CSS 中的相鄰元素選擇器 ( + ) 選擇相鄰的 after,設(shè)置左移為 left: 0;
.nav {
&:hover {
&::after {
width: 100%;
left: 0;
}
& + .nav::after {
left: 0;
}
}
}
從而實(shí)現(xiàn)相鄰下劃線 after 能從左向右出現(xiàn),動(dòng)畫(huà)連起來(lái)就像是下劃線跟隨鼠標(biāo)滑動(dòng)了
這種方式不夠完美,但僅僅需要幾行 CSS 就能實(shí)現(xiàn),還是非常厲害的
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/1231.html
摘要:代碼大致如下點(diǎn)擊跟隨結(jié)合使用類(lèi)即可實(shí)現(xiàn)點(diǎn)擊跟隨使用參考資料不可思議的光標(biāo)下劃線跟隨效果不可思議的純導(dǎo)航欄下劃線跟隨效果切換下劃線跟隨實(shí)現(xiàn) showImg(https://segmentfault.com/img/bVbg4wM?w=699&h=91); HTML 結(jié)構(gòu)如下: 不可思議的CSS 導(dǎo)航欄 光標(biāo)小下劃線跟隨 PURE CSS Nav Underline ...
摘要:代碼大致如下點(diǎn)擊跟隨結(jié)合使用類(lèi)即可實(shí)現(xiàn)點(diǎn)擊跟隨使用參考資料不可思議的光標(biāo)下劃線跟隨效果不可思議的純導(dǎo)航欄下劃線跟隨效果切換下劃線跟隨實(shí)現(xiàn) showImg(https://segmentfault.com/img/bVbg4wM?w=699&h=91); HTML 結(jié)構(gòu)如下: 不可思議的CSS 導(dǎo)航欄 光標(biāo)小下劃線跟隨 PURE CSS Nav Underline ...
摘要:代碼大致如下點(diǎn)擊跟隨結(jié)合使用類(lèi)即可實(shí)現(xiàn)點(diǎn)擊跟隨使用參考資料不可思議的光標(biāo)下劃線跟隨效果不可思議的純導(dǎo)航欄下劃線跟隨效果切換下劃線跟隨實(shí)現(xiàn) showImg(https://segmentfault.com/img/bVbg4wM?w=699&h=91); HTML 結(jié)構(gòu)如下: 不可思議的CSS 導(dǎo)航欄 光標(biāo)小下劃線跟隨 PURE CSS Nav Underline ...
摘要:一般來(lái)講,我們的網(wǎng)頁(yè)導(dǎo)航欄是這么個(gè)模式來(lái)構(gòu)建在結(jié)構(gòu)上首先我們需要給導(dǎo)航欄的給個(gè)類(lèi)名一般為然后就是一個(gè)無(wú)序表格由于導(dǎo)航欄的文字一般都是鏈接用來(lái)跳轉(zhuǎn)頁(yè)面要在里面包含一個(gè)首頁(yè)云云商城智慧門(mén)店?duì)I銷(xiāo)平臺(tái)媒體聯(lián)盟關(guān)于云道在樣式上目前我見(jiàn)過(guò)的分為兩種導(dǎo)航一般來(lái)講,我們的網(wǎng)頁(yè)導(dǎo)航欄是這么個(gè)模式來(lái)構(gòu)建在結(jié)構(gòu)上:1.首先我們需要給導(dǎo)航欄的div 給個(gè)類(lèi)名 一般為nav2.然后就是一個(gè)無(wú)序表格?3.由于導(dǎo)航欄的文...
摘要:絕對(duì)定位的特性包裹性包裹性展示跟一樣也具有包裹性?xún)烧叩陌远碱?lèi)似于使元素化破壞性破壞性展示相對(duì)于引起父元素塌陷要更進(jìn)一步上面的例子就可以看出元素完全脫離文檔流并且被其它盒子以及盒子內(nèi)的文本無(wú)視替代方案由于濫用會(huì)降低擴(kuò)展性和維護(hù)性所以需要 絕對(duì)定位的特性 包裹性 absolute包裹性展示 跟float一樣,absolute也具有包裹性,兩者的包裹性都類(lèi)似于使元素inline-bloc...
閱讀 3325·2021-11-12 10:36
閱讀 2483·2021-11-02 14:43
閱讀 2156·2019-08-30 14:23
閱讀 3470·2019-08-30 13:08
閱讀 928·2019-08-28 18:09
閱讀 3141·2019-08-26 12:22
閱讀 3154·2019-08-23 18:24
閱讀 2024·2019-08-23 18:17