輪播圖是一種美麗的存在

輪播圖是一種如此美麗的存

——來自一只小白的一次記錄
··· 有人說,知道的越多,生活也就越?jīng)]意思?就像你學(xué)了html/css/js等等以后,當(dāng)你看到網(wǎng)頁,你首先想到的是它的結(jié)構(gòu),用什么樣的方法敲出來的,而不再是細(xì)細(xì)感受它的美,也就失去很多樂趣。我卻不這樣想。
··· 一直以來都覺得輪播圖是一種多么美麗的存在,或清新或萌寵,總能一下子吸引到我。 學(xué)了幾天輪播圖,有點(diǎn)愛上它。有迷一樣的自信覺得不久的將來自己也能寫一波輪播圖,讓自己成為那種為創(chuàng)造美的并具有技能的人。未來也有曾經(jīng)似我一般的迷妹迷弟深深迷戀我的作品(哇咔咔~)
···好了言歸正傳:

總體結(jié)構(gòu)

首先是一個(gè)大的框架,用相對(duì)定位、絕對(duì)定位把它們的位置都固定下來,注意前后關(guān)系,可以在樣式中設(shè)置z-index值

<div>  大的div
       <div>左右按鈕</div>
       <div>圖片</div>
       <div>小圓圈</div>
</div>

這里要說一下,輪播圖里主要用到的知識(shí)。
(1)動(dòng)畫:輪播主要肯定就是動(dòng),這里用到的是左右線性移動(dòng),可以通過數(shù)學(xué)公式控制,我們把動(dòng)畫過程封裝成函數(shù),操作起來就很方便了。
(2)定時(shí)器:用于自動(dòng)輪播,想你在逛某寶首頁的時(shí)候見得最多啦 不需要人為操作他會(huì)給你自動(dòng)播放,時(shí)間多長你說了算。
(3)鼠標(biāo)事件:實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊,離開等等一系列操作時(shí),頁面按照你的想法來操作,比如某寶首頁自動(dòng)輪播你看到感興趣的可以鼠標(biāo)放上去讓它停下,不想看了放開讓它繼續(xù)輪播等等。

各部分簡單說明

1.主題圖片

這是輪播圖比較難也是最重要的部分,我們輪播的就是圖片嘛。主要通過控制圖片div的 left值,來移動(dòng),一次性移動(dòng)的距離即一張圖片的寬度。為了實(shí)現(xiàn)無縫輪播,我們會(huì)把最后一張克隆放到末尾。要注意,動(dòng)畫時(shí)間應(yīng)該小于定時(shí)器的時(shí)間間隔,防止出現(xiàn)混輪,這又稱為間歇輪播,有一個(gè)停頓的時(shí)間

2.左右按鈕

實(shí)現(xiàn)點(diǎn)擊事件,點(diǎn)擊之后,先讓原來的圖片淡出,下一張圖片淡入(淡入淡出用透明度控制),與此同時(shí)讓小圓圈也左(右)移一個(gè),實(shí)現(xiàn)同步。這里需要注意的是,點(diǎn)擊之后先用函數(shù)截流做判斷 如 if(lis[idx].isanimated) return; 防止出現(xiàn)混亂。

小圓圈

小圓圈的實(shí)現(xiàn)則通過遍歷每一個(gè) li 節(jié)點(diǎn),每一次點(diǎn)擊,先用排他模型,將所有的圓圈變暗,再將點(diǎn)擊的圈圈變亮即可。這里我們通過css樣式控制比較方便。在css中設(shè)置2個(gè)class名對(duì)應(yīng)2種樣式,一個(gè)隱藏,一個(gè)顯示。排他的將class名更改就輕松很多啦。這里同樣需要用函數(shù)截流。

代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        .carousel{
            width: 560px;
            height: 300px;
            margin: 100px auto;
            border: 1px solid #333;
            position: relative;
        }
        .carousel ul{
            list-style: none;
        }
        .carousel ul li{
            position: absolute;
            top: 0;
            left: 0;
            opacity: 0;
            filter:alpha(opacity = 0);
        }
        .carousel ul li.first{
            opacity: 1;
            filter:alpha(opacity = 0);
        }
        .btns a{
            position: absolute;
            width: 40px;
            height: 40px;
            top: 50%;
            margin-top: -20px;
            background-color: orange;
            font-size: 30px;
            line-height: 40px;
            text-align: center;
            border-radius: 50%;
            font-weight: bold;
            cursor: pointer;
            z-index: 999;
        }
        .btns a:hover{
            background-color: gold;
        }
        .leftBtn{
            left: 10px;
        }
        .rightBtn{
            right: 10px;
        }
        .circles{
            position: absolute;
            width: 150px;
            height: 16px;
            bottom: 10px;
            right: 10px;
        }
        .circles ol{
            list-style: none;
        }
        .circles ol li{
            float: left;
            width: 16px;
            height: 16px;
            background-color: orange;
            margin-right: 6px;
            border-radius: 50%;
            cursor: pointer;
        }
        .circles ol li.cur{
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="carousel" id="carousel">
        <div class="btns">
            <a class="leftBtn"  id="leftBtn"></a>
            <a class="rightBtn" id="rightBtn"></a>
        </div>
        <div class="imageslist" id="imageslist">
            <ul>
                <li class="first"><a>![](images/0.jpg)</a></li>
                <li><a>![](images/1.jpg)</a></li>
                <li><a>![](images/2.jpg)</a></li>
                <li><a>![](images/3.jpg)</a></li>
                <li><a>![](images/4.jpg)</a></li>
            </ul>
        </div>
        <div class="circles" id="circles">
            <ol>
                <li class="cur"></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ol>
        </div>
    </div>
    
    <script type="text/javascript" src="animate-2.0.1.js"></script>
    <script type="text/javascript">
        //得到carousel
        var carousel = document.getElementById("carousel");
        //得到li
        var lis = document.getElementById("imageslist").getElementsByTagName("li");
        //得到按鈕
        var leftBtn = document.getElementById("leftBtn");
        var rightBtn = document.getElementById("rightBtn");
        //得到小圓點(diǎn)
        var circlesLi = document.getElementById("circles").getElementsByTagName("li");
        //圖片數(shù)量
        var imgLength = lis.length;
        //圖片寬度
        var width = 560;
        //滾動(dòng)速度
        var animatetime = 300;
        //緩沖描述
        var tween = "Linear";
        //間隔時(shí)間
        var interval = 2000;
         
        var idx = 0;


        //自動(dòng)輪播
        var timer = setInterval(rightBtnHandler,interval);
        //鼠標(biāo)進(jìn)入停止
        carousel.onmouseover = function(){
            clearInterval(timer);
        }
        //鼠標(biāo)離開開始
        carousel.onmouseout = function(){
            timer = setInterval(rightBtnHandler,interval);
        }
        
        //右按鈕的監(jiān)聽
        rightBtn.onclick = rightBtnHandler;

        function rightBtnHandler(){
            //函數(shù)截流
            if(lis[idx].isanimated) return;

            //原來的信號(hào)量的圖片淡出
            animate(lis[idx],{"opacity" : 0},1000);
            //信號(hào)量改變
            idx++;
            if(idx > imgLength - 1){
                idx = 0;//到最后一張(不包括克隆用于過渡的)時(shí)跳到第一張
            }
            //新信號(hào)量的圖片淡入
            animate(lis[idx],{"opacity" : 1},1000);

            changeCircle();
        }

        //左按鈕的監(jiān)聽
        leftBtn.onclick = function(){
            //函數(shù)截流:讓一個(gè)函數(shù)無法在很短的時(shí)間間隔內(nèi)連續(xù)調(diào)用,只有當(dāng)上一次函數(shù)執(zhí)行后過了你規(guī)定的時(shí)間間隔
            if(lis[idx].isanimated) return;

            //原來的信號(hào)量的圖片淡出
            animate(lis[idx],{"opacity" : 0},1000);
            //信號(hào)量改變
            idx--;
            if(idx < 0){
                idx = imgLength - 1;
            }
            //新信號(hào)量的圖片淡入
            animate(lis[idx],{"opacity" : 1},1000);

            changeCircle();
        }

        //批量添加小圓點(diǎn)的監(jiān)聽
        for(var i = 0 ; i <= imgLength - 1 ; i++){
            circlesLi[i].index = i; //先編號(hào)
            circlesLi[i].onclick = function(){
                //截流
                if(lis[idx].isanimated) return;
                
                //原來的信號(hào)量的圖片淡出
                animate(lis[idx],{"opacity" : 0},1000);
                //信號(hào)量改變
                idx = this.index;
                //新信號(hào)量的圖片淡入
                animate(lis[idx],{"opacity" : 1},1000);

                changeCircle();
            }
        }


        //更換小圓點(diǎn)函數(shù)
        function changeCircle(){
            //去掉所有小圓點(diǎn)的cur(排他模型)
            for (var i = 0; i < circlesLi.length; i++) {
                circlesLi[i].className = "";
            }
            //第idx信號(hào)量這個(gè)小圓點(diǎn)加cur
            circlesLi[idx].className = "cur";
        }
    </script>
</body>
</html>

是不是驚到了?小小的一組輪播圖,居然要碼這么多的代碼 哈哈哈
這里也可以簡化,把所以css代碼也封裝到css文件,那么代碼可以簡化。
說明:
連接css代碼:
<link rel="stylesheet" type="text/css" href="allcss.css"></style>

連接js代碼:
<script type="text/javascript" src="animate-2.0.1.js"></script>
<script type="text/javascript" src="all.js"></script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
<link rel="stylesheet" type="text/css" href="allcss.css"></style>
</head>
<body>
    <div class="carousel" id="carousel">
        <div class="btns">
            <a class="leftBtn"  id="leftBtn"></a>
            <a class="rightBtn" id="rightBtn"></a>
        </div>
        <div class="imageslist" id="imageslist">
            <ul>
                <li class="first"><a>![](images/0.jpg)</a></li>
                <li><a>![](images/1.jpg)</a></li>
                <li><a>![](images/2.jpg)</a></li>
                <li><a>![](images/3.jpg)</a></li>
                <li><a>![](images/4.jpg)</a></li>
            </ul>
        </div>
        <div class="circles" id="circles">
            <ol>
                <li class="cur"></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ol>
        </div>
    </div>
<script type="text/javascript" src="animate-2.0.1.js"></script>
<script type="text/javascript" src="all.js"></script>   
</body>
</html>

這樣看起來是不是簡單多了?
把代碼封裝起來,方便管理維護(hù),并且可以多次使用,多次使用時(shí)只需要加載一次。建立自己的一個(gè)代碼庫是我最近開始做,并且希望能堅(jiān)持做下去的事情,用得多了,不就的將來也許就可以分分鐘get的封裝代碼的技能!
I am coming!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,917評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,172評(píng)論 4 61
  • 這里列一個(gè)清單,實(shí)驗(yàn)室應(yīng)該有啥設(shè)施。
    lixvow閱讀 134評(píng)論 0 0
  • 有一天我求了佛,佛說:我可以讓你許一個(gè)愿。我對(duì)佛說:讓我群里所有的朋友永遠(yuǎn)健康,佛說只能四天!我說:行,春...
    健康顧問飛雁閱讀 227評(píng)論 0 0
  • 這幾天加班到很晚,公交等不到,打車沒有車,回到家趕緊隨便吃點(diǎn)晚飯,然后洗澡護(hù)膚寫日記,一看時(shí)間已經(jīng)是半夜1點(diǎn)了。 ...
    達(dá)達(dá)令閱讀 633評(píng)論 0 2

友情鏈接更多精彩內(nèi)容