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


    实现效果:

      实现效果如下图所示

    实现原理:

    什么是筋斗云效果:

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

    实现思路:

    • 鼠标经过的时候,利用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{
    			 415px;
    			height: 42px;
    			margin: 200px auto;
    			background-color: #fff;
    			position: relative;
    		}
    		ul{
    			list-style: none;
    			position: relative;
    		}
    		li{
    			float: left;
    			 83px;
    			height: 42px;
    			text-align: center;
    			font: 500 15px/42px "微软雅黑";
    			cursor: pointer;
    		}
    		span{
    			position: absolute;
    			left: 0;
    			top: 0;
    			 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>
    

      

  • 相关阅读:
    微信小程序中,block的作用
    关于小程序 页面中的生命周期函数
    MySQL -- 修改root密码
    Python3 -- time 获取任意前N天的日期
    linux -- 解决配置vim中文乱码的问题
    Linux -- iTem2 长时间保持会话(不断开)
    数据结构与算法 -- Python实现【归并排序算法】
    Git -- 目录
    Linux -- screen 命令
    python3 -- Linux 离线安装pip3方法
  • 原文地址:https://www.cnblogs.com/dragonir/p/7750382.html
Copyright © 2020-2023  润新知