很榮幸老師給了我一天的時間讓我把滑動門這個效果當作一節課來講,感覺收穫很多,知道如何能更容易的讓大家接受你的思想。講課的過程: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.p_w_picpaths.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.p_w_picpaths[0].width;//圖片的寬度不帶px
- var surplus_w=outer_w-img_w;//outer-一張圖片的寬度剩餘的寬度
- var average_w=surplus_w/(img_num-1);//其餘圖片每張的佔得寬度
- //佈局讓每張圖片到改到的位置
- function layout(){
- document.p_w_picpaths[0].style.left=surplus_w+'px';
- addEventHaddler(document.p_w_picpaths[0],'click',judge);
- for(var i=1;i<img_num;i++){
- document.p_w_picpaths[i].style.left=surplus_w-(i-1)*average_w-img_w+'px';
- addEventHaddler(document.p_w_picpaths[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.p_w_picpaths[i].style.left),surplus_w-i*average_w,function (x){document.p_w_picpaths[i].style.left=x+'px';});
- //終點是最左邊的位置不是最右邊的位置
- }
- //圖片向左運動函數
- function movel(i){
- d=10;
- moveTo(parseInt(document.p_w_picpaths[i].style.left),surplus_w-(i-1)*average_w-img_w,function (x){document.p_w_picpaths[i].style.left=x+'px';});
- }
- //判斷函數,圖片是該向左運動還是向右運動
- var overall_num;//全局變量,來查看點擊的是第幾張
- function judge(){
- for(var i=0;i<img_num;i++){
- if(this==document.p_w_picpaths[i])
- overall_num=i
- }
- // 判斷那些圖片該向右運動,那些該向左運動
- for(var i=0;i<img_num;i++){
- //圖片在點擊的右邊就要都向右運動包含被點擊的那一張,其餘的向左運動
- if(i<=overall_num){
- mover(i);
- }
- else{
- movel(i);
- }
- }
- }
- //調用佈局函數在body裏面
- </script>
- </body>