摘要:效果效果就像優酷綜藝頻道頁面的圖片輪播。本屌之前做過這個參見仿優酷頻道首頁的圖片切換效果不過用的是類似的庫做的。
roundabout效果
效果就像優酷綜藝頻道頁面的圖片輪播。
本屌之前做過這個roundabout,參見仿優酷頻道首頁的圖片切換效果,不過用的是類似jquery的庫做的。盡管js代碼不到200行,但還是顯得有點復雜。于是乎,本屌盤算著可不可以用更少的代碼完成這個效果。
順便說一下,如果有讀者想造輪子,可以直接看優酷的js代碼,基本上都沒壓縮,封裝這個效果的代碼在posterTvGrid.js
下面是本屌做出來的效果
http://v.youku.com/v_show/id_XMTM1ODk4NDQyNA==.html
點擊左右箭頭,圖片滾動
點擊下面圖片索引,如果點擊的圖片是當前圖片或與當前圖片相鄰的圖片,則圖片滾動;否則,所有圖片先變小,然后點擊的圖片和與之相鄰的圖片,在相應位置動態變大。
代碼盡可能少,盡可能清晰
布局圖片的位置有2種情況:
不可見,即不是前面的3張圖片,這里類名.hide
.hide { width: 530px; height: 100px; opacity: 0; z-index: 0; margin-top: 0; left: -530px; }
可見的3張圖片,按位置具體可分為.left,.middle,.right
.middle { width: 640px; height: 270px; opacity: 1; z-index: 2; margin-top: 0; left: 275px; } .left { width: 530px; height: 224px; opacity: 0.4; z-index: 1; margin-top: 23px; left: 0; } .right { width: 530px; height: 224px; opacity: 0.4; z-index: 1; margin-top: 23px; left: 660px; }
每個類的6個屬性都是和圖片尺寸(640*270)配合好的,使得動畫很自然。當然后面會用到css3 animation,使每張圖片的這6個屬性進行相應的變化。
下面把上面類添加到相應圖片上
var roundabout=avalon.define({ $id:"roundabout", img_list:[], cur:0,//當前頁 ... });
cur相對于指針,表示當前中間(可見范圍最大)圖片是圖片列表里的哪張圖片,所以會有(從左向右看)
cur=>.middle
cur+1=>.right
cur-1=>.left
其他=>.hide
插值表達式中的邏輯運算符這里就要把邏輯運算符用到插值表達式里
解釋下
ms-class-middle="$index==cur"
這個很簡單,指針的當前位置,添加.middle.
ms-class-left="$index==cur-1||(cur==0&&$index==img_list.size()-1)"
后面部分表示,如果指針在第一張圖片那里,就在最后一張圖片上添加.left.
ms-class-right="$index==cur+1||(cur==img_list.size()-1&&$index==0)"
和上面類似,后面部分表示,如果指針在最后一張圖片那里,就在第一張圖片上添加.right.
ms-class-hide="($index
由兩個大或(||)組成
前面部分$index
這里利用了||運算符的特點,如果第一個條件滿足的話,就不會去判定第二個條件;第一個條件不滿足時,才會去判定第二個條件。
后面部分$index>cur+1&&(cur!=0||$index!=img_list.size()-1)表示在cur+1(右邊的可見)圖片以右的圖片,都會添加.hide隱藏,除了當前指針在第一張圖片那里時,圖片列表中的最后一張圖片不能添加.hide,因為它將被添加.left.
實際上,用離散數學里的非(p且q)=非p或非q就很好想了,除開已經添加了.left,.middle,.right的圖片,剩下的就得添加.hide,$index>cur+1和$index
然后是排除.left,滿足.left的條件是$index==cur-1||(cur==0&&$index==img_list.size()-1),它的否定是$index!=cur-1&&(cur!=0||$index!=img_list.size()-1),這就和添加.hide的條件的左邊部分一樣了。
排除.right也是類似的。
把這兩個部分組合起來就可以保證.left,.middle,.right,.hide這4個類之間是互斥的。
當然也可以利用css優先級,讓.left,.middle,.right類的優先級高于.hide,這樣添加.hide的判定條件會簡單很多。為了嚴謹些,就沒有用這種方式。
cur==$index讓"亮"的圓點和當前指針同步。
到這里,任意改變roundabout.cur=?都可以呈現roundabout布局。
滾動過程中,要滾動圖片有4種動畫狀態,以向右滾動為例
左邊可見的圖片的上(左)一張圖片,不可見=>在可見部分左邊,部分可見
原來左邊可見的圖片,在可見部分左邊,部分可見=>中間,全部可見
原來中間全部可見的圖片,中間,全部可見=>在可見部分右邊,部分可見
原來右邊可見的圖片,在可見部分右邊,部分可見=>不可見
這里用css3 animation
@keyframes to-right1 {//向右滾動 0% { width: 530px; height: 100px; opacity: 0; z-index: 0; margin-top: 85px; left: -530px; } 100% { width: 530px; height: 224px; opacity: 0.4; z-index: 1; margin-top: 23px; left: 0; } } @keyframes to-right2 { 0% { width: 530px; height: 224px; opacity: 0.4; z-index: 1; margin-top: 23px; left: 0; } 100% { width: 640px; height: 270px; opacity: 1; z-index: 2; margin-top: 0; left: 275px; } } @keyframes to-right3 { 0% { width: 640px; height: 270px; opacity: 1; z-index: 2; margin-top: 0; left: 275px; } 100% { width: 530px; height: 224px; opacity: 0.4; z-index: 1; margin-top: 23px; left: 660px; } } @keyframes to-right4 { 0% { width: 530px; height: 224px; opacity: 0.4; z-index: 1; margin-top: 23px; left: 660px; } 100% { width: 530px; height: 100px; opacity: 0; z-index: 0; margin-top: 85px; left: 1190px; } } ...
可以看到,動畫無非是在.hide,.left,.middle,.right這4個狀態間切換。
@keyframes to-right1 {//向右滾動 0% { //.hide } 100% { //.left } } @keyframes to-right2{ 0% { //.left } 100% { //.middle } } @keyframes to-right3{ 0% { //middle } 100% { //right } } @keyframes to-right4{ 0% { //right } 100% { //hide1 } } ...
為了方便編碼,用less
.state(@width,@height,@opacity,@z-index,@margin-top,@left){ width: @width; height: @height; opacity: @opacity; z-index: @z-index; margin-top: @margin-top; left:@left; } .middle(){ .state(640px,270px,1,2,0,275px); } .left(){ .state(530px,224px,0.4,1,23px,0); } .right(){ .state(530px,224px,0.4,1,23px,660px); } .hide(){ .state(530px,100px,0,0,85px,-530px); } .hide1(){ .state(530px,100px,0,0,85px,1190px); } .middle{ .middle(); } .left{ .left(); } .right{ .right(); } .hide{ .hide(); } @keyframes to-right1{//向右滾動 0% { .hide(); } 100% { .left(); } } @keyframes to-right2{ 0% { .left(); } 100% { .middle(); } } @keyframes to-right3{ 0% { .middle(); } 100% { .right(); } } @keyframes to-right4{ 0% { .right(); } 100% { .hide1(); } } ...點擊左右箭頭,圖片滾動
var roundabout=avalon.define({ $id:"roundabout", img_list:[], cur:0,//當前頁 jump:function(i,dir){//dir:滾動方向 roundabout.cur=i; } });
jump方法的dir參數后面會用到。
這里還沒有添加動畫類,只能進行沒有動畫的滾動。
//所有的動畫類 var animate_class="to-right1 to-right2 to-right3 to-right4 to-left1 to-left2 to-left3 to-left4"; ... jump:function(i,dir){ if(dir==1){//向右滾 cur-1 avalon($("img"+prev(i))).removeClass(animate_class).addClass("to-right1"); avalon($("img"+i)).removeClass(animate_class).addClass("to-right2"); avalon($("img"+next(i))).removeClass(animate_class).addClass("to-right3"); avalon($("img"+next(next(i)))).removeClass(animate_class).addClass("to-right4"); }else{//向左滾 cur+1 avalon($("img"+next(i))).removeClass(animate_class).addClass("to-left1"); avalon($("img"+i)).removeClass(animate_class).addClass("to-left2"); avalon($("img"+prev(i))).removeClass(animate_class).addClass("to-left3"); avalon($("img"+prev(prev(i)))).removeClass(animate_class).addClass("to-left4"); } roundabout.cur=i; } ... function prev(now){//上一頁 return now==0?roundabout.img_list.size()-1:now-1; } function next(now){//下一頁 return now==roundabout.img_list.size()-1?0:now+1; }
幾點說明
這里的removeClass方法和jquery中的一樣,當傳入參數像上面animate_class變量,多個類以空格分開時,對目標刪除多個類(如果有的話)。
prev,next方法用來得到上一張圖片和下一張圖片的在圖片列表中的索引.注意next(next(i))不等于next(i+1).
添加動畫類之前,要先刪除所有可能存在的動畫類。
點擊圓點,圖片滾動和點擊左右箭頭,圖片滾動的動畫不一樣,這里對目標圖片及其左右圖片是一個從小變大的動畫效果。
.state(@width,@height,@opacity,@z-index,@margin-top,@left){ width: @width; height: @height; opacity: @opacity; z-index: @z-index; margin-top: @margin-top; left:@left; } .jump-state(){ .state(0,0,0,0,135px,585px); } @keyframes jump-prev{//變小->左邊圖片 0% { .jump-state(); } 100% { .left(); } } @keyframes jump-middle{//變小->中間圖片 0% { .jump-state(); } 100% { .middle(); } } @keyframes jump-next{//變小->右邊圖片 0% { .jump-state(); } 100% { .right(); } }
下面對圓點綁定點擊事件
spec_jump:function(i){ var cur=roundabout.cur; if(cur-prev(i)==0||cur-next(i)==0){//如果點擊的圖片是當前圖片或當前圖片的相鄰圖片 var dir=1;//確定滾動方向 if(cur-prev(i)==0) dir=2; roundabout.jump(i,dir); }else{ roundabout.cur=i; avalon($("img"+prev(i))).removeClass(animate_class).addClass("jump-prev"); avalon($("img"+i)).removeClass(animate_class).addClass("jump-middle"); avalon($("img"+next(i))).removeClass(animate_class).addClass("jump-next"); } }
這里會添加jump-prev,jump-middle,jump-next類,所以前面的animate_class變量也要加上這3個類。
后記js代碼不超過50行,當然css代碼多點,不過用less寫的話,編程體驗很好
下載
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/111169.html
摘要:效果效果就像優酷綜藝頻道頁面的圖片輪播。本屌之前做過這個參見仿優酷頻道首頁的圖片切換效果不過用的是類似的庫做的。 roundabout效果 效果就像優酷綜藝頻道頁面的圖片輪播。本屌之前做過這個roundabout,參見仿優酷頻道首頁的圖片切換效果,不過用的是類似jquery的庫做的。盡管js代碼不到200行,但還是顯得有點復雜。于是乎,本屌盤算著可不可以用更少的代碼完成這個效果。順便說...
摘要:網上的淡入淡出效果大多是依照中和的方法使用來控制元素的透明度達到目的,但缺點是有輕微的卡頓感,并且運行效率一般。思路是將淡入,淡出的效果做成預先定義好的樣式類,然后用改變元素的類來達到圖片輪播。 網上的淡入淡出效果大多是依照jquery中fadeIn和fadeOut的方法使用js來控制元素的透明度達到目的,但缺點是有輕微的卡頓感,并且運行效率一般。 這里提供另外一個思路,即通過預先定義...
摘要:最近想自己寫下輪播圖,在網上發現一個網友用屬性實現的輪播,趕腳超簡單哦,自己學習了后整理如下。如果我們用給加上類,的就要變成對吧,由于有屬性,所以要等,才能完全變為,實現了淡入。最近想自己寫下輪播圖,在網上發現一個網友用CSS transition屬性實現的輪播,趕腳超簡單哦,自己學習了后整理如下。(找不到原網址了-.-...就不貼了...)(如果不了解transition,先去這里(點我,...
摘要:上一篇說了瀑布流,今天說一下小小幻燈片的故事。幻燈片學名又叫輪播。輪播原理這里先說一下基本原理吧,就是將圖片向左或向右移,然后接著顯示下一張,或者上一張。這里需要感謝一下愛編程提供的圖片接著重頭戲就是。用來標識當前的元素的序號。 上一篇說了瀑布流,今天說一下小小幻燈片的故事。 幻燈片學名又叫 輪播。應該算是一種最常用的頁面展示信息。以前由于ie6/7的拖累,導致我們只能使用,很古老的方...
摘要:很久沒上掘金發現草稿箱里存了好幾篇沒發的文章最近梳理下發出來往期面試官系列如何實現深克隆面試官系列的實現面試官系列前端路由的實現面試官系列基于數據劫持的雙向綁定優勢所在面試官系列你為什么使用前端框架前言設計前端組件是最能考驗開發者基本功的測 很久沒上掘金,發現草稿箱里存了好幾篇沒發的文章,最近梳理下發出來 往期 面試官系列(1): 如何實現深克隆 面試官系列(2): Event Bus...
閱讀 3704·2021-11-22 13:52
閱讀 3602·2019-12-27 12:20
閱讀 2385·2019-08-30 15:55
閱讀 2143·2019-08-30 15:44
閱讀 2261·2019-08-30 13:16
閱讀 574·2019-08-28 18:19
閱讀 1881·2019-08-26 11:58
閱讀 3436·2019-08-26 11:47