专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > jQuery

第4章 jQuery的事件跟动画(二)

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
第4章 jQuery的事件和动画(二)

二. jQuery中的动画

动画在前面几章案例中是回避不了的问题。此处结合一些简便的写法稍作系统的分析。


1. show()和hide()
(1)介绍——不用过多的介绍了
jQuery最基本的方法。本质是某个html对象的display从none和显示之间切换的丰富过程。在display为none之前,jq会记住原来对象的显示方式。原来是inline,再次调用show()方法时,显示方式不变。


回到例4.1中FAQ的例子——(运行环境jQuery1.7.2

1     $(document).ready(function(){
2         $('#panel h5.head').bind('click',function({
3                 $('#panel h5.head').toggle(function(){
4                 $(this).next().hide();
5              },function(){
6                 $(this).next().show();
7             })
8               })
9     })
或者
 1     $(document).ready(function(){
 2     var bShow=false;
 3     $('#panel h5.head').bind('click',function({
 4     if(bShow){
 5     $(this).next().hide();
 6     }else{
 7     $(this).next().show()
 8     }
 9     bShow=!bShow;
10     })
11     })
 
 
 

可以发现,该例子中的宽、高、不透明度都是变化的。display:none只是函数的终点。

 

2.fadeIn()和fadeOut()

只改变不透明度,相关元素的节点都存在。

jq1

1     $(document).ready(function(){
2     $('#panel h5.head').click(function(){
3     $(this).next().fadeToggle();
4     })
5     })
注:fadeToggle通过不透明度的变化来开关所有匹配元素的淡入和淡出效果,这个动画只调整元素的不透明度,也就是说所有匹配的元素的高度和宽度不会发生变化。

jq2

1     $(document).ready(function(){
2     $('#panel h5.head').bind('click',function(){
3     if($(this).next().is(':visible')){
4     $(this).next().fadeOut();
5     }else{
6     $(this).next().fadeIn();
7     }
8     })
9     })
 再对案例进行修改
 
 
【补白】可以使用fadeTo()方法来实现不透明度的渐进式变化——这相当于介乎fadeIn-fadeOut方法的一个中间状态。
1     $(document).ready(function(){
2     $('#panel h5.head').click(function(){
3     $(this).next().fadeToggle(600,0.2);
4     })
5     })

 3. slideDown()和slideUp()

slideDown()元素由上至下显示。slideUp()正好相反。以下两段代码都可以替代toggle()使用

注:slideToggle通过高度变化来切换所有匹配元素的可见性,这个动画效果只调整元素的高度,可以使匹配的元素以“滑动”的方式隐藏或显示。

jq1

 

1     $(document).ready(function(){
2     $('#panel h5.head').click(function(){
3     $(this).next().slideToggle();
4     })
5     })
jq2
1     $(document).ready(function(){
2         $('#panel h5.head').bind('click',function(){
3             if($(this).next().is(':visible')){
4                 $(this).next().slideUp();
5             }else{
6                 $(this).next().slideDown();
7             }
8         })
9     })

 

 

 

4.参数

以上三类函数都可以用一套参数。

不带任何参数时,显示方式是马上变化。
fast——200ms显示
normal——400ms显示
slow——600ms显示
也可以直接写数字,比如show(300)表示在300ms内显示完毕。

 

【小结】可以认为show-hide方法是fadeIn-fadeOut(改变透明度)和slideUp-slideDown(改变高度)的综合。它既改变又改变透明度。

 

5.自定义动画方法——animate()

 

1     animate(params,speed,callback)

 

 

params包含样式属性和值的映射。注意,和css不同的是这里用逗号隔开,而不是分号!比如
  { 样式1:值1, 样式2:值2,... } 
speed:速度参数(可选)
callback:动画完成时执行的函数(可选)

(1)自定义一个简单的动画吧

【例4.2】一个空白文档, 一个div被单击后能在页面横向飘动。

1     <divid="div1"></div>
2 
3     *{margin:0;padding:0}
4     #div1{
5     width:100px;height:100px;
6     background: red;
7     position: absolute;
8     margin:20px;
9     }
jq
1     $(function(){
2     $('#div1').click(function(){
3     alert($(this).attr('left'))
4     $(this).animate({left:500+'px'},3000);//3s内移动到左距离500px处
5     });
6     });
速度由慢到快再减为0.
 

(2)累加累减

上面的案例套用原生js分析,运动就是#div1的offsetLeft不断增加的过程。代码{left:500+'px'}提示了运动的终点是500px处,但当定位不同时,运动的距离不一样。有时候我们不知道自己身在何处,只知道最终前进的方向和距离。这时适用于累加累减动画

1     $(function(){
2     $('#div1').click(function(){
3     $(this).animate({left:'+=500px'},3000);//3s内向右移动500px
4     });
5     });

(3)再复杂一点点

要求:div1向右运动同时,增加宽度。
1     $(function(){
2     $('#div1').click(function(){
3     $(this).animate({left:'+=500px',width:'200px'},3000);//3s内向右移动500px
4     });
5     });

 

 

(4)还不够

要求:div1运动完了之后,触发第二个运动:向右变窄——让变窄和运动同时发生吧
1     $(function(){
2     $('#div1').click(function(){
3     $(this).animate({left:'500px',width:'200px'},3000);//第一个动画
4     $(this).animate({left:'600px',width:'100px'},1000);//接下来发生的动画
5     }
6     );
7     });
结果真的可以,但是录屏软件诡异地无法记录这一过程。所以只好自己试试了。

 (5)综合运用

单击div1,向有运动变宽同时不透明度有0.5变为1,之后向下运动,最后淡出隐藏
1     $(function(){
2     $('#div1').click(function(){
3     $(this).animate({left:'500px',width:'200px',opacity:'1'},3000)
4     .animate({left:'600px',width:'100px'},1000)
5     .animate({top:'500px',height:'200px'},3000)
6     .animate({top:'600px',height:'100px'},1000)
7     .fadeOut(600);
8     });
9     });

 

这个过程称为动画队列。
 

6.动画回调函数

如果上面例子最后一步我想让div1的颜色变为绿色,会遇到一个问题。如果把$(this).css('background','green')写进队列最后一行,不能取得预期效果。实际情况是变色与动画同时执行。
原因在于css改变属于非动画,直接排到队列里是不起作用的。如果要做,因使用回调函数,写在最后一个动画里边。
 
 1     $(function(){
 2     $('#div1').click(function(){
 3     $(this).animate({left:'500px',width:'200px',opacity:'1'},3000)
 4     .animate({left:'600px',width:'100px'},1000)
 5     .animate({top:'500px',height:'200px'},3000)
 6     .animate({top:'600px',height:'100px'},1000,function(){
 7     $(this).css('background','green')//回调函数
 8     })
 9     });
10     });

7.动画控制

(1)停止动画——stop()方法
1     xxx.stop([clearQueue],[gotoEnd]);
两个参数都是布尔值,都是可选的。前者表示是否清空队列,后者则表示是否直接定格到最终画面。什么参数都不写——则中止当前步骤,跳到下一步骤继续执行。
场景1:设想一下,一个鼠标移入动画,还没展示完,用户就移出了。就需要stop()方法。
1     $(function(){
2     $('#div1').hover(function(){
3     $(this).stop()
4     .animate(鼠标移入动画)
5     },function(){
6     $(this).stop()
7     .animate(鼠标移出动画)
8     })
9     });
而对于组合动画,需要使用带清除队列参数的stop方法。也就是stop(true)。其它和上面代码基本一致。
场景2:动画本是连续的。但是stop()突然把一步停了,接下来的执行其实也失去了意义。
解决方案:跳到最终状态。
stop(false,true)
gotoEnd参数通常和clearQueue参数这样组合起来用。

(2)动画判断

动画的一个重要原则在于:始终与用户行为一致。不然体验就会出现问题。

又一个简单的场景是:疯狂移入移出导致动画不断叠加,"久久不能平息"。

因此,需要加一个判断模块:

a.当前动画如果已经结束,则可以执行用户触发的又一个动画;

b.当前如果未结束,那就不执行任何动画!

1     if(!对象.is(':animated')){
2     //如果当前没有进行动画,则在此执行新动画
3     }else{...}
(3)延迟动画——delay()方法
比如说,我想让某个动画过1s后再执行。
1     xxx.animate({属性1:'值1',...},动画执行时间).delay(1000)
8.动画方法小结
(1)本节介绍的动画效果,贯穿各种分析,会发现,这些效果全部是可以通过animate来实现的。透明度——渐进式宽高变化——位置变化,无非就是这三样东西而已。
(2)动画队列的发生顺序:
a.一个animate多个属性变化————同时发生
b.正常情况下链式写法:动画是按顺序发生的
c.多组元素下的动画————默认同时发生
d.回调函数把非动画(比如css改变)插入到动画队列——按顺序发生
【久违的大案例】图片滚动
 

 
 

难点:

(1)首尾如何跳转

(2)注意蓝色的圆点切换

 

布局

  1     <divid="cartoon">
  2     <divclass="header">
  3     <h4>卡通动漫</h4>
  4     <ulclass="dot">
  5     <li></li>
  6     <li></li>
  7     <li></li>
  8     <li></li>
  9     </ul>
 10     <divclass="btn">
 11     <divclass="btn1"></div>
 12     <divclass="btn2"></div>
 13     </div>
 14     <divclass="more"><ahref="javascript:;">更多</a></div>
 15     </div>
 16     <ulclass="scroll">
 17     <li>
 18     <imgsrc="images/01.jpg"/>
 19     <div>
 20     <h6><ahref="javascript:;">海贼王</a></h6>
 21     <p>播放次数:888</p>
 22     </div>
 23     </li>
 24     <li>
 25     <imgsrc="images/01.jpg"/>
 26     <div>
 27     <h6><ahref="javascript:;">海贼王</a></h6>
 28     <p>播放次数:888</p>
 29     </div>
 30     </li><li>
 31     <imgsrc="images/01.jpg"/>
 32     <div>
 33     <h6><ahref="javascript:;">海贼王</a></h6>
 34     <p>播放次数:888</p>
 35     </div>
 36     </li><li>
 37     <imgsrc="images/01.jpg"/>
 38     <div>
 39     <h6><ahref="javascript:;">海贼王</a></h6>
 40     <p>播放次数:888</p>
 41     </div>
 42     </li>
 43     <li>
 44     <imgsrc="images/02.jpg"/>
 45     <div>
 46     <h6><ahref="javascript:;">叮当</a></h6>
 47     <p>播放次数:889</p>
 48     </div>
 49     </li>
 50     <li>
 51     <imgsrc="images/02.jpg"/>
 52     <div>
 53     <h6><ahref="javascript:;">叮当</a></h6>
 54     <p>播放次数:889</p>
 55     </div>
 56     </li>
 57     <li>
 58     <imgsrc="images/02.jpg"/>
 59     <div>
 60     <h6><ahref="javascript:;">叮当</a></h6>
 61     <p>播放次数:889</p>
 62     </div>
 63     </li>
 64     <li>
 65     <imgsrc="images/02.jpg"/>
 66     <div>
 67     <h6><ahref="javascript:;">叮当</a></h6>
 68     <p>播放次数:889</p>
 69     </div>
 70     </li>
 71     <li>
 72     <imgsrc="images/03.jpg"/>
 73     <div>
 74     <h6><ahref="javascript:;">火影</a></h6>
 75     <p>播放次数:887</p>
 76     </div>
 77     </li>
 78     <li>
 79     <imgsrc="images/03.jpg"/>
 80     <div>
 81     <h6><ahref="javascript:;">火影</a></h6>
 82     <p>播放次数:887</p>
 83     </div>
 84     </li>
 85     <li>
 86     <imgsrc="images/03.jpg"/>
 87     <div>
 88     <h6><ahref="javascript:;">火影</a></h6>
 89     <p>播放次数:887</p>
 90     </div>
 91     </li>
 92     <li>
 93     <imgsrc="images/03.jpg"/>
 94     <div>
 95     <h6><ahref="javascript:;">火影</a></h6>
 96     <p>播放次数:887</p>
 97     </div>
 98     </li>
 99     <li>
100     <imgsrc="images/04.jpg"/>
101     <div>
102     <h6><ahref="javascript:;">龙珠</a></h6>
103     <p>播放次数:886</p>
104     </div>
105     </li>
106     <li>
107     <imgsrc="images/04.jpg"/>
108     <div>
109     <h6><ahref="javascript:;">龙珠</a></h6>
110     <p>播放次数:886</p>
111     </div>
112     </li>
113     <li>
114     <imgsrc="images/04.jpg"/>
115     <div>
116     <h6><ahref="javascript:;">龙珠</a></h6>
117     <p>播放次数:886</p>
118     </div>
119     </li>
120     <li>
121     <imgsrc="images/04.jpg"/>
122     <div>
123     <h6><ahref="javascript:;">龙珠</a></h6>
124     <p>播放次数:886</p>
125     </div>
126     </li>
127     </ul>
128     </div>

css

 1     *{
 2     margin:0;padding:0;
 3     font-family:"微软雅黑",arial;
 4     }
 5     ul li{
 6     list-style:none;
 7     }
 8     a{
 9     text-decoration: none;
10     }
11     #cartoon{
12     width:596px;height:186px;
13     border:1px solid #ccc;
14     border-radius:4px4px00;
15     margin:100pxauto;
16     position: relative;
17     overflow: hidden;
18     }
19     .header{
20     height:30px;
21     background: linear-gradient(#f2f2f2,#e3e3e3);
22     }
23     h4{
24     width:70px;float: left;
25     height:30px;line-height:30px;
26     margin-left:12px;
27     }
28     .dot{
29     padding:10px;width:60px;
30     float: left;
31     }
32     .dot>li{
33     width:8px;height:8px;
34     border-radius:50%;
35     background:#04AEF4;
36     float: left;margin-right:4px;
37     }
38     .btn,.more{
39     float: left;
40     }
41     .btn{
42     width:57px;height:20px;
43     border-radius:2px;
44     box-shadow:1px1px3px#999;
45     margin-top:5px;
46     cursor: pointer;
47     }
48     .btn1{
49     width:29px;height:20px;float: left;
50     background: url(../images/btn_cartoon_01.gif)
51     }
52     .btn2{
53     width:28px;height:20px;float: left;
54     background: url(../images/btn_cartoon_02.gif)
55     }
56     .more{
57     line-height:30px;margin-left:320px;
58     }
59     .more a{
60     line-height:30px;
61     font-style: italic;
62     color:#2B93D2;
63     }
64     #cartoon>ul{
65     height:158px;
66     position: absolute;
67     }
68     #cartoon>ul>li{
69     float: left;
70     padding:10px;
71     }
72     ul a{
73     font-size:12px;
74     color:#2B93D2;
75     line-height:24px;
76     }
77     ul a:hover{
78     text-decoration: underline;
79     color:#E31E1C;
80     }
81     ul p{
82     font-size:12px;
83     color:#666;
84     line-height:18px;
85     }
jq
思路是用一个计数器控制运动轨迹和小圆点变化
 1     $(function(){
 2     var count=0;
 3     var aDotLi=document.getElementsByClassName('dot')[0].getElementsByTagName('li');
 4     //获取原点li
 5     aDotLi[0].style.background='#04AEF4';
 6     $('.scroll').css('width',(($('.scroll>li').width()+20)*$('.scroll>li').length)+'px');
 7     //设置滚动ul的宽度。(设不设置都好像可以。)
 8     //
 9     $('#btn1').click(function(){
10     if($('.scroll').is(':animated')==true){
11     returnfalse;
12     }//控制动画模块
13     $('.dot>li').css('background','#fff');//初始化原点颜色
14     count-=1;
15     if(count<0){
16     count=count+4;
17     }//原点计算规则:0/3/2/1/0/3/2/1......
18     $('.scroll').animate({left:-148*4*(count)+'px'},300);
19     aDotLi[count].style.background='#04AEF4';
20     })
21     $('#btn2').click(function(){
22     if($('.scroll').is(':animated')==true){
23     returnfalse;
24     }
25     $('.dot>li').css('background','#fff');
26     count+=1;
27     if(count>3){
28     count=0;
29     }//计算规则:0/1/2/3/0/1/2/3...
30     $('.scroll').animate({left:-148*4*count+'px'},300);
31     aDotLi[count].style.background='#04AEF4';
32     })
33     })



友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • jQuery搜索框输入文字下拉揭示菜单

    jQuery搜索框输入文字下拉提示菜单 jQuery搜索框输入文字下拉提示菜单 原文地址: http://www.jq22.com/jquery-info6193 ...

  • 7个替开发者准备的有用的jQuery技巧

    7个为开发者准备的有用的jQuery技巧 一、在新窗口打开链接 用下面的代码,你点击链接即可在新窗口打开: $(document).ready(fu...

  • jQuery获取呼应Input例子

    jQuery获取相应Input例子 页面上有许多input框,使用的是EasyUI样式,中间还参杂着各种其他无id的Input框,如下: <input class=...

  • webpack 引出jquery和第三方jquery插件

    webpack 引入jquery和第三方jquery插件 1、引入jquery jQuery 直接在 html 中引入,然后在 webpack 中把它配置为全局即可。 index....

  • JQuery的开发与使用经验

    JQuery的开发与使用心得 关于jQuery的 入门使用jQuery可以很容易或具有挑战性的,这取决于你如何使用JavaScript,HTML,CSS进行开发和...

  • 深入学习jQuery卡通片控制

    深入学习jQuery动画控制 &times; 目录 [1]动画状态 [2]停止动画 [3]动画延迟[4]全局控制 前面的话   jQuery动画可以使用fade、...

  • jquery操作table报表

    jquery操作table表格 一、数据准备 <table id="table1"> <tr><th>文章标题</th><th>文章分类</th><th>发布时间</th><th>...

  • html + css + jquery实现简略的进度条实例

    html + css + jquery实现简单的进度条实例 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-eq...

  • jquery中ajax方法的datatype的功用

    jquery中ajax方法的datatype的作用 今天在维护一个项目的时候遇见了一个小问题。但是这个问题我认为对于项目十分有帮助。...

  • jQuery菜单示范(全选,反选,取消)

    jQuery菜单示例(全选,反选,取消) 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <titl...

热门推荐: