每天一个JS 小demo之通过事件委托实现菜单展开及选中特效。主要知识点:事件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
body {
	margin: 0;
	background: #f1f1f1;
}
p {
	margin: 0;
}	
#dorpDown {
	position: relative;
	margin: 30px auto;
	width: 120px;
}
#dorpDown h2 {
	margin: 0;
	font: 16px/36px "宋体";
	text-align: center;
	background: #fff;
}
#list {
	position: absolute;
	left: 0;
	top: 36px;
	width: 160px;
	height: 0;
	overflow: hidden;
}
#list ul {
	margin: 0;
	padding: 10px;
	list-style: none;
	background: #fff;
}
#list li {
	font: 14px/28px "宋体";
	text-indent: 10px;
	border-bottom: 1px solid #ccc;
}
#list .active {
	background: #666;
	color: #fff;
}
</style>
</head>
<body>
<div id="dorpDown">
	<h2>妙味中心</h2>
	<div id="list">
		<ul>
			<li><p>第1个选项</p></li>
			<li><p>第1个选项</p></li>
			<li><p>第1个选项</p></li>
			<li><p>第1个选项</p></li>
			<li><p>第1个选项</p></li>
			<li><p>第1个选项</p></li>
		</ul>
	</div>	
</div>
<script type="text/javascript" src="js/startmove.js"></script>
<script type="text/javascript">
(function(){
	var dorpDown = document.querySelector('#dorpDown');
	var list = document.querySelector('#list');
	dorpDown.onmouseover = function(){
		//var target = list.children[0].offsetHeight;
		show(list.children[0].offsetHeight,'bounceOut');
	};
	dorpDown.onmouseout = function(){
		show(0,"easeBoth");
	};
	list.onmouseover = function(e){
		console.log(e.target.tagName);
		if(e.target.tagName == "LI"||e.target.parentNode.tagName == "LI"){
			e.target.className = "active";
		}
	};
	list.onmouseout = function(e){
		if(e.target.tagName == "LI"||e.target.parentNode.tagName == "LI"){
			e.target.className = "";
		}
	};
	function show(target,type){
		startMove({
			el: list,
			target: {
				height: target
			},
			time: 500,
			type: type
		});
	}
})();	
</script>
</body>
</html>
//动画形式公式
var Tween = {
	linear: function (t, b, c, d){
		return c*t/d + b;
	},
	easeIn: function(t, b, c, d){
		return c*(t/=d)*t + b;
	},
	easeOut: function(t, b, c, d){
		return -c *(t/=d)*(t-2) + b;
	},
	easeBoth: function(t, b, c, d){
		if ((t/=d/2) < 1) {
			return c/2*t*t + b;
		}
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInStrong: function(t, b, c, d){
		return c*(t/=d)*t*t*t + b;
	},
	easeOutStrong: function(t, b, c, d){
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeBothStrong: function(t, b, c, d){
		if ((t/=d/2) < 1) {
			return c/2*t*t*t*t + b;
		}
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	elasticIn: function(t, b, c, d, a, p){
		if (t === 0) { 
			return b; 
		}
		if ( (t /= d) == 1 ) {
			return b+c; 
		}
		if (!p) {
			p=d*0.3; 
		}
		if (!a || a < Math.abs(c)) {
			a = c; 
			var s = p/4;
		} else {
			var s = p/(2*Math.PI) * Math.asin (c/a);
		}
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	elasticOut: function(t, b, c, d, a, p){
		if (t === 0) {
			return b;
		}
		if ( (t /= d) == 1 ) {
			return b+c;
		}
		if (!p) {
			p=d*0.3;
		}
		if (!a || a < Math.abs(c)) {
			a = c;
			var s = p / 4;
		} else {
			var s = p/(2*Math.PI) * Math.asin (c/a);
		}
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},  
	elasticBoth: function(t, b, c, d, a, p){
		if (t === 0) {
			return b;
		}
		if ( (t /= d/2) == 2 ) {
			return b+c;
		}
		if (!p) {
			p = d*(0.3*1.5);
		}
		if ( !a || a < Math.abs(c) ) {
			a = c; 
			var s = p/4;
		}
		else {
			var s = p/(2*Math.PI) * Math.asin (c/a);
		}
		if (t < 1) {
			return - 0.5*(a*Math.pow(2,10*(t-=1)) * 
					Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		}
		return a*Math.pow(2,-10*(t-=1)) * 
				Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
	},
	backIn: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
		   s = 1.70158;
		}
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	backOut: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
			s = 2.70158;  //回缩的距离
		}
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	}, 
	backBoth: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
			s = 1.70158; 
		}
		if ((t /= d/2 ) < 1) {
			return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		}
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	bounceIn: function(t, b, c, d){
		return c - Tween['bounceOut'](d-t, 0, c, d) + b;
	},      
	bounceOut: function(t, b, c, d){
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
		}
		return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
	},  
	bounceBoth: function(t, b, c, d){
		if (t < d/2) {
			return Tween['bounceIn'](t*2, 0, c, d) * 0.5 + b;
		}
		return Tween['bounceOut'](t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
	}
}
// 获取或者设置样式
function css(el,attr,val){
	if(arguments.length == 2){
		if(el.currentStyle){
			val = el.currentStyle[attr];
		} else {
			val = getComputedStyle(el)[attr];
		}
		return parseFloat(val);
	} else {
		if(attr == "opacity"){
			el.style.opacity = val;
			el.style.filter = "alpha(opacity= "+val*100+")";
		} else if(attr == "zIndex"){
			el.style[attr] = Math.round(val);
		}else {
			el.style[attr] = val + "px";
		}
	}
}
//执行动画
function startMove(init){
	clearInterval(init.el.timer);
	var t = 0; 
	var b = {};
	var c = {};
	var d = init.time/20;
	for( var s in init.target){ 
		b[s] = css(init.el,s);
		c[s] = init.target[s] - b[s];
	} 
	init.el.timer = setInterval(function(){
		t++;
		if(t > d){
			clearInterval(init.el.timer);
			init.callBack&&init.callBack();
		} else {
			for(var s in init.target){
				var val = Tween[init.type](t,b[s],c[s],d);
				css(init.el,s,val);
			}
		}
	},20);
}
每天一个JS 小demo之通过事件委托实现菜单展开及选中特效。主要知识点:事件的更多相关文章
- 每天一个JS 小demo之商品下架特效制作,主要知识点:定时器,倒计时,抖动特效。PS:由于不方便上传文件夹,只能上传效果图,图片等素材需自寻哟。
		
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
 - 每天一个JS 小demo之韩雪冬轮播图。主要知识点:html,css布局,对于数组和对象的理解和运用
		
@charset "utf-8"; /* CSS Document */ ;; } li { list-style: none; } img { border: none; } b ...
 - 每天一个JS 小demo之新建文件夹。主要知识点:DOM方法的综合运用
		
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
 - 每天一个JS 小demo之个人信息添加。主要知识点:DOM操作中的表格操作,节点操作
		
以下是简易效果: <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
 - 每天一个JS 小demo之商品筛选。主要知识点:DOM方法综合运用
		
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
 - 每天一个JS 小demo之日历制作。主要知识点:日期函数
		
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
 - 每天一个JS 小demo之“随机”抽奖。主要知识点:Math函数,数组方法,递归
		
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
 - 每天一个JS 小demo之留言板。主要知识点:DOM方法的理解和运用
		
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
 - 每天一个JS 小demo之树菜单。主要知识点:DOM方法综合运用,递归运用
		
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
 
随机推荐
- PLSQL 配置设置
			
1.登录后默认自动选中MyObjects 默认情况下,PLSQLDeveloper登录后,Brower里会选择Allobjects,如果你登录的用户是dba,要展开tables目录,正常情况都需要Wa ...
 - 记录——excel导出lua工具(python实现)
			
项目需要一个从excel导出lua配置表的工具,之前的工具是主程写的,效率极差,i7 CPU 一次全部导出要花掉1个多小时.匪夷所思的是,这么渣的效率,居然用了整整一年.当 然,中途有人反映效率差,主 ...
 - Python初识文本基本操作
			
初识文本的基本操作 怎么在文件里面写内容和都内容 文件操作过程 1,找到文件 文件路径 2,打开文件 file_obj=file(文件路径,模式) 3,文件操作,读写文件 file_obj.read( ...
 - 【源码学习】之requirejs
			
对于现在的前端生态来说,requirejs是有点过时了,webpack帮我们包干了一切.但是对于学习源码这件事情来说,永远是不过时的! 最近稍微闲下来了一点,就着以前做过的项目,我也来看看requir ...
 - 设计模式浅谈----策略模式(c#及java实现)
			
一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...
 - Mysql 忘记root密码后修改root密码
			
1.修改my.cnf: 在mysqld进程配置文件中添加skip-grant-tables,添加完成后记住保存. 2.重新启动MYSQL数据库: service mysqld restart 2.修改 ...
 - UVa1025 (DAG上的dp)
			
这是紫书上的第一个dp哈. 1.状态定义:dp[i][j]---->到时刻i的时候(出发的时候时刻为0,约定时间为时刻time),从j号车站开往N号车站,在车站等待的最少的时间. 2.这个人当前 ...
 - Mac电脑如何搭建php环境,并且开发php.
			
这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.12.4为例,需要的朋友可以参考下! Mac O ...
 - linux不需要密码ssh登陆
			
1. 自动ssh/scp方法A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux在A上运行命令: ...
 - Virtualbox让kali虚拟机共享主机的无线网络连接
			
今天在测试虚拟机下安装kali系统时,遇到一个问题,默认安装完kali系统后,虚拟机不能上网.虚拟机网络配置使用的是默认的网络地址转换(NAT)选项. 网上查了很多,都说使用NAT模式时虚拟机不用做任 ...