我們在書寫程式碼之前,先分析效果圖的結構:
#1. 左右兩個方向按鈕,可以用來切換上一張與下一張。
2. 下方有分頁指示器,用來標註滾動到了第幾張,當然,你點擊對應的按鈕,也可以跳到對應的圖片。
3. 中間主要顯示區域就是用來擺放需要輪播的圖片。
根據上面描述,我們可以先書寫HTML程式碼。
一、HTML程式碼
<body> <p id="youku"> <p class="anniu"> <span class="zuo"></span> <span class="you"></span> </p> <ul class="tuul"> <li class="no0"><a href="#"><img src="images/0.jpg" /></a></li> <li class="no1"><a href="#"><img src="images/1.jpg" /></a></li> <li class="no2"><a href="#"><img src="images/2.jpg" /></a></li> <li class="no3"><a href="#"><img src="images/3.jpg" /></a></li> <li class="no4"><a href="#"><img src="images/4.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/5.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/6.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/7.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/8.jpg" /></a></li> </ul> <p class="xiaoyuandian"> <ul> <li></li> <li></li> <li class="cur"></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </p> </p> </body>
程式碼內容一目了然,與我上面所描述的一致;這裡有兩點我需要說明:
1. class為tuul的ul,也就是存放需要輪播的圖片;裡面的li主要有兩種class:包裝為"no" 與"waiting" 形式,其中"no" 系列表示當前可能處於"活躍"狀態的圖片,而"waiting" 表示這些圖片目前處於隱藏狀態,在接下來的CSS代碼中就有體現。
2. 分頁指示器預設設定第三個 li的class 為 cur. 因為tuul中初始的時候設定的 "活躍" 圖片的個數是5張,所以預設讓第三章居中顯示。但不知道大家有沒有疑惑,初始狀態的時候,介面上面顯示的圖片個數為3張,所以為什麼不選擇第二張作為居中顯示的圖片?那是因為考慮到點擊左邊按鈕的情況,如果選擇第二張居中顯示,第一張是可以看到,但第一張前面就沒有圖片了。當你點擊左邊按鈕的時候,就 "露餡" 了。所以整體的設計想法是:介面上面顯示三張,超出介面的部分,左右各有一張,只是看不到而已。在下面的講解中,我將詳細講解這個實現過程。
二、CSS程式碼
<style type="text/css"> *{ padding: 0; margin: 0; } #youku{ width: 1189px; height: 360px; margin: 100px auto; position: relative; overflow: hidden; } #youku ul{ list-style: none; } #youku .tuul li{ position: absolute; background-color: black; } #youku li.waiting{ display: none; } #youku li img{ width: 100%; height: 100%; } #youku .anniu .zuo{ position: absolute; width: 45px; height: 45px; background:url(images/zuo.png) no-repeat; top:100px; left:10px; z-index: 1000; cursor: pointer; } #youku .anniu .you{ position: absolute; width: 45px; height: 45px; background:url(images/you.png) no-repeat; top:100px; right:10px; z-index: 1000; cursor: pointer; } #youku li.no0{width: 174px;height:122px;left:-116px;top:100px;z-index: 777;} #youku li.no1{width: 356px;height:223px;left:0px;top:26px;z-index: 888;} #youku li.no2{width: 642px;height:273px;left:274px;top:0px;z-index: 999;} #youku li.no3{width: 356px;height:223px;left:834px;top:26px;z-index: 888;} #youku li.no4{width: 174px;height:122px;left:1097px;top:100px;z-index: 777;} #youku li.no1 img , #youku li.no3 img{ opacity: 0.3; } #youku .xiaoyuandian{ width: 600px; height: 20px; position: absolute; top: 312px; left: 454px; } #youku .xiaoyuandian ul li{ float: left; width: 16px; height: 16px; background-color: blue; margin-right: 10px; border-radius: 100px; cursor: pointer; } #youku .xiaoyuandian ul li.cur{ background-color:green; } </style>
關於這裡的CSS我就不作一一說明了,如果想了解更具體的話,請參考我以前寫的系列JS & JQuery. 這裡,我只說明兩點:
1. 對"活躍" 圖片的CSS的設置,即#youku li.no0~no4的設置,注意到no0的left值是負數,而no1的left值是0,這就印證了上面我所表達的觀點,可視範圍靜止狀態是顯示三張圖片的,而其餘兩張圖片是分別在可視範圍的左右側。注意設定各圖片的z-index值,使得有立體層次感,數值越大越前方顯示。
2. 對可視範圍兩邊的圖片,設定opacity, 使得他們變暗。
設定完以上CSS程式碼後,剖析圖如下:
#三、JQuery程式碼
<script type="text/javascript"> $(document).ready( function() { //定义一个初始速度 var sudu = 600; var shangdi = false; //定义json var json0 = {"width":"174px","height":"122px","left":"-116px", "top":"100px"}; var json1 = {"width":"356px","height":"223px","left":"0px", "top":"26px"}; var json2 = {"width":"642px","height":"273px","left":"274px", "top":"0"}; var json3 = {"width":"356px","height":"223px","left":"834px", "top":"26px"}; var json4 = {"width":"174px","height":"122px","left":"1097px", "top":"100px"}; var nowimg = 2; var timer = setInterval(youanniuyewu,2000); $("#youku").mouseenter( function() { clearInterval(timer); } ); $("#youku").mouseleave( function() { clearInterval(timer); timer = setInterval(youanniuyewu,2000); } ); $(".you").click(youanniuyewu); function youanniuyewu(){ if(!$(".tuul li").is(":animated") || shangdi == true){ if(nowimg < 8){ nowimg ++; }else{ nowimg = 0; } $(".xiaoyuandian li").eq(nowimg).addClass("cur").siblings().removeClass("cur"); //先交换位置 $(".no1").animate(json0,sudu); $(".no2").animate(json1,sudu); $(".no3").animate(json2,sudu); $(".no4").animate(json3,sudu); $(".no0").css(json4); //再交换身份 $(".no0").attr("class","waiting"); $(".no1").attr("class","no0"); $(".no2").attr("class","no1"); $(".no3").attr("class","no2"); $(".no4").attr("class","no3"); //上面的交换身份,把no0搞没了!所以,我们让no1前面那个人改名为no0 if($(".no3").next().length != 0){ //如果no3后面有人,那么改变这个人的姓名为no4 $(".no3").next().attr("class","no4"); }else{ //no3前面没人,那么改变此时队列最开头的那个人的名字为no0 $(".tuul li:first").attr("class","no4"); } //发现写完上面的程序之后,no6的行内样式还是json0的位置,所以强制: $(".no4").css(json4); } } $(".zuo").click( function(){ if(!$(".tuul li").is(":animated") || shangdi == true){ if(nowimg > 0){ nowimg --; }else{ nowimg = 8; } $(".xiaoyuandian li").eq(nowimg).addClass("cur").siblings().removeClass("cur"); //先交换位置: $(".no0").animate(json1,sudu); $(".no1").animate(json2,sudu); $(".no2").animate(json3,sudu); $(".no3").animate(json4,sudu); $(".no4").css(json0); //再交换身份 $(".no4").attr("class","waiting"); $(".no3").attr("class","no4"); $(".no2").attr("class","no3"); $(".no1").attr("class","no2"); $(".no0").attr("class","no1"); //上面的交换身份,把no0搞没了!所以,我们让no1前面那个人改名为no0 if($(".no1").prev().length != 0){ //如果no1前面有人,那么改变这个人的姓名为no0 $(".no1").prev().attr("class","no0"); }else{ //no1前面没人,那么改变此时队列最后的那个人的名字为no0 $(".tuul li:last").attr("class","no0"); } $(".no0").css(json0); } } ); $("#youku .xiaoyuandian li").click( function(){ sudu = 100; //临时把这个速度变化一下 shangdi = true; //flag var yonghuandexuhao = $(this).index(); if(yonghuandexuhao > nowimg ){ var cishu = yonghuandexuhao - nowimg; console.log("主人,我已经通知上帝帮你按右按钮" + cishu + "次"); for(var i = 1 ; i<= cishu ; i++){ $(".you").trigger("click"); //让上帝帮你按一次又按钮 } }else{ var cishu = nowimg - yonghuandexuhao; console.log("主人,我已经通知上帝帮你按左按钮" + cishu + "次"); for(var i = 1 ; i<= cishu ; i++){ $(".zuo").trigger("click"); //让上帝帮你按一次又按钮 } } nowimg = yonghuandexuhao; sudu = 600; //再把速度恢复 shangdi = false; } ); } ); </script>
JQuery程式碼中關於定時器的控制,分頁按鈕的點擊,這裡我就不介紹了,如果有興趣的話,請參考:JS & JQuery 裡面的內容。
這裡我主要說明兩點:
1. json0, json1, json2, json3, json4資料的定義,其初始值與CSS上面定義的一致,它的目的就是用來方便的切換各圖片的絕對位置,以下我會詳細介紹。
2. 主要講解右邊按鈕點擊事件,也就是youanniuyewu這個方法。
2-1) nowImg索引簡單的處理:
if(nowimg < 8){ nowimg ++; }else{ nowimg = 0; }
如果不是最後一張,點擊一下"右按鈕", 則nowImg值加1, 如果是最後一張,則nowImg從0開始。
2-2)點擊 "右邊按鈕", 關於分頁指示器的處理:
$(".xiaoyuandian li").eq(nowimg).addClass("cur").siblings().removeClass("cur");
將目前顯示的圖片對應的指示器按鈕高亮顯示,兄弟節點普通顯示。
2-3)交換圖片位置:
//先交换位置 $(".no1").animate(json0,sudu); $(".no2").animate(json1,sudu); $(".no3").animate(json2,sudu); $(".no4").animate(json3,sudu); $(".no0").css(json4);
前面四句話,會動畫執行圖片移動的效果。靜止狀態的時候是三張圖片顯示在我們眼前;運動的時候,可以想像得出最多有四張圖片顯示在我們眼前,上面四句代碼執行過程中,剖析圖如下:
即在動畫執行的過程中,"no1" 的圖片漸漸離開螢幕視覺範圍,同時, "no4" 的圖片漸漸顯示在螢幕視覺範圍內。
而在动画执行的过程中,"no0" 的这张图片早就定位到 "no4" 的位置(此时在可视范围之外,因为这里的animate动画是异步执行的,不会延迟$(.no0).css(json4)这句代码的执行。当这一组代码执行完毕后,剖析图如下:
此时,我们再将那些 处于 "waiting" 状态的图片考虑进来,则此时的剖析图如下:
2-4)以上流程执行完毕后,是完成了一次轮播效果,但是此时各个图片的牌号顺序已经被打乱,为了使得轮播继续下去,我们应该将牌号再 "恢复" 过来。所以我们可以添加以下代码:
//再交换身份 $(".no0").attr("class","waiting"); $(".no1").attr("class","no0"); $(".no2").attr("class","no1"); $(".no3").attr("class","no2"); $(".no4").attr("class","no3");
上面的代码执行后,意味着将 上图中 "no0" 这张图片拉入到 "waiting" 区域,而其他四个的编号则依次往前推算。执行完毕后,剖析图如下:
正如上图所示,"活跃"状态的5张图片,最后一张现在也变成了 "waiting" 状态,所以需要有人替补上去,才能继续动画的执行。很显然,应该拿 "waiting" 列表的第一张,也就是 "活跃" 状态的后面一张图片 "顶替" 上去;如果后面没有 "waiting" 状态的图片了, 说明这些 "waiting" 状态的图片全部 "跑到" class 为 tuul所有列表的前面去了,那就抓取这些列表的第一张作为 "顶替者"。代码如下:
if($(".no3").next().length != 0){ //如果no3后面有人,那么改变这个人的姓名为no4 $(".no3").next().attr("class","no4"); }else{ //no3前面没人,那么改变此时队列最开头的那个人的名字为no0 $(".tuul li:first").attr("class","no4"); } //发现写完上面的程序之后,no6的行内样式还是json0的位置,所以强制: $(".no4").css(json4);
这里需要注意的是:虽然已经经历了很多步奏的位置信息的改变及牌号的改变,但是刚刚被拉入等待区域的那张图片在li中的与兄弟节点的位置关系并没有发生改变,只是class属性变成了 "waiting". 即此时的tuul中li的代码结构如下:
<ul class="tuul"> <li class="waiting"><a href="#"><img src="images/0.jpg" /></a></li> <li class="no0"><a href="#"><img src="images/1.jpg" /></a></li> <li class="no1"><a href="#"><img src="images/2.jpg" /></a></li> <li class="no2"><a href="#"><img src="images/3.jpg" /></a></li> <li class="no3"><a href="#"><img src="images/4.jpg" /></a></li> <li class="no4"><a href="#"><img src="images/5.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/6.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/7.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/8.jpg" /></a></li> </ul>
执行完以上代码后,剖析图如下:
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是jquery實現圖片廣告輪播特效的詳細內容。更多資訊請關注PHP中文網其他相關文章!