14_JS轮播图案例

仿网易轮播图

  • 初始状态,第一张图片在盒子中间,其他图片在右边imgs[i].style.left = 盒子宽度+"px";
  • 图片在盒子左边:img.style.left = - 盒子宽度+"px",图片在盒子中间:img.style.left = 0;,图片在盒子右边:img.style.left = 盒子宽度+"px";
  • 当点击下一张按钮,当前盒子中间图片的缓慢移动(带动画)到盒子左边,下一张图片快速移动(不带动画)到盒子右边,然后再让这下一张图片缓慢移动(带动画)到盒子中间。
  • 当点击上一张按钮,当前盒子中间图片的缓慢移动(带动画)到盒子右边,下一张图片快速移动(不带动画)到盒子左边,然后再让这下一张图片缓慢移动(带动画)到盒子中间。

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" type="text/css" href="css/basic.css"/>
    <script type="text/javascript" src="js/animate.js"></script>
    <script type="text/javascript" src="js/slider.js"></script>
</head>
<body>
    <div class="w-slider" id="js_slider">
        <div class="slider">
            <div class="slider-main" id="slider_main_block">
                <div class="slider-main-img"><a href="#">![](images/1.jpg)</a></div>
                <div class="slider-main-img"><a href="#">![](images/2.jpg)</a></div>
                <div class="slider-main-img"><a href="#">![](images/3.jpg)</a></div>
                <div class="slider-main-img"><a href="#">![](images/4.jpg)</a></div>
                <div class="slider-main-img"><a href="#">![](images/5.jpg)</a></div>
                <div class="slider-main-img"><a href="#">![](images/6.jpg)</a></div>
            </div>
        </div>
        <div class="slider-ctrl" id="slider_ctrl">
            <span class="slider-ctrl-prev"></span>
            <span class="slider-ctrl-next"></span>
        </div>
    </div>
</body>
</html>

css/basic.css

@charset "UTF-8";
*{
    margin: 0;
    padding: 0;
}
img{
    display: block;
}
.w-slider{
    width: 310px;
    height: 265px;
    margin: 100px auto;
    background-color: pink;
    position: relative;
    overflow: hidden;
}
.slider{
    width: 310px;
    height: 220px;
    /*background-color: purple;*/

}
.slider-main{
    width: 200%;
    height: 100%;
    /*background: purple;*/

}
.slider-main-img{
    position: absolute;
    left: 0;
    top: 0;
}
.slider-ctrl{
    text-align: center;
    padding-top: 5px;
}
.slider-ctrl-con{
    display: inline-block;
    width: 24px;
    height: 20px;
    background: url("../images/icon.png") no-repeat -24px -782px;
    margin: 0 5px;
    cursor: pointer;
    text-indent: -99em;
    overflow: hidden;
}
.current{
    background-position: -24px -762px;
}
.slider-ctrl-prev,
.slider-ctrl-next{
    position: absolute;
    top: 50%;
    width: 30px;
    height: 35px;
    /*background-color: blue;*/
    margin-top: -42px;
    background: url("../images/icon.png") no-repeat;
    cursor: pointer;
}
.slider-ctrl-prev{
    left: 0;
    background-position: 6px 0;
}
.slider-ctrl-next{
    right: 0;
    background-position: -6px -45px;
}

js/animate.js

/**
 * Created by huhch on 2017/6/13.
 */
function getStyle(obj,attr){
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }else{
        return window.getComputedStyle(obj,null)[attr];
    }
}
function $(id){return document.getElementById(id);}
function animate(obj , json,fn){
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        /*
         关闭定时器的思路,不用判断多个属性都到达target,
         只要判断有一个属性未到target,定时器就不能停止
         */
        //用户判断是否可以关闭定时器
        var flag  = true;
        //开始遍历
        for(var attr in json){
            //当前位置
            var current;
            if(attr == "opacity"){
                if("opacity" in obj.style){
                    current = parseInt(getStyle(obj,attr)*100);
                }else{//IE6、7、8
                    var alphaStr = getStyle(obj,"filter");
                    var cs = alphaStr.substring(alphaStr.lastIndexOf("=")+1 , alphaStr.lastIndexOf(")"));
                    current = isNaN(parseInt(cs))?100:parseInt(cs);
                }

            }else{
                current = parseInt(getStyle(obj,attr));
            }

            //计算步长
            //target = json[attr]
            var step = (json[attr] - current)/10;
            step = step>0?Math.ceil(step):Math.floor(step);
            if(attr == "opacity"){//判断用户是否要修改opacity属性
                if("opacity" in obj.style){//判断浏览器是否支持opacity属性
                    obj.style.opacity = (current+step)/100;
                }else{
                    obj.style.filter = "alpha(opacity="+(current+step)+")";
                }
            }else if(attr == "zIndex")
            {
                obj.style.zIndex = json[attr];
            }else{
                obj.style[attr] = current+step+"px";
            }
            if(current != json[attr]){
                flag = false;
            }
        }
        if(flag){//如果flag=true,说明多个属性都=target了
            clearInterval(obj.timer);
            //alert("动画完成");
            if(fn) fn();
        }

    },20);
}

js/slider.js

/**
 * Created by huhch on 2017/6/13.
 */
window.onload = function () {
    var slider = $("js_slider");//最大的盒子
    var slider_main = $("slider_main_block");//存放图片的盒子

    var imgs = slider_main.children;//所有的图片

    var slider_ctrl = $("slider_ctrl");//控制的盒子
    //生成序列的span
    for(var i = 0; i<imgs.length; i++){
        var span = document.createElement("span");
        span.className = "slider-ctrl-con";
        span.innerHTML = imgs.length-i;
        //console.log(slider_ctrl.children.length);
        slider_ctrl.insertBefore(span,slider_ctrl.children[1]);
    }

    var spans = slider_ctrl.children;//得到所有的span
    spans[1].setAttribute("class","slider-ctrl-con current");

    //得到大盒子的宽度,也就是后面动画走的距离
    var scrollWidth = imgs[0].clientWidth;

    //第一张图片在盒子中,其他图片右移一个盒子宽度
    for(var i = 1; i<imgs.length; i++){
        imgs[i].style.left = scrollWidth+"px";
    }
    var iNow = 0;
    for(var k in spans){
        spans[k].onclick = function () {
            if(this.className == "slider-ctrl-prev"){
                //左侧
                animate(imgs[iNow],{left:scrollWidth});
                //iNow--;
                //if(iNow<0){
                //    iNow = imgs.length-1;
                //}
                //iNow = --iNow<0?imgs.length-1:iNow;//这一句等同于上面注释的四行代码
                --iNow<0?iNow=imgs.length-1:iNow;//等同于上面
                imgs[iNow].style.left = -scrollWidth+"px";
                animate(imgs[iNow],{left:0});
                setSquece();
            }else if(this.className == "slider-ctrl-next"){
                /*
                //当我们点击的时候,下一张图片快速(不带动画)移动到盒子右边,然后当前图片动画的向左移动盒子距离,下一张图片动画的移动到盒子中间
                //右侧
                animate(imgs[iNow],{left:-scrollWidth});
                //iNow++;
                //if(iNow>imgs.length-1){
                //    iNow = 0;
                //}
                iNow = (++iNow>imgs.length-1)?0:iNow;//这一句等同于上面注释的四行代码
                imgs[iNow].style.left = scrollWidth+"px";
                animate(imgs[iNow],{left:0});
                setSquece();
                */
                autoPlay();
            }else{
                //点击下方的按钮
                var that = this.innerHTML -1;
                if(that>iNow){
                    imgs[that].style.left = scrollWidth+"px";
                    animate(imgs[iNow],{left:-scrollWidth});
                }else if(that<iNow){
                    imgs[that].style.left = -scrollWidth+"px";
                    animate(imgs[iNow],{left:scrollWidth});
                }
                iNow = that;
                animate(imgs[iNow],{left:0});
                setSquece();
            }
        }
    }

    //设置序列号
    function setSquece(){
        for(var i=1;i<spans.length-1 ;i++){//第一个和最后一个是上一张和下一张按钮
            spans[i].className = "slider-ctrl-con";
        }
        spans[iNow+1].className = "slider-ctrl-con current";
    }
    //定时器开始轮播
    var timer = null;
    timer = setInterval(autoPlay,3000);
    function autoPlay(){
        animate(imgs[iNow],{left:-scrollWidth});
        iNow = (++iNow>imgs.length-1)?0:iNow;
        imgs[iNow].style.left = scrollWidth+"px";
        animate(imgs[iNow],{left:0});
        setSquece();
    }
    slider.onmouseout = function () {
        clearInterval(timer);
        timer = setInterval(autoPlay,3000);
    }
    slider.onmouseover = function () {
        clearInterval(timer);
    }
}

images下有1~6.jpgicon.png

例:旋转木马
index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>旋转木马</title>
    <link rel="stylesheet" type="text/css" href="css/basic.css"/>
    <script type="text/javascript" src="js/animate.js"></script>
    <script type="text/javascript">
        //  存储了每个图片的信息
        var json = [
            {   //  1
                width:200,
                top:0,
                left:500,
                opacity:10,
                z:2
            },
            {   //  2
                width:400,
                top:20,
                left:180,
                opacity:30,
                z:3
            },
            {   //  3
                width:450,
                top:40,
                left:100,
                opacity:50,
                z:4
            },
            {   //  4
                width:500,
                top:60,
                left:0,
                opacity:70,
                z:5
            },
            {   // 3
                width:800,
                top:100,
                left:200,
                opacity:100,
                z:6
            },{   //  4
                width:500,
                top:60,
                left:700,
                opacity:70,
                z:5
            },
            {   //  3
                width:450,
                top:40,
                left:650,
                opacity:50,
                z:4
            },
            {   //  2
                width:400,
                top:20,
                left:620,
                opacity:30,
                z:3
            }
        ];

        window.onload = function () {
            var slider = document.getElementById("slider");

            var lis = slider.children[0].children;
            var arrow = document.getElementById("arrow");
            var as = arrow.getElementsByTagName("a");
            slider.onmouseover = function () {
                animate(arrow,{opacity:100});
            };
            slider.onmouseout = function () {
                animate(arrow,{opacity:0});
            };
//            函数节流
            var jieliu = true;
            as[0].onclick = function () {
                if(jieliu == false){
                    change(false);
                    jieliu = true
                }

            };
            as[1].onclick = function () {
                if(jieliu == false){
                    change(true);
                    jieliu = true
                }
            }
            change();
            function change(flag){
                //next按钮
                if(flag){
                    //json数组第一个移出,放入最后一个
                    json.push(json.shift());
                }else{
                    //json数组最后一个移出,放入第一个
                    json.unshift(json.pop());
                }
                for(var i=0;i<lis.length;i++){
                    animate(lis[i],{
                        width:json[i].width,
                        top:json[i].top,
                        left:json[i].left,
                        opacity:json[i].opacity,
                        zIndex:json[i].z
                    }, function () {
                        jieliu = false;
                    });
                }
            }

        }
    </script>
</head>
<body>
    <div class="wrap">
        <div class="slider" id="slider">
            <ul>
                <li><a href="#">![](images/slidepic1.jpg)</a></li>
                <li><a href="#">![](images/slidepic2.jpg)</a></li>
                <li><a href="#">![](images/slidepic3.jpg)</a></li>
                <li><a href="#">![](images/slidepic4.jpg)</a></li>
                <li><a href="#">![](images/slidepic5.jpg)</a></li>
                <li><a href="#">![](images/slidepic6.jpg)</a></li>
                <li><a href="#">![](images/slidepic7.jpg)</a></li>
                <li><a href="#">![](images/slidepic8.jpg)</a></li>
            </ul>
            <div class="arrow" id="arrow">
                <a href="javascript:;" class="prev"></a>
                <a href="javascript:;" class="next"></a>
            </div>
        </div>
    </div>
</body>
</html>

css/basic.css

*{
    padding: 0;
    margin: 0;
}
ul,li{
    list-style: none;
}
.wrap{
    width: 1200px;
    margin: 0 auto;
}
.slider{
    width: 100%;
    height: 600px;
    position: relative;
    /*background-color: #ccc;*/
}
.slider li{
    position: absolute;
    left: 0;
    top: 0;
    /*width: 200px;*/
}
.slider img{
    width: 100%;
}
.arrow{
    position: absolute;
    width: 100%;
    opacity: 0;
    z-index: 100;
    left: 0;
    top: 40%;
}
.prev ,
.next{
    position: absolute;
    width: 76px;
    height: 112px;
    top: 0;
    z-index: 99;
}
.prev{
    left: 0;
    background: url(../images/prev.png) no-repeat;
}
.next{
    right: 0;
    background: url(../images/next.png) no-repeat;
}

js/animate.js

/**
 * Created by huhch on 2017/6/13.
 */
function getStyle(obj,attr){
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }else{
        return window.getComputedStyle(obj,null)[attr];
    }
}
function $(id){return document.getElementById(id);}
function animate(obj , json,fn){
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        /*
         关闭定时器的思路,不用判断多个属性都到达target,
         只要判断有一个属性未到target,定时器就不能停止
         */
        //用户判断是否可以关闭定时器
        var flag  = true;
        //开始遍历
        for(var attr in json){
            //当前位置
            var current;
            if(attr == "opacity"){
                if("opacity" in obj.style){
                    current = parseInt(getStyle(obj,attr)*100);
                }else{//IE6、7、8
                    var alphaStr = getStyle(obj,"filter");
                    var cs = alphaStr.substring(alphaStr.lastIndexOf("=")+1 , alphaStr.lastIndexOf(")"));
                    current = isNaN(parseInt(cs))?100:parseInt(cs);
                }

            } else{
                current = parseInt(getStyle(obj,attr));
            }

            //计算步长
            //target = json[attr]
            var step = (json[attr] - current)/10;
            step = step>0?Math.ceil(step):Math.floor(step);
            if(attr == "opacity"){//判断用户是否要修改opacity属性
                if("opacity" in obj.style){//判断浏览器是否支持opacity属性
                    obj.style.opacity = (current+step)/100;
                }else{
                    obj.style.filter = "alpha(opacity="+(current+step)+")";
                }
            }else if(attr == "zIndex")
            {
                obj.style.zIndex = json[attr];
            }else{
                obj.style[attr] = current+step+"px";
            }
            if(current != json[attr]){
                flag = false;
            }
        }
        if(flag){//如果flag=true,说明多个属性都=target了
            clearInterval(obj.timer);
            //alert("动画完成");
            if(fn) fn();
        }

    },20);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,744评论 1 92
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,738评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,307评论 0 11
  • 进入前端将近一年了,js还是很弱,突发奇想写一个轮播图,就找到了这个博主的材料,和大家分享。 轮播图的原理: 一系...
    FRRRR阅读 3,657评论 0 11
  • CSS字体 字体系列(font-family) font-family 属性应该设置几个字体名称作为一种"后备"机...
    yohn阅读 463评论 0 0