【前端】javascript实现导航栏筋斗云效果特效

2018-06-24 00:39:23来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

实现效果:

  实现效果如下图所示

实现原理:

什么是筋斗云效果:

  • 这个效果很简单,就是鼠标移到其他导航目录时会有背景图片跟着鼠标滑动到当前的目录。

实现思路:

  • 鼠标经过的时候,利用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>

  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:jQuery之Validation表单验证插件使用

下一篇:javascript 之作用域-06