分类 JS 下的文章

延遲菜單

獲取class兼容方法:

    function getByClass(oParent, sClass) {
        var aEle = oParent.getElementsByTagName('*');
        var result = [] //最后返回数组
        var re = new RegExp('\\b' + sClass + '\\b', 'i');//正则对象
        for (var i = 0; i < aEle.length; i++) {
            if (re.test(aEle[i].className)) {
                result.push(aEle[i])
            }
        }
        return result;
    }

js代碼:

window.onload = function(){
    var ul = document.getElementsByTagName('ul')[0]
    var a = getByClass(document, 'normal')
    var span1 = getByClass(document, 'float_layer');
    var timer = null;
    for (var i = 0; i < a.length; i++) {
        a[i].index = i;
        a[i].onmouseover = function () { //移到a.normal
            for (var i = 0; i < a.length; i++) { //清除所有顯示
                span1[i].style.display = 'none'
            }
            span1[this.index].style.display = 'block' //當前顯示
            clearInterval(timer) //在a.normal上也須清除定時器
        }
        a[i].onmouseout = function () { //移開a.normal
            var This = this
            timer = setTimeout(function () {
                span1[This.index].style.display = 'none' //this指setTimeout的對象window,改變this指向
            }, 1000)
        }
        span1[i].onmouseover = function () { //在span.float_layer也顯示,所以需要清除timer
            clearInterval(timer)
        }
        span1[i].onmouseout = function () { //離開span.float_layer,消失
            var This = this;
            timer = setTimeout(function () {
                This.style.display = 'none'
            }, 1000)
        }
    }
}

運行

新浪圍脖分享

選中文字方法

    function selectText() {
        if (document.selection) { //IE
            return document.selection.createRange().text;//字符串
        }
        else {
            return window.getSelection().toString(); //getSelection()對象,需轉成字符串
        }
    }

阻止冒泡方法

function (ev) {
    ev = ev || event
    if(ev.stopPropagation){
        ev.stopPropagation();
    }
    else{
        ev.cancelBubble = true;
    }
}

完整例子

window.onload = function () {
    //選中文字方法
    function selectText() {
        if (document.selection) { //IE
            return document.selection.createRange().text;//字符串
        }
        else {
            return window.getSelection().toString(); //getSelection()對象,需轉成字符串
        }
    }

    var p = document.getElementById('p1')
    var img = document.getElementById('img')
    p.onmouseup = function (ev) {
        var ev = ev || event
        var left = ev.clientX;
        var top = ev.clientY;
        ev.stopPropagation()
        if (selectText().length > 10) {
            setTimeout(function () {  //延遲觸發
                img.style.display = 'block'
                img.style.left = left + 'px'
                img.style.top = top + 'px'
            }, 100)
        }
        else {
            img.style.display = ''
        }
    }
    p.onclick = function (ev) {
        var ev = ev || event;
        ev.cancelBubble = true
        /*if(ev.stopPropagation){
         ev.stopPropagation()
         }
         else{
         ev.cancelBubble = true;
         } //低版本可能需要兼容*/
    }
    document.onclick = function () {
        img.style.display = ''
    }
    img.onclick = function () {
        window.location.href = 'http://service.weibo.com/share/share.php?searchPic=false&title=' + selectText() + '&url=' + window.location.href;
    }
}

運行

元素無縫切換

關注點:
cloneNode(true); 子節點所有節點一起複製;
cloneNode(false);不複製子節點下的內容;
思想:移動ul,動態設置ul寬度li.length oneSize,移動ul的距離-iNow oneSize; 每個li的寬度:元素.offsetWidth+1;循環ul.removeChild(元素),一個個刪除,所以總是刪除第一個;
簡陋佈局

<div id="box">
    <ul id="ul">
        <li><div>1</div></li>
        <li><div>2</div></li>
        <li><div>3</div></li>
        <li><div>4</div></li>
        <li><div>5</div></li>
    </ul>
</div>
<input type="button" value="切換" id="input1"/>
window.onload = function () {
    var inp = document.getElementById('input1')
    var box = document.getElementById('box')
    var ul = document.getElementById('ul')
    var li = ul.getElementsByTagName('li')
    var oneSize = li[0].offsetWidth + 1; //li寬度
    var iNum = 4; //一次走多少個元素
    var onoff = true;//連續點擊錯亂bug
    getWidth()
    function getWidth() { //獲取ul寬度方法
        ul.style.width = li.length * oneSize + 'px'
    }
    inp.onclick = function () {
        //cloneNode(),cloneNode(true) 一起複製子節點,cloneNode(false),不會複製子節點
        if (onoff) {
            onoff = false; //一上來 false
            for (var i = 0; i < iNum; i++) {
                var oli = li[i].cloneNode(true);
                ul.appendChild(oli)
                getWidth()
            }
            startMove(ul, {left: -iNum * oneSize}, function () { //運動結束後再刪除前面的,才能循環
                for (var i = 0; i < iNum; i++) {
                    ul.removeChild(li[0]); //刪除
                    ul.style.left = '0'
                }
                onoff = true  //運動線束後可點擊,onoff = true;
            })
        }
    }
}

運行

圍脖登入框

關注點:
onchange事件:光標消失時觸發1次
onpropertychange事件:連續觸發,IE下使用
oninput事件:連續觸發,現代下使用
判斷ie簡短方法:

var ie = !-[1,] //IE9已修復

推薦:

if(!window.VBArray){
    alert('Not IE')
}
else{
    alert('IE')
}

閃動背景:開定時器,var iNum = 0; iNum++
單字節變雙字節[計數]
return String(str).replace(/1/g, 'aa').length;

簡陋佈局:

<div id="box">
    <p>《新浪圍脖社區公約徵求意見》意見徵求</p>
    <textarea name="" id="" cols="30" rows="10"></textarea>
    <a class="dis" href="javascript:;">發布</a>
</div>
window.onload = function () {
    var box = document.getElementById('box');
    var p = box.getElementsByTagName('p')[0];
    var t = box.getElementsByTagName('textarea')[0];
    var a = box.getElementsByTagName('a')[0];
    var onoff = true;//開關焦點進來離開
    var ie = !-[1,];//簡短判斷ie
    var timer = null;//背景閃動定義
    var iNum = 0;//背景閃動定義
    t.onfocus = function () {
        if (onoff) {
            p.innerHTML = '打擊虛假信息,建設文明圍脖,還可輸入<span>140</span>字'
            onoff = false;
        }
    };
    t.onblur = function () {
        if (t.value == '') {
            p.innerHTML = '《新浪圍脖社區公約徵求意見》意見徵求'
            onoff = true;
        }
    }
    if (ie) {
        t.onpropertychange = toChange;
    }
    else {
        t.oninput = toChange;
    }
    function toChange() {
        var num = Math.ceil(getLength(t.value) / 2);//找到字數
        var span = box.getElementsByTagName('span')[0]
        if (num < 140) {
            span.innerHTML = 140 - num;
        }
        else {
            span.innerHTML = num - 140;
            span.style.color = 'red'
        }
        if (t.value == '' || num > 140) {
            a.className = 'dis'
        }
        else {
            a.className = ''
        }
    }
    a.onclick = function () {
        if (this.className == 'dis') {
            //閃動,定時器運動1s
            clearInterval(timer)
            timer = setInterval(function () {
                if (iNum == 4) { //走兩輸即可
                    clearInterval(timer)
                    iNum = 0;
                }
                else {
                    iNum++;
                }
                if (iNum % 2) { //1
                    t.style.background = 'rgb(255, 215, 215)'
                }
                else { //0
                    t.style.background = ''
                }
            }, 100)
        }
        else {
            alert('發布成功')
        }
    }
    function getLength(str) { //判斷單字節,0-255 使用 x = xx 記2字節
        return String(str).replace(/[^\x00-\xff]/g, 'aa').length; //aa轉為2字節
    }
}
body{font-size:12px}#box{width:400px;margin:20px auto}#box textarea{width:400px;height:100px;resize:none;overflow:hidden}#box p{float:right}#box a{width:80px;height:30px;font-size:16px;line-height:30px;text-align:center;float:right;background:#049E04;color:#fff;text-decoration:none;margin-right:-6px;margin-top:10px}#box a.dis{background:#ccc;color:#666}

運行


  1. x00-xff

基礎進度條

通用html代碼

<div id="box">
    <div id="boxBar">0%</div>
    <div id="boxText">0%</div>
</div>

通用方法

    function progressFn(cent) { //cent傳百分比
        var box = document.getElementById('box')
        var box2 = document.getElementById('box2');
        var boxBar = document.getElementById('boxBar')
        var boxText = document.getElementById('boxText')
        var allWidth = parseInt(getStyle(box, 'width')); //500
        boxBar.innerHTML = cent + '%'
        boxText.innerHTML = cent + '%'
        boxBar.style.clip = 'rect(0px,' + (cent / 100) * allWidth + 'px,40px,0px)';//改變第一層的寬度
    }

通用css

    #box{ width: 500px; height: 40px; border: 1px solid #c8c8c8; background: #fff; position: relative; margin-left: auto; margin-right: auto;}
    #boxBar{ position: absolute; left: 0; top: 0; z-index: 2; height: 40px; width: 100%; line-height: 40px; color: #ffffff; text-align: center; font-size: 20px; font-weight: bold; clip: rect(0px,0,40px,0px); background: #00a1f5;}
    #boxText{ position: absolute; left: 0; top: 0; z-index: 1; width: 100%; height: 40px; line-height: 40px; color: #000000; text-align: center; font-size: 20px; font-weight: bold;}

下面是硬編碼方式例子

<div id="box2" style="display: none;">
    <img src="http://b.zol-img.com.cn/desk/bizhi/image/6/1920x1080/1436965788437.jpg" rel="nofollow"/>
    <img src="http://attach.bbs.miui.com/forum/201405/24/093305l2tuzftkogegn1if.jpg" rel="nofollow"/>
    <img src="http://img.ivsky.com/img/bizhi/pic/201506/26/dal_shabet-005.jpg" rel="nofollow"/>
    <img src="http://i1.shouyou.itc.cn/2014/news/2014/09/11/1920x1080bz0912_06.jpg" rel="nofollow"/>
    <img src="http://i2.download.fd.pchome.net/g1/M00/10/18/ooYBAFWyD6WIMSmsAAeRvXnu1PwAACnFwIjKkkAB5HV807.jpg" rel="nofollow"/>
</div>
    //硬編碼方式
    var box = document.getElementById('box')
    var box2 = document.getElementById('box2');
    var img = box2.getElementsByTagName('img');
    var iNow = 0; //當前百分比
    for (var i = 0; i < img.length; i++) {
        (function (i) {
            var yimg = new Image();//圖片預加載對象  //頁面在window.onload之後執行,若生效則不加window.onload
            yimg.onload = function () {
                iNow++;
                progressFn(parseInt(iNow / img.length * 100));
                if (iNow == img.length) {
                    box2.style.display = 'block'
                    box.style.display = '';
                }
            }
            yimg.src = img[i].src;
        })(i)
    }

運行

瀑布流佈局

瀑布流佈局 - 浮動

<div id="box"><ul><li><img src="../img/p-1.jpg" alt=""><p>浮動瀑布流佈局1</p></li><li><img src="../img/p-2.jpg" alt=""><p>浮動瀑布流佈局2</p></li><li><img src="../img/p-3.jpg" alt=""><p>浮動瀑布流佈局3</p></li></ul><ul><li><img src="../img/p-4.jpg" alt=""><p>浮動瀑布流佈局4</p></li><li><img src="../img/p-5.jpg" alt=""><p>浮動瀑布流佈局5</p></li><li><img src="../img/p-6.jpg" alt=""><p>浮動瀑布流佈局6</p></li></ul><ul><li><img src="../img/p-7.jpg" alt=""><p>浮動瀑布流佈局7</p></li><li><img src="../img/p-8.jpg" alt=""><p>浮動瀑布流佈局8</p></li><li><img src="../img/p-9.jpg" alt=""></li></ul></div>
window.onload = function () {
        var ul = document.getElementsByTagName('ul')
        window.onscroll = function () {
            var veiwHeight = document.documentElement.clientHeight; //可視區的距離
            var scrollY = document.documentElement.scrollTop || document.body.scrollTop; //滾動條滾動的距離
            var bBtn = true //判斷是否需要加ajax
            //開始循環: 所有ul,找裏面對應最後一個Li,與屏蔽上面進行比較
            for (var i = 0; i < ul.length; i++) {
                var li = ul[i].getElementsByTagName('li');
                var lastli = li[li.length - 1] //找最後一個即可
                if (posTop(lastli) < veiwHeight + scrollY && bBtn) {  //必須發送請求加載
                    bBtn = false
                    ajax('data.js', function (str) { //xxx.php?page=1&num=10  //ajax(請求的地址,請求成功回調)
                        var json = eval('(' + str + ')')  //返回字符串,解析成js語句,用eval 兩邊加小括號
                        if (json.code) {  //json.code == 0 不發請求
                            bBtn = true; //無請求數據時為false
                        }
                        for (var i = 0; i < json.list.length; i++) { //三組數據添加到頁面,循環json裏的list == 9
                            var list = json.list[i];
                            for (var j = 0; j < list.src.length; j++) {
                                var li = document.createElement('li')
                                li.innerHTML = '<img src="' + list.src[j] + '"/><p>' + list.title[j] + '</p>'
                                ul[i].appendChild(li)
                            }
                        }
                    })
                }
            }
        };
        //觸發滾動條事件,每一個ul裏的li提前到達可視區,則分別添加數據;,先寫方法獲取距離下面的距離 ,offsetTop沒辦法直接獲取屏幕的距離,offsetTop是獲取到有定位的距離;
        function posTop(obj) { //最後一個li頂部距離瀏覽器上邊的距離
            var top = 0;
            while (obj) {
                top += obj.offsetTop;
                obj = obj.offsetParent;
            }
            return top;
        }
    }

運行

瀑布流佈局 - 定位

<div id="box"><ul><li><img src="p-1.jpg" alt=""><p>浮動瀑布流佈局1</p></li><li><img src="p-2.jpg" alt=""><p>浮動瀑布流佈局2</p></li><li><img src="p-3.jpg" alt=""><p>浮動瀑布流佈局3</p></li><li><img src="p-4.jpg" alt=""><p>浮動瀑布流佈局4</p></li><li><img src="p-5.jpg" alt=""><p>浮動瀑布流佈局5</p></li><li><img src="p-6.jpg" alt=""><p>浮動瀑布流佈局6</p></li><li><img src="p-7.jpg" alt=""><p>浮動瀑布流佈局7</p></li><li><img src="p-8.jpg" alt=""><p>浮動瀑布流佈局8</p></li><li><img src="p-9.jpg" alt=""><p>浮動瀑布流佈局9</p></li></ul></div>
    window.onload = function () {
        var li = document.getElementsByTagName('li');
        var aHeight = {L: [], C: [], R: []};//存高度對象
        for (var i = 0; i < li.length; i++) {
            var iNow = i % 3// 0,1,2
            switch (iNow) {
                case 0:
                    li[i].style.left = '5px'
                    aHeight.L.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.L[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
                case 1:
                    li[i].style.left = '200px'
                    aHeight.C.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        /*
                        * 1,2,3關三個Li top值為0
                        * 後面li top值為前面累加,如 3 4 5   3/3 = 1, 4/3 = 1 , 5/3 =1 向下取整 即前面有一個元素的高度
                        * 6 7 8 Math.floor(i/3) = 2,即有兩個元素高度
                        * */
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.C[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
                case 2:
                    li[i].style.left = '400px'
                    aHeight.R.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.R[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
            }
        }
    }

運行

百葉窗效果

簡陋佈局

<ul id="ul"><li><div><p>這是一個百葉窗效果,測試1</p><p>這是一個百葉窗效果,測試2</p></div></li><li><div><p>這是一個百葉窗效果,測試3</p><p>這是一個百葉窗效果,測試4</p></div></li><li><div><p>這是一個百葉窗效果,測試5</p><p>這是一個百葉窗效果,測試6</p></div></li><li><div><p>這是一個百葉窗效果,測試7</p><p>這是一個百葉窗效果,測試8</p></div></li><li><div><p>這是一個百葉窗效果,測試9</p><p>這是一個百葉窗效果,測試A</p></div></li></ul>
    window.onload = function () {
        var ul = document.getElementById('ul')
        var iNow = 0; //從第0個div - 第N個div,有層次變化,需要一個當前值;
        var timer = null;
        var onoff = true;//開關,一次真一次假
        toShow(ul)
        function toShow(obj) {
            var div = obj.getElementsByTagName('div')
            setInterval(function () {
                toChange();//有頻率的變化,層次效果
            }, 2000)
            function toChange() {
                timer = setInterval(function () { //第二個定時器,有層次效果
                    if (iNow == div.length) {  //需要判斷定時器何時結束,所以需要一個tiemr
                        clearInterval(timer);
                        iNow = 0;
                        onoff = !onoff;
                    }
                    else if (onoff) {
                        startMove(div[iNow], {top: 0}); //一次為0,一次為30,所以需要一個開關 onoff
                        iNow++;
                    }
                    else {
                        startMove(div[iNow], {top: -30});
                        iNow++;
                    }
                }, 100)
            }
        }
    }
*{ margin: 0; padding: 0;} li{list-style:none;} #ul{ width: 300px; height: auto;border-top:3px solid #333; margin: 20px auto;text-indent: 1em;} li{ width: 100%; height: 30px; overflow: hidden; position: relative; border-bottom:1px solid #2291AB;line-height: 30px;} li div{ position: absolute; top: -30px;} li div p{ height: 30px;}

運行

華為輪播圖

簡陋佈局

<div id="box">
    <ul>
        <li><img src="../img/hw-1.png" alt=""/></li>
        <li><img src="../img/hw-2.png" alt=""/></li>
        <li><img src="../img/hw-3.png" alt=""/></li>
    </ul>
    <div id="btn">
        <a href="javascript:;" class="active"></a>
        <a href="javascript:;"></a>
        <a href="javascript:;"></a>
    </div>
</div>

当可视区只有一张图片时,可使用该方法;当走完最后一张一个像素时;突然把第一张改为相对定位,放在最后面,即left值 = li.length * imgwidth; 当走完第一张时,再把相对定位取消,【重新放回第一位】:要点切换的视觉效果只是一个:最后一个到第一个之间;第一张图在static与relative之间切换;即在第一位与最后一位之间切换,视觉效果只为最后一张到第一张之间;

    window.onload = function () {
        var box = document.getElementById('box');
        var ul = box.getElementsByTagName('ul')[0];
        var li = ul.getElementsByTagName('li');
        var img = ul.getElementsByTagName('img');
        var btn = document.getElementById('btn');
        var a = btn.getElementsByTagName('a');
        var imgwidth = img[0].offsetWidth; //1920
        ul.style.width = imgwidth * img.length + 'px';

        toReSize();
        window.onresize = function () { //改變瀏覽器大小時
            toReSize();
        }
        function toReSize() {
            var vWidth = document.documentElement.clientWidth;//瀏覽器窗口大小
            if (vWidth > 1000) {    //可視區大小
                for (var i = 0; i < img.length; i++) {  //三個圖片都居中
                    img[i].style.left = -((imgwidth - vWidth) / 2 ) + 'px'
                } //圖片寬度 - 可寬區大小 的一半
            }
        }
        for (var i = 0; i < a.length; i++) {
            a[i].index = i//0,1,2
            a[i].onclick = function () {
                for (var i = 0; i < a.length; i++) { //清空全部
                    a[i].className = ''
                }
                this.className = 'active'//當前加
                startMove(ul, {left: -this.index * imgwidth})
            }
        }
        //自動播放 開定時器,找一個變量進行累加
        var iNow = 0;  //iNow 即可看作屬性,給定時器使用,同時也造成循環的條件 inow是循環按鈕的
        var iNow2 = 0;  // [最後到第一個的無縫切換]
        setInterval(toRun, 5000);
        function toRun() {
            if (iNow == a.length - 1) {
                //1、走到最後一個時,把第一個改成定位,即把第一個放在所有圖片後面  [最後到第一個的無縫切換]
                li[0].style.position = 'relative'
                li[0].style.left = li.length * imgwidth + 'px'
                iNow = 0;
            }
            else {
                iNow++   //需要判斷,不然3個後出錯
            }
            iNow2++ //再往後累加 [最後到第一個的無縫切換]
            for (var i = 0; i < a.length; i++) { //先還原按鈕
                a[i].className = ''
            }
            a[iNow].className = 'active';
            startMove(ul, {left: -iNow2 * imgwidth}, function () { //2、走完第一個時取消定位
                if (iNow == 0) {
                    li[0].style.position = 'static'
                    ul.style.left = 0; //拉回,還原之前的樣式
                    iNow2 = 0; //iNow2要循環不能一直累加。
                }
            }) // function (){} 鏈式操作 [最後到第一個的無縫切換]
        }
    }
*{margin:0;padding:0}#box{height:540px;position:relative;overflow:hidden}#box ul{position:absolute;left:0}#box ul li{list-style:none;float:left}#box ul li img{position:relative;left:0}#btn{position:absolute;width:100%;text-align:center;bottom:10px}#btn a{cursor:pointer;display:inline-block;width:11px;height:11px;background:#666;border-radius:50%}#btn .active{background:#fff}#btn a:hover{background:#fff}

運行

JS改進版:運行



JQ版,固定html,所謂帶點幼稚的封裝;

<div class="elmokSlide">
    <div class="hd">
        <ul></ul>
    </div>
    <div class="bd">
        <ul>
            <li><img src="http://elmok.com/img/mmb1.png" alt=""/></li>
            <li><img src="http://elmok.com/img/mmb2.png" alt=""/></li>
            <li><img src="http://elmok.com/img/mmb3.png" alt=""/></li>
        </ul>
    </div>
    <div class="pn">
        <a href="javascript:;"> < </a>
        <a href="javascript:;"> > </a>
    </div>
</div>

調用:

    var el = new Elmokslide('.elmokSlide')
    el.eslide({
        'hd': true, //底部點點點
        'lr': true, //左右方向
        'auto': true //自動播放
    })

JQ改進版:運行

韓雪輪播圖

原理

<div id='box'>1,2,3,4</div>
<input type="button" value="切換" id="input"/>
var box = document.getElementById('box')
var input = document.getElementById('input')
input.onclick = function(){
    var arr = box.innerHTML.split(','); //轉換為數組[1,2,3,4]
    arr.push(arr[0]) //第一項加到最後 [1,2,3,4,1]
    arr.shift() //刪除首項 [2,3,4,1]
    box.innerHTML = arr;
}

正式例子
簡陋佈局

<div id="div1">
    <a href="javascript:;" class="prev">←</a>
    <a href="javascript:;" class="next">→</a>
    <ul>
        <li class="pos_1"><img src="../img/h1.jpg" alt="" width="280"/></li>
        <li class="pos_2"><img src="../img/h2.jpg" alt="" width="380"/></li>
        <li class="pos_3"><img src="../img/h3.jpg" alt="" width="480"/></li>
        <li class="pos_4"><img src="../img/h4.jpg" alt="" width="580"/></li>
        <li class="pos_5"><img src="../img/h5.jpg" alt="" width="680"/></li>
        <li class="pos_6"><img src="../img/h6.jpg" alt="" width="580"/></li>
        <li class="pos_7"><img src="../img/h7.jpg" alt="" width="480"/></li>
        <li class="pos_8"><img src="../img/h8.jpg" alt="" width="380"/></li>
        <li class="pos_9"><img src="../img/h9.jpg" alt="" width="280"/></li>
        <li class="pos_10"><img src="../img/h10.jpg" alt="" width="180"/></li>
    </ul>
</div>
    window.onload = function () {
        var div = document.getElementById('div1')
        var li = div.getElementsByTagName('li')
        var a = div.getElementsByTagName('a')
        var arr = []; //放置需要改變的每張圖片的左寬透明度等;
        for (var i = 0; i < li.length; i++) {
            var img = li[i].getElementsByTagName('img')[0]
            arr.push([parseInt(getStyle(li[i], 'left')), parseInt(getStyle(li[i], 'top')), getStyle(li[i], 'opacity') * 100, getStyle(li[i], 'zIndex'), img.width])
        }
        a[0].onclick = function () {
            arr.push(arr[0]);//先把第一項放到後面  1,2,3,4,1
            arr.shift() //再刪除第一項   2,3,4,1
            for (var i = 0; i < li.length; i++) {
                var img = li[i].getElementsByTagName('img')[0]  //圖片需要重新獲取,不寫則錯亂
                li[i].style.zIndex = arr[i][3]  //更改透明度
                startMove(li[i], {left: arr[i][0], top: arr[i][1], opacity: arr[i][2]})  //加入運動函數
                startMove(img, {width: arr[i][4]})  //更改圖片寬度
            }
        }
        a[1].onclick = function () {
            arr.unshift(arr[arr.length - 1]);//最後一項放到第一位  4,1,2,3,4
            arr.pop() //再刪除最後一項   4,1,2,3
            for (var i = 0; i < li.length; i++) {
                var img = li[i].getElementsByTagName('img')[0]  //圖片需要重新獲取,不寫則錯亂
                li[i].style.zIndex = arr[i][3]  //更改透明度
                startMove(li[i], {left: arr[i][0], top: arr[i][1], opacity: arr[i][2]})  //加入運動函數
                startMove(img, {width: arr[i][4]})  //更改圖片寬度
            }
        }
    }
*{margin:0;padding:0}li{list-style:none;position:absolute;left:0;top:0;overflow:hidden}#div1{width:680px;margin:0 auto;position:relative;top:30px}.pos_1{opacity:.2;z-index:0;left:-200px}.pos_2{opacity:.4;z-index:0;left:-150px}.pos_3{opacity:.6;z-index:0;left:-100px}.pos_4{opacity:.8;z-index:0;left:-50px}.pos_5{opacity:1;z-index:5;left:0}.pos_6{opacity:.8;z-index:4;left:150px}.pos_7{opacity:.6;z-index:3;left:300px}.pos_8{opacity:.4;z-index:2;left:450px}.pos_9{opacity:.2;z-index:1;left:600px}.pos_10{opacity:0;z-index:0;left:750px}.next,.prev{display:inline-block;width:60px;height:40px;background-color:#E4E4E4;position:absolute;color:#373737;z-index:6;line-height:40px;font-size:40px;text-align:center;text-decoration:none;opacity:.8}.prev{left:0;top:190px}.next{right:0;top:190px}.next a:hover,.prev a:hover{opacity:1;color:#000}

運行

聯動下拉菜單

<div id="div1"></div>
    window.onload = function () {
        var s1 = new Sel('div1');
        s1.add('0',['中國','美國','日本'])
        s1.add('0_0',['深圳','廣州','北京'])
                 s1.add('0_0_0',['寶安','南山','福田'])
                 s1.add('0_0_1',['天河','越秀','海珠'])
                 s1.add('0_0_2',['西城','東誠','崇文'])
        s1.add('0_1',['波士顿','芝加哥','休斯敦'])
                s1.add('0_1_0',['子波士1','子波士2','子波士3'])
                s1.add('0_1_1',['子芝加1','子芝加2','子芝加3'])
                s1.add('0_1_2',['子休斯1','子休斯2','子休斯3'])
        s1.add('0_2',['東京','横滨','大阪'])
                s1.add('0_2_0',['子東京1','子東京2','子東京3'])
                s1.add('0_2_1',['子横滨1','子横滨2','子横滨3'])
                s1.add('0_2_2',['子大阪1','子大阪2','子大阪3'])
        s1.init(3);

    }
//寫構造函數
    function Sel(id) {
        this.oParent = document.getElementById(id);  //ID變成對象的屬性;
        this.data = {} //寫對象存函數 key = value
        this.aSel = this.oParent.getElementsByTagName('select'); //創建全局屬性,獲取所有select才能找到 獲得第一個select aSel[0]
    }
//寫原型
    Sel.prototype = {
//初始化
        init: function (num) {
            var This = this; //原型對像
            for (i = 1; i <= num; i++) {
                var oSel = document.createElement('select');
                var oPt = document.createElement('option');
                oPt.innerHTML = '默認';
                oSel.appendChild(oPt);
                oSel.index = i;
                this.oParent.appendChild(oSel)
                oSel.onchange = function () {
                    This.change(this.index) //this改變指向  this是下拉菜單,This對象
                }
            }
            this.first();
        },
        add: function (key, value) {
            this.data[key] = value;
        },
        first: function () {
            var arr = this.data['0'];//得到key 比如 s1.add('0',['中國','美國','日本'])  this.date['0'];得到['中國','美國','日本']
            for (var i = 0; i < arr.length; i++) {
                var oPt = document.createElement('option');
                oPt.innerHTML = arr[i] // ['中國','美國','日本']
                this.aSel[0].appendChild(oPt)
            }
        },
        //開始做第一個onchange下拉事件。
        change: function (iNow) { //iNow 當前下拉菜單的索引 0 1 2 3 
            var str = '0';
            for(var i = 0;i<iNow;i++){
                str += '_'+ (this.aSel[i].selectedIndex - 1);
                //s1.add('0',['中國','美國','日本']) 因為前面還有個默認,select裏一共有四個值,選擇1的索引值是1 但所對應的應該是 s1.add('0_0',['深圳','廣州','北京'])中的0_0,要開成這個形式必須 - 1
            }
            if( this.data[str] ){ //0_0 0_1 0_2
                var arr = this.data[str] //對應第二項數組['深圳','廣州','北京'] ['波士顿','芝加哥','休斯敦']['東京','横滨','大阪']
                this.aSel[iNow].options.length = 1; //只保留‘默認’這一項option
                for( var i = 0;i<arr.length;i++){
                    var oPt = document.createElement('option');
                    oPt.innerHTML = arr[i];
                    this.aSel[iNow].appendChild(oPt);
                }
                this.aSel[iNow].options[1].selected = true //選第一項時第二項自動變直接選中
                iNow++;  //遞歸,連動三個
                if(iNow < this.aSel.length){
                    this.change(iNow)
                }
            }
            else{//選擇默認時走else
                if(iNow < this.aSel.length)//小於下位菜單的長度;
                this.aSel[iNow].options.length = 1; //選擇默認時變回來
            }
        }
    }

運行