很荣幸老师给了我一天的时间让我把滑动门这个效果当作一节课来讲,感觉收获很多,知道如何能更容易的让大家接受你的思想。讲课的过程:1.效果2.思路3.代码4.难点,从这4个方面入手的。其中第三步占据了主要的时间,第三步类似与Tab切换的5种方法,有最简单的不可以复用的方法讲起,到最后比较精简。
1.思路
1.第一步弄清楚如何布局,知道每张图片的left值。每张图片的起点和终点在哪,有如何联系,怎么表示它的起点和终点。
2.写一个运动函数moveTo,传入起点和终点就可以从起点运动到终点。
2.两个调用moveTo的函数A,B:一个向左运动,一个向右运动.
3.一个判断函数,判断哪些图片向左运动,那些向右运动,然后分别的调用函数A和B.
2.代码
1.布局让每张图片到该到的位置
function layout(){}
2.运动函数知道终点起点,从起点运动到终点,s:起点e:终点,callback回调函数
function moveTo(s,e,callback1){}
3.图片向右运动函数
function mover(i){}
4.图片向左运动函数
function movel(i){}
5.判断函数,图片是该向左运动还是向右运动
function judge(){}
代码如下:
- <style>
- #outer{height:200px;width:600px;margin:100px auto;overflow:hidden;position:relative;}
- img{height:200px;width:300px;position:absolute;}
- </style>
- <body onload='layout();'>
- <div id='outer'>
- <table cellpadding=0 cellspacing=0>
- <tr>
- <td><img src='1.jpg' alt=''></td>
- <td><img src='2.jpg' alt=''></td>
- <td><img src='3.jpg' alt=''></td>
- <td><img src='4.jpg' alt=''></td>
- </tr>
- </table>
- </div>
- <script>
- var img_num=document.images.length;//获取图片的数量
- var outer=document.getElementById('outer');
- var outer_css=document.defaultView.getComputedStyle(outer,null);//为获取标签outer的css样式
- var outer_w=parseInt(outer_css.width);//outer的宽度不带px
- var img_w=document.images[0].width;//图片的宽度不带px
- var surplus_w=outer_w-img_w;//outer-一张图片的宽度剩余的宽度
- var average_w=surplus_w/(img_num-1);//其余图片每张的占得宽度
- //布局让每张图片到改到的位置
- function layout(){
- document.images[0].style.left=surplus_w+'px';
- addEventHaddler(document.images[0],'click',judge);
- for(var i=1;i<img_num;i++){
- document.images[i].style.left=surplus_w-(i-1)*average_w-img_w+'px';
- addEventHaddler(document.images[i],'click',judge);
- }
- }
- //事件监听器
- function addEventHaddler(target,type,func){
- if(target.addEventListener)
- target.addEventListener(type,func,false);
- else if(target.attachEvent)
- target.attachEvent("on"+type,func);
- else
- target["on"+type]=func;
- }
- function removeEventHaddler(target,type,func){
- if(target.removeEventListener)
- target.removeEventListenner(target,type,func);
- else if(target.detachEvent)
- target.detachEvent("on"+type,func);
- else
- delete target["on"+type];
- }
- //Tween算法
- var Tween = {
- Cubic: {
- easeIn: function(t,b,c,d){
- return c*(t/=d)*t*t + b;
- },
- easeOut: function(t,b,c,d){
- return c*((t=t/d-1)*t*t + 1) + b;
- },
- easeInOut: function(t,b,c,d){
- if ((t/=d/2) < 1) return c/2*t*t*t + b;
- return c/2*((t-=2)*t*t + 2) + b;
- }
- }
- }
- //运动函数知道终点起点,从起点运动到终点,s:起点e:终点,callback回调函数
- var d;//Tween算法需要几步完成,现在是需要30步完成
- var t1;//计时器
- function moveTo(s,e,callback1){
- var t=0;//实际走的的步数
- var b=s//起始位置
- var c=e-s;//变化量
- var x;//例如给left赋值用的参数
- function move(){
- if(t==d){
- clearTimeout(t1);
- }
- else{
- t++;
- x=Tween.Cubic.easeIn(t,b,c,d);
- callback1(x);
- t1=setTimeout(move,17);
- }
- }
- move();
- }
- //图片向右运动函数
- function mover(i){
- d=15;
- moveTo(parseInt(document.images[i].style.left),surplus_w-i*average_w,function (x){document.images[i].style.left=x+'px';});
- //终点是最左边的位置不是最右边的位置
- }
- //图片向左运动函数
- function movel(i){
- d=10;
- moveTo(parseInt(document.images[i].style.left),surplus_w-(i-1)*average_w-img_w,function (x){document.images[i].style.left=x+'px';});
- }
- //判断函数,图片是该向左运动还是向右运动
- var overall_num;//全局变量,来查看点击的是第几张
- function judge(){
- for(var i=0;i<img_num;i++){
- if(this==document.images[i])
- overall_num=i
- }
- // 判断那些图片该向右运动,那些该向左运动
- for(var i=0;i<img_num;i++){
- //图片在点击的右边就要都向右运动包含被点击的那一张,其余的向左运动
- if(i<=overall_num){
- mover(i);
- }
- else{
- movel(i);
- }
- }
- }
- //调用布局函数在body里面
- </script>
- </body>