【前端】javascript實現導航欄筋斗雲效果特效

weixin_30788239發表於2020-04-05

實現效果:

  實現效果如下圖所示

實現原理:

什麼是筋斗雲效果:

  • 這個效果很簡單,就是滑鼠移到其他導航目錄時會有背景圖片跟著滑鼠滑動到當前的目錄。

實現思路:

  • 滑鼠經過的時候,利用offsetLeft獲得當前盒子距離左側的距離,把這個值賦給緩動動畫的end值。 
  • 當點選的時候記住當前的offsetLeft值,當滑鼠經過的時候把之前點選的offsetLeft給現在經過時候的值。

實現程式碼:

  下面是實現程式碼以及詳細註釋,核心設定一個position為absolute的span標籤,通過繫結滑鼠事件,用封裝好的animate動畫實現span的“筋斗雲”效果。

<!DOCTYPE html>
<html>
<head>
	<title>導航欄筋斗雲效果</title>
	<meta charset="utf-8">
	<style type="text/css">
		*{
			padding: 0;
			margin: 0;
		}
		body{
			background-color: rgba(0, 0, 0, 0.6);
		}
		.box{
			width: 415px;
			height: 42px;
			margin: 200px auto;
			background-color: #fff;
			position: relative;
		}
		ul{
			list-style: none;
			position: relative;
		}
		li{
			float: left;
			width: 83px;
			height: 42px;
			text-align: center;
			font: 500 15px/42px "微軟雅黑";
			cursor: pointer;
		}
		span{
			position: absolute;
			left: 0;
			top: 0;
			width: 83px;
			height: 42px;
			background-image: linear-gradient(to right,#03c03c 50% ,#51ee5d 100%);
		}
	</style>
</head>
<body>
<div class="box">
	<span></span>
	<ul>
		<li>選單欄1</li>
		<li>選單欄2</li>
		<li>選單欄3</li>
		<li>選單欄4</li>
		<li>選單欄5</li>
	</ul>
</div>

<script type="text/javascript">
	window.onload = function(){
		// 滑鼠放在哪個li上面,span對應一道到哪裡,移開後回到原位置
		var liArr = document.getElementsByTagName("li");
		var liWidth = liArr[0].offsetWidth;
		var span = document.getElementsByTagName("span")[0];
		// 計數器
		var cnt = 0;

		// for迴圈繫結事件
		for(var i=0; i<liArr.length; i++){
			// 自定義屬性,然後繫結index屬性為索引值
			liArr[i].index = i;
			// 滑鼠進入事件
			liArr[i].onmouseover = function(){
				// 然span運動到該li的索引值位置
				animate(span, this.index*liWidth);
			}
			// 滑鼠移開
			liArr[i].onmouseout = function(){
				// span運動到原位置
				animate(span, cnt*liWidth);
			}
			// 點選事件
			liArr[i].onclick = function(){
				// 計數器記錄當前標籤索引值
				cnt = this.index;
				animate(span, cnt*liWidth);
			}
		}

		// 緩動動畫封裝
		function animate(element, target){
			// 清除間歇呼叫
			clearInterval(element.timer);
			// 設定超時呼叫
			element.timer = setInterval(function(){
				// 設定步數
				var step = (target - element.offsetLeft)/10;
				// 調整步數
				step = step > 0 ? Math.ceil(step) : Math.floor(step);
				// 設定樣式
				element.style.left = element.offsetLeft + step + "px";
				// console.log(1);
				if(Math.abs(target - element.offsetLeft) < Math.abs(step)){
					element.style.left = target + "px";
					clearInterval(element.timer);
				}
			}, 20);
		}

	}
</script>
</body>
</html>

  

轉載於:https://www.cnblogs.com/dragonir/p/7750382.html

相關文章