Webcourse/04-JavaScript基础/52-jQuery动画详解.md
2020-04-19 18:24:43 +08:00

603 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

> 本文最初发表于[博客园]()并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文
## 前言
jQuery提供的一组网页中常见的动画效果这些动画是标准的有规律的效果同时还提供给我们了自定义动画的功能
## 显示动画
方式一
```javascript
$("div").show();
```
解释无参数表示让指定的元素直接显示出来其实这个方法的底层就是通过`display: block;`实现的
方式二
```javascript
$("div").show(2000);
```
解释通过控制元素的宽高透明度display属性逐渐显示2秒后显示完毕
效果如下
![](http://img.smyhvae.com/20180205_1358.gif)
方式三
```javascript
$("div").show("slow");
```
参数可以是
- slow 600ms
- normal 正常400ms
- fast 200ms
解释和方式二类似也是通过控制元素的宽高透明度display属性逐渐显示
方式四
```javascript
//show(毫秒值,回调函数;
$("div").show(5000,function () {
alert("动画执行完毕!");
});
```
解释动画执行完后立即执行回调函数
**总结**
上面的四种方式几乎一致参数可以有两个第一个是动画的执行时长第二个是动画结束后执行的回调函数
## 隐藏动画
方式参照上面的show()方法的方式如下
```javascript
$(selector).hide();
$(selector).hide(1000);
$(selector).hide("slow");
$(selector).hide(1000, function(){});
```
**显示和隐藏的来回切换**
显示和隐藏的来回切换采用的是toggle()方法就是先执行show()再执行hide()
同样是四种方式
```javascript
$(selector).toggle();
```
## 滑入和滑出
**1滑入动画效果**类似于生活中的卷帘门
```javascript
$(selector).slideDown(speed, 回调函数);
```
解释下拉动画显示元素
注意省略参数或者传入不合法的字符串那么则使用默认值400毫秒同样适用于fadeIn/slideDown/slideUp
**2 滑出动画效果**
```javascript
$(selector).slideUp(speed, 回调函数);
```
解释上拉动画隐藏元素
**3滑入滑出切换动画效果**
```javascript
$(selector).slideToggle(speed, 回调函数);
```
参数解释同show()方法
举例
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
width: 300px;
height: 300px;
display: none;
background-color: pink;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//点击按钮后产生动画
$("button:eq(0)").click(function () {
//滑入动画: slideDown(毫秒值,回调函数[显示完毕执行什么]);
$("div").slideDown(2000, function () {
alert("动画执行完毕!");
});
})
//滑出动画
$("button:eq(1)").click(function () {
//滑出动画slideUp(毫秒值,回调函数[显示完毕后执行什么]);
$("div").slideUp(2000, function () {
alert("动画执行完毕!");
});
})
$("button:eq(2)").click(function () {
//滑入滑出切换(同样有四种用法)
$("div").slideToggle(1000);
})
})
</script>
</head>
<body>
<button>滑入</button>
<button>滑出</button>
<button>切换</button>
<div></div>
</body>
</html>
```
![](http://img.smyhvae.com/20180205_1420.gif)
## 淡入淡出动画
1淡入动画效果
```javascript
$(selector).fadeIn(speed, callback);
```
作用让元素以淡淡的进入视线的方式展示出来
2淡出动画效果
```javascript
$(selector).fadeOut(1000);
```
作用让元素以渐渐消失的方式隐藏起来
3淡入淡出切换动画效果
```javascript
$(selector).fadeToggle('fast', callback);
```
作用通过改变透明度切换匹配元素的显示或隐藏状态
参数的含义同show()方法
代码举例
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
width: 300px;
height: 300px;
display: none;
/*opacity: 1;*/
background-color: pink;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//点击按钮后产生动画
$("button:eq(0)").click(function () {
// //淡入动画用法1: fadeIn(); 不加参数
$("div").fadeIn();
// //淡入动画用法2: fadeIn(2000); 毫秒值
// $("div").fadeIn(2000);
// //通过控制 透明度和display
//淡入动画用法3: fadeIn(字符串); slow慢600ms normal正常:400ms fast快200ms
// $("div").fadeIn("slow");
// $("div").fadeIn("fast");
// $("div").fadeIn("normal");
//淡入动画用法4: fadeIn(毫秒值,回调函数[显示完毕执行什么]);
// $("div").fadeIn(5000,function () {
// alert("动画执行完毕!");
// });
})
//滑出动画
$("button:eq(1)").click(function () {
// //滑出动画用法1: fadeOut(); 不加参数
// $("div").fadeOut();
// //滑出动画用法2: fadeOut(2000); 毫秒值
// $("div").fadeOut(2000); //通过这个方法实现的display: none;
// //通过控制 透明度和display
//滑出动画用法3: fadeOut(字符串); slow慢600ms normal正常:400ms fast快200ms
// $("div").fadeOut("slow");
// $("div").fadeOut("fast");
// $("div").fadeOut("normal");
//滑出动画用法1: fadeOut(毫秒值,回调函数[显示完毕执行什么]);
// $("div").fadeOut(2000,function () {
// alert("动画执行完毕!");
// });
})
$("button:eq(2)").click(function () {
//滑入滑出切换
//同样有四种用法
$("div").fadeToggle(1000);
})
$("button:eq(3)").click(function () {
//改透明度
//同样有四种用法
$("div").fadeTo(1000, 0.5, function () {
alert(1);
});
})
})
</script>
</head>
<body>
<button>淡入</button>
<button>淡出</button>
<button>切换</button>
<button>改透明度为0.5</button>
<div></div>
</body>
</html>
```
## 自定义动画
```javascript
$(selector).animate({params}, speed, callback);
```
作用执行一组CSS属性的自定义动画
- 第一个参数表示要执行动画的CSS属性必选
- 第二个参数表示执行动画时长可选
- 第三个参数表示动画执行完后立即执行的回调函数可选
代码举例
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
position: absolute;
left: 20px;
top: 30px;
width: 100px;
height: 100px;
background-color: pink;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
jQuery(function () {
$("button").click(function () {
var json = {"width": 500, "height": 500, "left": 300, "top": 300, "border-radius": 100};
var json2 = {
"width": 100,
"height": 100,
"left": 100,
"top": 100,
"border-radius": 100,
"background-color": "red"
};
//自定义动画
$("div").animate(json, 1000, function () {
$("div").animate(json2, 1000, function () {
alert("动画执行完毕!");
});
});
})
})
</script>
</head>
<body>
<button>自定义动画</button>
<div></div>
</body>
</html>
```
## 停止动画
```javascript
$(selector).stop(true, false);
```
**里面的两个参数有不同的含义**
第一个参数
- true后续动画不执行
- false后续动画会执行
第二个参数
- true立即执行完成当前动画
- false立即停止当前动画
PS参数如果都不写默认两个都是false实际工作中直接写stop()用的多
**效果演示**
当第二个参数为true时效果如下
![](http://img.smyhvae.com/20180205_1445.gif)
当第二个参数为false时效果如下
![](http://img.smyhvae.com/20180205_1450.gif)
这个**后续动画**我们要好好理解来看个例子
**案例鼠标悬停时弹出下拉菜单下拉时带动画**
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
.wrap {
width: 330px;
height: 30px;
margin: 100px auto 0;
padding-left: 10px;
background-color: pink;
}
.wrap li {
background-color: green;
}
.wrap > ul > li {
float: left;
margin-right: 10px;
position: relative;
}
.wrap a {
display: block;
height: 30px;
width: 100px;
text-decoration: none;
color: #000;
line-height: 30px;
text-align: center;
}
.wrap li ul {
position: absolute;
top: 30px;
display: none;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
//入口函数
$(document).ready(function () {
//需求鼠标放入一级li中让他里面的ul显示。移开隐藏。
var jqli = $(".wrap>ul>li");
//绑定事件
jqli.mouseenter(function () {
$(this).children("ul").stop().slideDown(1000);
});
//绑定事件(移开隐藏)
jqli.mouseleave(function () {
$(this).children("ul").stop().slideUp(1000);
});
});
</script>
</head>
<body>
<div class="wrap">
<ul>
<li>
<a href="javascript:void(0);">一级菜单1</a>
<ul>
<li><a href="javascript:void(0);">二级菜单1</a></li>
<li><a href="javascript:void(0);">二级菜单2</a></li>
<li><a href="javascript:void(0);">二级菜单3</a></li>
</ul>
</li>
<li>
<a href="javascript:void(0);">一级菜单1</a>
<ul>
<li><a href="javascript:void(0);">二级菜单1</a></li>
<li><a href="javascript:void(0);">二级菜单2</a></li>
<li><a href="javascript:void(0);">二级菜单3</a></li>
</ul>
</li>
<li>
<a href="javascript:void(0);">一级菜单1</a>
<ul>
<li><a href="javascript:void(0);">二级菜单1</a></li>
<li><a href="javascript:void(0);">二级菜单2</a></li>
<li><a href="javascript:void(0);">二级菜单3</a></li>
</ul>
</li>
</ul>
</div>
</body>
</html>
```
效果如下
![](http://img.smyhvae.com/20180205_1500.gif)
上方代码中关键的地方在于用了stop函数再执行动画前先停掉之前的动画
如果去掉stop()函数效果如下不是我们期望的效果
![](http://img.smyhvae.com/20180205_1505.gif)
### stop方法的总结
当调用stop()方法后队列里面的下一个动画将会立即开始
但是如果参数clearQueue被设置为true那么队列面剩余的动画就被删除了并且永远也不会执行
如果参数jumpToEnd被设置为true那么当前动画会停止但是参与动画的每一个CSS属性将被立即设置为它们的目标值比如slideUp()方法那么元素会立即隐藏掉如果存在回调函数那么回调函数也会立即执行
注意如果元素动画还没有执行完此时调用stop()方法那么动画将会停止并且动画没有执行完成那么回调函数也不会被执行
## 举例右下角的弹出广告
代码实现
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.ad {
position: fixed;
right: 0;
bottom: 0;
width: 230px;
height: 120px;
background-image: url(images/ad.jpg);
display: none;
}
.ad span {
position: absolute;
right: 0;
top: 0;
width: 40px;
height: 18px;
background-image: url(images/h.jpg);
cursor: pointer;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//需求然广告ad部分先滑入在滑出在淡入。然后绑定事件点击span弹出
//步骤:
$(".ad").slideDown(1000).slideUp(1000).fadeIn(1000).children("span").click(function () {
$(this).parent().fadeOut(1000);
});
//第二种写法
// $(".ad").slideDown(1000, function () {
// $(".ad").slideUp(1000, function () {
// $(".ad").fadeIn(1000, function () {
// $(".ad").children("span").click(function () {
// $(this).parent().fadeOut(1000, function () {
// alert("执行完毕!");
// });
// });
// });
// });
// })
})
</script>
</head>
<body>
<div class="ani">我是内容</div>
<div class="ad">
<span></span>
</div>
</body>
</html>
```
效果如下
![](http://img.smyhvae.com/20180205_2000.gif)
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>****id`qianguyihao`
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/2016040102.jpg)