嘿!大家好哇,今天來帶大家做一個可愛?的滑動導航欄效果,這個demo很基礎,但是使用場景非常廣泛噢 :happy: !作為前端大白,今天就手把手一步一步教你實現它吧!❤️
實現效果
看!這個滑動的效果很有趣吧!這樣的滑動效果相信你一定有想過吧!✋
實現過程
1. 前期準備
雖然這個控制元件很小,功能也不是很多,但我們還是需要先分析一下它的結構,以及實現的功能
- 滑鼠移入對應的列表項,底部的線會滑到相應的位置
- 點選相應的列表項,背景滑塊會切換到所選擇的列表項
<div class="slipNav">
<nav>
<a href="javascript:;" class="selected">首頁</a>
<a href="javascript:;">我的</a>
<a href="javascript:;">聯絡</a>
<a href="javascript:;">訂閱</a>
<a href="javascript:;">管理</a>
<a href="javascript:;">相簿</a>
<!-- 底部線條 -->
<div class="line"></div>
<!-- 背景滑塊 -->
<div class="bgc"></div>
</nav>
</div>
通過上面簡單的分析,我們可以寫出html結構,在基本列表項的基礎上新增了一個線條和滑塊:happy:
2. 使用CSS對導航條進行修飾
這部分很簡單沒有涉及什麼難得屬性,相信聰明可愛的你一定信手拈來:happy:
首先我們先對整個導航欄進行一些調整,給導航欄新增了背景顏色,同時新增一定的圓角,讓整個導航欄看起來圓嘟嘟?,由於後面內部的標籤使用了浮動和定位,所以這裡需要清除浮動噢!
.slipNav nav {
position: relative;
background-color: white;
border-radius: 50px;
}
.slipNav nav::after {
content: '';
display: block;
clear: both;
}
tips
:清除浮動的三件套要牢記噢!
接下來我們對每一個列表項進行美化吧!調整字型大小,行高使得文字狀態最佳 ☘️ !
.slipNav a {
position: relative;
float: left;
width: 150px;
line-height: 50px;
text-align: center;
font-size: 18px;
color: #000;
z-index: 1;
}
下面來對底部線條以及背景滑塊進行加工吧,通過絕對定位的方式定位到預設選擇文字的下方,背景滑塊也是同理!
.line {
position: absolute;
top: 50px;
left: 35px;
/* 線的長寬 */
height: 3px;
width: 80px;
background-color: #54a0ff;
transition: all .3s;
}
.bgc {
position: absolute;
top: 0px;
left: 25px;
height: 50px;
width: 100px;
border-radius: 50px;
background-color: rgb(84, 126, 233);
transition: all .3s;
}
3. 使用JS來實現線條滑塊的功能
在上面的美化過程中,我們對線條以及背景滑塊採用了絕對定位,就是為了下面通過控制left
值來控制它們的位置變化!下面就來實現吧!
實現功能:滑鼠移入對應的列表項,底部的線會滑到相應的位置
由於導航條中的專案過多,在後面查詢對應元素索引時會比較麻煩,所以我們先給所有的列表項新增一個自定義屬性data-index
來代表他們的索引
let slipAll = document.querySelectorAll('.slipNav nav a');
//給所有的a標籤新增index屬性,方便後面查詢
for (let i = 0; i < slipAll.length; i++) {
slipAll[i].setAttribute('data-index', i)
}
接下來我們通過監聽滑鼠移入的位置來計算線的left
值,
這裡通過事件委託來實現,通過獲取觸發事件的index
屬性來計算left
值,當滑鼠移出導航欄時,由於沒有選擇其他的項,所以線條需要回到原先被選中元素的位置
//滑鼠移入底下的線跟著移動
slipNav.addEventListener('mouseover', function (e) {
let target = e.target
let len = 150 * target.dataset.index + 35;// 計算當前的left值
line.style.left = len + 'px';
})
//滑鼠移出時底下的線回到原來的位置
slipNav.addEventListener('mouseleave', function (e) {
let selected = document.querySelector('.slipNav .selected')//原先被選中的元素
let len = 150 * selected.dataset.index + 35 // 線回到被選擇元素的位置
line.style.left = len + 'px'
})
注意:由於在css程式碼中設定了過渡屬性,所以在改變left值時,不會突變而是一個滑動過程噢!?
實現功能:點選相應的列表項,背景滑塊會切換到所選擇的列表項
當我們滑鼠點選列表項時,我們需要選中當前元素,背景塊需要定位到當前位置!實現方法相同
//滑鼠點選時背景顏色的滑塊滑倒相應的位置
slipNav.addEventListener('click', function (e) {
let target = e.target;
let bgc = document.querySelector('.bgc')
//排他思想
for (let i = 0; i < slipAll.length; i++) {
slipAll[i].classList.remove('selected')
}
target.classList.add('selected');// 通過新增類名實現顏色變化
let len = 150 * target.dataset.index + 25 // 計算背景滑塊left值
bgc.style.left = len + 'px';
})
完整程式碼
需要程式碼可以直接複製噢!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
background-color: rgb(221, 230, 245);
}
a {
color: inherit;
text-decoration: none;
}
.slipNav {
width: 920px;
margin: 100px auto;
}
.slipNav a {
position: relative;
float: left;
width: 150px;
line-height: 50px;
text-align: center;
font-size: 18px;
color: #000;
z-index: 1;
}
.slipNav nav {
position: relative;
background-color: white;
border-radius: 50px;
}
.slipNav nav::after {
content: '';
display: block;
clear: both;
}
.slipNav nav :hover {
color: #54a0ff;
}
.selected {
color: white !important;
}
.line {
position: absolute;
top: 50px;
left: 35px;
/* 線的長寬 */
height: 3px;
width: 80px;
background-color: #54a0ff;
transition: all .3s;
}
.bgc {
position: absolute;
top: 0px;
left: 25px;
/* 線的長寬 */
height: 50px;
width: 100px;
border-radius: 50px;
background-color: rgb(84, 126, 233);
transition: all .3s;
}
</style>
</head>
<body>
<div class="slipNav">
<nav>
<a href="javascript:;" class="selected">首頁</a>
<a href="javascript:;">我的</a>
<a href="javascript:;">聯絡</a>
<a href="javascript:;">訂閱</a>
<a href="javascript:;">管理</a>
<a href="javascript:;">相簿</a>
<!-- 底部線條 -->
<div class="line"></div>
<!-- 背景滑塊 -->
<div class="bgc"></div>
</nav>
</div>
<script>
let line = document.querySelector('.line');
let slipNav = document.querySelector('.slipNav nav');
let slipAll = document.querySelectorAll('.slipNav nav a');
//給所有的a標籤新增index屬性,方便後面查詢
for (let i = 0; i < slipAll.length; i++) {
slipAll[i].setAttribute('data-index', i)
}
//滑鼠移入底下的線跟著移動
slipNav.addEventListener('mouseover', function (e) {
let target = e.target
let len = 150 * target.dataset.index + 35;// 計算當前的left值
line.style.left = len + 'px';
})
//滑鼠移出時底下的線回到原來的位置
slipNav.addEventListener('mouseleave', function (e) {
let selected = document.querySelector('.slipNav .selected')
let len = 150 * selected.dataset.index + 35 // 線回到被選擇元素的位置
line.style.left = len + 'px'
})
//滑鼠點選時背景顏色的滑塊滑倒相應的位置
slipNav.addEventListener('click', function (e) {
let target = e.target;
let bgc = document.querySelector('.bgc')
//排他思想
for (let i = 0; i < slipAll.length; i++) {
slipAll[i].classList.remove('selected')
}
target.classList.add('selected');// 通過新增類名實現顏色變化
let len = 150 * target.dataset.index + 25 // 計算背景滑塊left值
bgc.style.left = len + 'px';
})
</script>
</body>
</html>
噢!完成了!以上就是本次demo的完整程式碼噢,感興趣的你可以動手試試噢!相信一定會有所收穫噢!