jQuery动画、事件及省份城市三级关联

一、动画

js,animation

jQuery的动画的实现原理:只需要以固定的时间间隔【例如:0.1秒】,每次将DOM元素的css样式做出指定的修改,形成一个流畅的视觉效果

1.系统动画
1.1隐藏/显示

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			#box{
				width: 100px;
				height: 200px;
				background-color: cyan;
			}
		</style>
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<div id="box"></div>
		
		<button id="btn1">隐藏</button>
		<button id="btn2">显示</button>
		<button id="btn3">切换状态</button>
		
		
		<script>
			$(function(){
				/*
				 * hide(speed,callback),隐藏,相当于将需要被隐藏的标签的display设置为none
				 * 
				 * show(speed,callback),显示,相当于将需要被显示的标签的display设置为block,inline或者inline-block
				 * 
				 * spped表示动画执行的速度,用时间描述,单位:毫秒,默认值为slow(600ms),normal(400ms)
				 * fast(200ms)
				 * 
				 * 
				 * callback:回调函数,可以省略,表示当动画执行完成之后需要执行的操作
				 * 
				 */
				$("#btn1").bind("click",function(){
					//$("#box").hide(2000);
					
					//添加callback,当动画执行完毕之后需要做的操作,放到callback中执行
					$("#box").hide(2000,function(){
						
						alert("动画执行完毕");
						
						
					});
				});
				
				
				$("#btn2").bind("click",function(){
					$("#box").show(2000,function(){
						
						$(this).css("background-color","red");
					});
				});
					
			})
		</script>
	</body>
</html>
1.2切换可见状态

代码演示:

				/*
				 
				 * 
				 * toggle(speed,callback):实现切换元素的可见状态,如果元素是可见的,则切换为隐藏;如果是隐藏的,则切换为显示
				 * */
				$("#btn3").bind("click",function(){
					$("#box").toggle(2000,function(){
						
					});
				});
1.3淡入/淡出

fadeIn()

fadeOut()

fadeTo()

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			#box{
				width: 100px;
				height: 200px;
				background-color: cyan;
			}
		</style>
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<div id="box"></div>
		
		<button id="btn1">淡入</button>
		<button id="btn2">淡出</button>
		<button id="btn3">更改透明度</button>
		
		
		<script>
			$(function(){
				//淡入:从隐藏----》显示,从全透明-----》不透明
				$("#btn1").bind("click",function(){
					$("#box").fadeIn(2000,function(){
						
						$(this).css("background-color","red");
					});
				});
				
				//淡出:从显示----》隐藏  ,从不透明----》全透明
				$("#btn2").bind("click",function(){
					$("#box").fadeOut(2000,function(){
						alert("淡出成功");
						//$(this).css("background-color","red");
					});
				});
				
				//指定透明度
				//fadeTo(speed,a,callback),将一个全透明的标签更改为半透明的
				//不透明:1
				//注意:只是将透明度从不透明修改到指定透明度,不修改display属性
				$("#btn3").bind("click",function(){
					$("#box").fadeTo(2000,0,function(){
						alert("over");
						
					});
				});
			})
		</script>
	</body>
</html>
1.4滑入/滑出

slideDown()

slideUp()

slidetoggle()

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			#box{
				width: 100px;
				height: 200px;
				background-color: cyan;
			}
		</style>
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<div id="box"></div>
		
		<button id="btn1">滑入</button>
		<button id="btn2">滑出</button>
		<button id="btn3">切换</button>
		
		<script>
			$(function(){
				//滑入,从隐藏----》显示,将标签的高度增大的过程
				$("#btn1").bind("click",function(){
					$("#box").slideDown(2000,function(){
						alert("over");
						
					});
				});
				
				
				//滑出,从显示-----》隐藏,将标签的高度减小的过程
				$("#btn2").bind("click",function(){
					$("#box").slideUp(2000,function(){
						alert("over~~~~~");
						
					});
				});
				
				
				$("#btn3").bind("click",function(){
					$("#box").slideToggle(2000,function(){
						alert("over~~~~~");
						
					});
				});
						
			})
		</script>
	</body>
</html>
2.自定义动画
2.1基本使用

animate(),创建自定义动画

$(selector).animate({params},speed,callback)

params:需要更改的css属性

speed:动画执行的时间

callback:动画执行完毕之后需要做的操作

注意:一般情况下,动画只会执行一次,如果要重复执行,需要在callback中操作

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			div{
				width: 200px;
				height: 200px;
				background-color: cyan;
				position: absolute;
			}
		</style>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<button>开始动画</button>
		<div></div>

		<script>
			$(function(){
				//animate({}),其中的属性设置使用的键值对,属性:“值”
				/*$("button").bind("click",function(){
					$("div").animate({left:"100px"});
				})*/
				
				
				$("button").bind("click",function(){
					$("div").animate({
						left:"100px",
						width:"400px",
						height:"400px",
						opacity:"0.2"    //设置透明度
					},2000,function(){
						//alert("over");
						$(this).animate({
						left:"0px",
						width:"200px",
						height:"200px",
						opacity:"1"    //设置透明度
					});
					});
				})
			})
		</script>
	</body>
</html>
2.2萤火虫案例

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			#container{
				width: 100%;
				height: 100%;
				background-image: url(img/bg.jpg);
				/*position: absolute;
				left: 0px;
				top: 0px;*/
			}
			
			body,html{
				margin: 0px;
				padding: 0px;
				height: 100%;
			}
			
			
			img{
				width: 40px;
				height: 40px;
				position: absolute;
			}
		</style>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<div id="container">
			
		</div>
		
		<script>
			$(function(){
				//需求:每隔1000毫秒出现一个img【萤火虫】,位置可以随时发生改变【自定义动画】
				//1.创建定时器
				setInterval(function(){
					//2.创建img的标签对象
					var $fireworm = $("<img  src='img/萤火虫.jpg'/>");
					
					//3.将img的标签对象添加给div
					$("#container").append($fireworm);
					
					
					//4.获取屏幕的宽高
					var divWidth = $("#container").width();
					var divHeight = $("#container").height();
					
					//5.设定img出现的位置【随机】
					var wleft = Math.ceil(Math.random() * divWidth) + "px";
					var wtop = Math.ceil(Math.random() * divHeight) + "px";
					
					//设置img的css的属性
					$fireworm.css({
						left:wleft,
						top:wtop
					})
					
					//6.让img在整个屏幕范围内移动
					function fly(){
						var wleft = Math.ceil(Math.random() * divWidth) + "px";
						var wtop = Math.ceil(Math.random() * divHeight) + "px";
						
						$fireworm.animate({
							
							left:wleft,
							top:wtop
							
						},3000,function(){
							//当指定完一次动画之后,继续重复执行
							fly();
						});
					}
					
					fly();
						
				},1000);
			})
		</script>
	</body>
</html>

二、事件

1.页面加载响应的事件

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		

		<script>
			
			//类似于window.onload
			
			/*$(document).ready(function(){
				
			});
			
			$().ready(function(){
				
			});
			*/
			
			//弊端:只要DOM元素就绪就可以自动执行该方法,所以可能出现元素的关联文件没有加载完毕的情况
			$(function(){
				
			})
			
			//解决办法:jq中也有一个和js中onload事件功能相同的函数:load(),如果将其绑定给指定的对象上,
			//则会在页面所有的内容加载完毕之后才执行该函数
			$(window).load(function(){
				
			})
			
			//等价于
			window.onload = function(){
				
			}
			
		</script>
	</body>
</html>
2.jQuery中的事件

见笔记中的图

3.事件的处理
3.1事件绑定

click() dblclick()

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<!--需求:点击按钮,在div下面添加一个新的p子标签-->
		<button id="btn">添加标签</button>
		
		<div>
			<p>第一个标签</p>
			<p>第二个标签</p>
			<p>第三个标签</p>
			<p>第四个标签</p>
			<p>第五个标签</p>
		</div>
		<script>
			$(function(){
				//绑定事件:bind()   click()  delegate()   on()
				
				//1.bind(type,fn)   常用1
				/*type:需要绑定的事件的类型,比如:click   dblclick
				 * fn:当触发指定的事件之后,需要执行的操作
				 * 
				 * 
				 * 弊端:
				 * 1.这里使用了隐式迭代的方式绑定事件,如果匹配到的元素特别多的时候,对于大量的元素而言,需要给
				 * 每一个元素都绑定一个事件,是一个耗时的过程,影响性能
				 * 2.对于后添加的元素,未绑定指定的事件
				 */
				/*$("#btn").bind("click",function(){
					$("div").append($("<p>aaaaa</p>"));
					//console.log($("div").text());
				});*/
				//需求:将事件绑定给p标签,
				/*$("div p").bind("click",function(){
					$("div").append($("<p>aaaaa</p>"));
				})
				*/
				
				
				//2.delegate()
				/*
				 * delegate:代理
				 * 
				 * 事件代理,也被称为事件委托,利用事件冒泡给父元素添加响应事件,将事件添加给父标签
				 * 让父标签代理子标签进行事件响应
				 * 
				 * p:委托
				 * div;代理
				 * 
				 * 
				 * 代理对象.delegate(委托对象,事件名称,触发的函数)
				 * 
				 * 
				 * 弊端:如果DOM树比较深的时候,假设需要给最里层的一个元素绑定事件,需要将事件绑定给先辈标签
				 * 需要一层一层的冒泡才能找到父标签,则影响性能
				 */
				//注意:在fn的内部使用$(this),代表的是委托对象,并不是代理对象
				/*$("div").delegate("p","click",function(){
					$("div").append($("<p>aaaaa</p>"));
				});*/
				
				
				//3.on()
				/*
				 * 可以解决前面的3个弊端
				 * 代理对象.on(事件名称,委托对象,触发的函数)
				 * 
				 */
				/*$("div").on("click","p",function(){
					$("div").append($("<p>aaaaa</p>"));
				})
				*/
				
				//4.click()  常用2
				$("#btn").click(function(){
					$("div").append($("<p>aaaaa</p>"));
				})
				
				
				/*
				 
				 * 总结:
				 * 1.选择器匹配到的元素较多的时候,不要bind()
				 * 2。需要动态添加元素的时候,delegate或者on
				 * 3.使用delegate,dom树不要太深
				 * 5.尽量使用on
				 * 6.常用bind()和click()
				 * 
				 * /
			})
		</script>
	</body>
</html>
3.2移除绑定

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		
		<button id="btn">添加标签</button>
		
		<div>
			<p>第一个标签</p>
			<p>第二个标签</p>
			<p>第三个标签</p>
			<p>第四个标签</p>
			<p>第五个标签</p>
		</div>
		<script>
			$(function(){
				//1.unbind(type)
				$("#btn").bind("click",function(){
					
				});
				
				//注意:只需要说明需要解除绑定的事件名称【一个对象可以同时被绑定多个事件】
				$("#btn").unbind("click");
				
				
				//2.undelegate(委托,事件名称)
				//delagate(委托,事件名称,触发的函数)
				$("div").delegate("p","click",function(){
					
				});
				$("div").undelegate("p","click");
				
				
				//3.off(事件名称,委托)
				//on(事件名称,委托,触发的函数)
				$("div").on("click","p",function(){
					
				})
				$("div").off("click","p");
			})
		</script>
	</body>
</html>
3.3绑定一次性事件

one()

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<button id="btn">添加标签</button>
		
		<div>
			<p>第一个标签</p>
			<p>第二个标签</p>
			<p>第三个标签</p>
			<p>第四个标签</p>
			<p>第五个标签</p>
		</div>
		<script>
			$(function(){
				/*
				 * one(type,fn)
				 * 作用:当点击按钮的时候只触发一次的事件
				 * 用来绑定事件的
				 */
				$("#btn").one("click",function(){
					$("div").append($("<p>hello</p>"));
				})
			})
		</script>
	</body>
</html>
3.4事件对象

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<button id="btn">添加标签</button>
		
		
		<script>
			$(function(){
				//event事件对象是当前函数的局部变量,只能在当前函数的内部被访问,当事件函数处理完毕之后,事件对象被销毁
				$("#btn").bind("click",function(event){
					//var e = event || window.event;
					
					
					console.log(event);
					
					//获取事件的类型
					console.log(event.type);
					
					//获取触发事件的元素
					console.log(event.target);
					
					//获取相关联的节点
					//事件的传递:冒泡和捕获
					console.log(event.relatedTarget);
					
					//获取点击的光标相对于页面的x坐标和y坐标
					//注意:若页面上有滚动条,则要考虑到滚动条的宽度和高度
					console.log(event.pageX,event.pageY);
				})
			})
		</script>
	</body>
</html>
3.5鼠标悬浮事件

hover()

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<style>
			#box{
				width: 100px;
				height: 100px;
				border: 1px solid orange;
			}
		</style>
		
		<!--引入js文件-->
		<script src="js/jquery-3.3.1.js" type="text/javascript"></script>
	</head>
	<body>
		
		<div id="box"></div>
		
		
		<script>
			$(function(){
				
				/*
				 * hover(over,out)
				 * 
				 * over:用于指定当鼠标移动到元素上方的时候触发的函数   mouseover
				 * 
				 * out:用于指定当鼠标移出元素的时候触发的函数   mouseout
				 */
				
				//模拟鼠标悬浮事件:设置属性的时候,一般在over和out中设置的属性的值是相反的
				$("#box").hover(function(){
					$(this).html("hello");
					$(this).css("background-color","white");
				},function(){
					$(this).css("background-color","red");
					$(this).html("");
				});
			})
		</script>
	</body>
</html>

三、综合案例

1.省份城市区域三级关联

代码演示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			#city,#country{
				display: none;
			}
			
			/*select[name='city'],select[name='country']{
				display: none;
			}*/
			
		</style>
		<script type="text/javascript" src="js/city.js"></script>
		<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
	</head>
	<body>
		
		<select name="province" id="province">
			<option>请选择</option>
		</select>
		<select name="city" id="city">
			<option>请选择</option>
		</select>
		<select name="country" id="country">
			<option>请选择</option>
		</select>
		
		<script>
			$(function(){
				//加载省份
				function provinceLoad(){
					//通过键获取value,js中字典的使用:value = 字典名[key] 
					var provinceArr = zcityData["0"];
					//console.log(provinceArr.length);
					
					//定义一个变量,用于记录所有省份的option标签拼接
					var mypro = "<option value='-1'>请选择</option>";
					
					for(var i = 0;i < provinceArr.length;i++){
						//创建$("<option>北京</option>")
						//provinceArr[i]
						//拼接
						mypro += "<option value='" + i +  "'>" + provinceArr[i] + "</option>";
						
					}
					
					//$("#province").html("<option value='0'>北京</option><option value='1'>上海</option><option value='2'>天津</option>");
					$("#province").html(mypro);
				}
				
				provinceLoad();
				
				
				//加载城市
				function cityLoad(){
					//当省份的值发生改变的时候
					//change()对应的是js中的onchange事件
					$("#province").change(function(){
						
						//消除bug:重新选择省份的时候,区域的变化
						$("#country").css("display","none");
						
						
						//获取当前选择的省份
						//val()获取的是属性value的值
						var proVal = $(this).val();
						
						//判断获取的proval是否为-1
						if(proVal >= 0){
							//手动拼接属性名
							var city = "0_" + proVal;
							
							//通过属性名获取对应的城市
							var myCity = zcityData[city];
							
							//定义一个变量,用于拼接所有城市的option
							var cityOption = "<option value='-1'>请选择</option>";
							
							for(var i = 0;i < myCity.length;i++){
								cityOption += "<option value='" + city  + "_"  + i + "'>" +  myCity[i]  +   "</option>";
							}
							
							$("#city").html(cityOption);
							
							//让select显示出来
							$("#city").css("display","inline-block");
							
							
							countryLoad();
						}
						
					})
				}
				
				cityLoad()
				
				
				//加载区域
				function countryLoad(){
					$("#city").change(function(){
						
						//获取选择的城市的值
						var counVal = $(this).val();
						
						//请选择,select继续隐藏
						if(counVal == -1){
							return;
						}
						
						//获取区域
						var myCoun = zcityData[counVal];
						
						//定义一个变量,用于拼接所有城市的option
						var counOption = "<option value='-1'>请选择</option>";
						
						for(var i = 0;i < myCoun.length;i++){
							counOption += "<option value='"  + i + "'>" +  myCoun[i]  +   "</option>";
						}
						
						$("#country").html(counOption);
							
						$("#country").css("display","inline-block");
						
					})
				}
				
			})
		</script>
		
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值