轮播图效果/旋转木马效果

效果图就这样

Image.png

代码注释写的很详细,仔细阅读代码就可以学会了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-2.1.4.min.js" type="text/javascript"></script>
  <!--  <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.js" type="text/javascript"></script>
    <script src="//cdn.bootcss.com/jquery/1.11.0/jquery.js"></script>-->
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        .poster-main{
            top: 100px;
            left: 100px;
            width: 800px;
            height: 600px;
            position: relative;
        }
        .poster-main .poster-list{
            width: 800px;
            height: 600px;
        }
        .poster-main .poster-list .poster-item{
            position: absolute;
            list-style-type: none;
            top: 0;
            left: 0;
        }
        .poster-main .poster-list .poster-item img{
            display: block;
            width: 100%;
            height: 100%;
            position: relative;
        }
        .poster-main .poster-list .poster-item a{
            display: block;
            width: 100%;
            height: 100%;
        }
        .poster-main .poster-btn{
            width: 100px;
            height: 600px;
            position: absolute;
            top: 0;
            background-color: red;
            z-index: 10;
            text-align: center;
            line-height: 600px;
            font-size: 80px;
            font-weight: 900;
            color: #555555;
            cursor: pointer;
            opacity: 0.2;
            -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
            filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
        }
        .poster-main .poster-pre-btn{
            left: 0;
        }
        .poster-main .poster-next-btn{
            right: 0;
        }

    </style>
</head>
<body>
    <div class="J_poster poster-main" data-setting='{
            "width":1000,
            "height":600,
            "postWidth":600,
            "postHeight":600,
            "scale":"0.8",
            "speed":500,
            "autoPlay":true,
            "delay":500,
            "verticalAlign":"top"
    }'><!--//json转换成字符串,一定要是正确json对象,属性上一定加上引号-->
        <div class="poster-btn poster-pre-btn" ><</div>
        <ul class="poster-list">
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
            <li class="poster-item"><a href=""></a></li>
        </ul>
        <div class="poster-btn poster-next-btn">></div>
    </div>
</body>
<script type="text/javascript">
    $(function(){
        //var carouse=new Carousel($(".J_poster").eq(0)) ;
        //如果有多个地方引用插件
        Carousel.init($(".J_poster"));

    });

    (function($){
        var Carousel=function(poster){ //实例化之后,方法中的this全部指向,实例化后的对象,进而引用位于原型上的方法
            var self=this;
            //保存单个旋转木马对象,防止对象被改变
            this.poster=poster;//保存在this上
            //找到轮播区的对象
            this.posterItemMain=this.poster.find("ul.poster-list");
            //保存切换按钮
            this.nextBtn=this.poster.find("div.poster-next-btn");
            this.prevBtn=this.poster.find("div.poster-pre-btn");
            //第一帧的图片
            this.posterItems=poster.find("li.poster-item");
            //当总图片个数为偶数张的时候,就复制一张,插入到容器中,为了保证下面postFirstItem postLastItem获取最新的数据,需紧接着posterItems来插入
            if(this.posterItems.size()%2==0){
                this.posterItemMain.append(this.posterItems.eq(0).clone());//把第一帧克隆一份,插入到容器中
                this.posterItems=this.posterItemMain.children();//通过父容器的子元素来更新最小帧数
            }

            this.postFirstItem=this.poster.find("li.poster-item").eq(0);
            this.postLastItem=this.poster.find("li.poster-item").last();

            /*定义旋转的标识,当为true时改变*/
            this.rotateFlag=true;

            this.timer=null;
            //默认配置参数
            this.setting={
                width:800,//幻灯片宽度
                height:600,//幻灯片高度
                postWidth:450,//最前面照片宽度
                postHeight:600,//最前面照片高度
                scale:'0.9',//图片缩放比例
                speed:500,//切换速度
                "autoPlay":true,
                "delay":500,
                verticalAlign:"middle"//广告位置
            };
            $.extend(this.setting,this.getSetting());//取得html中data-setting并扩展到this.setting上
            this.setSettingValue();
            this.setPosterPosition();
            this.nextBtn.click(function(){
                if(self.rotateFlag){
                    self.rotateFlag=false;
                    self.carouseRotate("right");
                }
            });
            this.prevBtn.click(function(){
                if(self.rotateFlag){
                    self.rotateFlag=false;
                    self.carouseRotate("left");
                }
            });
            //是否开启自动播放
            this.autoPlay();
        };


        Carousel.init=function(posters){
            var _self=this;//这个this指向的调用上下文,指的是Carousel
            posters.each(function(){
               new _self( $(this));//这个this指向的是当前的一个poster,遍历后的poster,当前上下文
            });
        };//创建类中初始化的方法,在此类中用来处理在页面中所有传进来的集合


        Carousel.prototype={//插件
            //设置配置参数值,来控制基本高度 宽度
            setSettingValue:function(){
                this.poster.css({
                    width:this.setting.width,
                    height:this.setting.height
                });
                this.posterItemMain.css({
                    width:this.setting.width,
                    height:this.setting.height
                });
                //计算切换按钮宽度
                var w=(this.setting.width-this.setting.postWidth)/2;
                var h=this.setting.postHeight;
                this.prevBtn.css({
                    width:w,
                    height:h,
                    zIndex:Math.ceil(this.posterItems.size()/2)  //通过设置按钮的index来保证永远在前面,永远大于一半的图片个数 向上取整 zIndex不能有- 并且大写
                });
                this.nextBtn.css({
                    width:w,
                    height:h,
                    zIndex:Math.ceil(this.posterItems.size()/2)
                });
                //设置第一帧位置
                this.postFirstItem.css({
                    left:w,
                    width:this.setting.postWidth,
                    height:this.setting.postHeight,
                    zIndex:Math.floor(this.posterItems.size()/2)  //向下取整 照片不予按钮冲突
                });

            },
            //设置剩余广告位置
            setPosterPosition:function(){
                var self=this;
                var sliceItem=this.posterItems.slice(1);//除去第一帧的
                var sliceSize=sliceItem.size()/2;
                var rightSlice=sliceItem.slice(0,sliceSize);//右侧的帧数
                var level=Math.floor(this.posterItems.size()/2);//层级关系 z-index

                var leftSlice=sliceItem.slice(sliceSize);//左侧帧数

                var rw=this.setting.postWidth;
                var rh=this.setting.postHeight;
                var gap=((this.setting.width-this.setting.postWidth)/2)/level;
                var firsLeft=((this.setting.width-this.setting.postWidth)/2);
                var offsetLeft=firsLeft+rw;//第一帧图片最右侧的left值
                //设置右侧的css样式
                rightSlice.each(function(i){
                    level--;
                    rw=rw*self.setting.scale; //每一次都乘以系数
                    rh=rh*self.setting.scale; //每一次都乘以系数
                    $(this).css({
                        zIndex:level, //来设置当前对象的层级关系
                        width:rw,
                        height:rh,
                        opacity:1/(++i),
                        left:offsetLeft+(i++)*gap-rw,
                        top:self.setVertualAlign(rh)
                    })
                });
                //设置左侧CSS样式
                var lw =rightSlice.last().width(); //通过对称取得宽度
                var lh=rightSlice.last().height(); //通过对称取得高度
                var oloop=Math.floor(this.posterItems.size()/2);//左侧的层级关系 z-index
                leftSlice.each(function(i){
                    $(this).css({
                        zIndex:i, //来设置当前对象的层级关系
                        width:lw,
                        height:lh,
                        opacity:1/(oloop),
                        left:gap*(i++),
                        top:self.setVertualAlign(lh)
                    });
                    //把参数变化放在后面,先让参数执行一次
                    lw=lw/self.setting.scale;
                    lh=lh/self.setting.scale;
                    oloop--;
                });
            },
            //设置垂直对其
            setVertualAlign:function(height){
                var self=this;
                var vertualType=self.setting.verticalAlign;
                var top=0;
                /*if(vertualType==="middle"){
                     top=(self.setting.height-height)/2
                }else if(vertualType==="top"){
                     top=0;
                }else if(vertualType==="bottom"){
                     top=self.setting.height-height;
                } else{
                    top=(self.setting.height-height)/2
                }*/
                switch (vertualType){
                    case "middle":return  top=(self.setting.height-height)/2; break;
                    case "top":return top=0; break;
                    case "bottom" :return top=self.setting.height-height;break;
                }
            },
            /*旋转函数*/
            carouseRotate:function(dir){
                var _this_=this;//这个this保存对Carousel的引用
                var zIndexArryLeft=[];//为zIndex保存一个数组,来存储在遍历对象过程中存储的数组
                var zIndexArryRight=[];//为zIndex保存一个数组,来存储在遍历对象过程中存储的数组
                if(dir==="left"){//当前点击的这一帧的参数变成前一帧的参数
                    this.posterItems.each(function(){//遍历每一个对象
                        var self=$(this);//当前的jquery对象,保存起来
                        var prev=self.prev().get(0)?self.prev():_this_.postLastItem; //获取向左旋转过程中下一个对象
                        var width=prev.width(); //获取下一个对象的参数
                        var height=prev.height();//获取下一个对象的参数
                        var zIndex=prev.css("zIndex");//获取下一个对象的参数
                        var opacity=prev.css("opacity");//获取下一个对象的参数
                        var left=prev.css("left");//获取下一个对象的参数
                        var top=prev.css("top");//获取下一个对象的参数
                        zIndexArryLeft.push(zIndex);
                        /*设置当前对象动画过渡过程*/
                        self.animate({
                            width:width,
                            height:height,
                            //zIndex:zIndex,
                            opacity:opacity,
                            left:left,
                            top:top
                        },_this_.setting.speed,function(){
                            //当动画运动结束的的时候,更改动画标识符
                            _this_.rotateFlag=true;
                        });
                    });
                    this.posterItems.each(function(i){
                        $(this).css("zIndex",zIndexArryLeft[i]);
                    });

                }else if(dir==="right"){//当前点击的这一帧的参数变成后一帧的参数
                    this.posterItems.each(function(){//遍历每一个对象
                        var self=$(this);//当前的jquery对象,保存起来
                        var next=self.next().get(0)?self.next():_this_.postFirstItem; //获取向左旋转过程中下一个对象
                        var width=next.width(); //获取下一个对象的参数
                        var height=next.height();//获取下一个对象的参数
                        var zIndex=next.css("zIndex");//获取下一个对象的参数
                        var opacity=next.css("opacity");//获取下一个对象的参数
                        var left=next.css("left");//获取下一个对象的参数
                        var top=next.css("top");//获取下一个对象的参数
                        zIndexArryRight.push(zIndex);
                        /*设置当前对象动画过渡过程*/
                        self.animate({
                            width:width,
                            height:height,
                            //zIndex:zIndex,
                            opacity:opacity,
                            left:left,
                            top:top
                        },_this_.setting.speed,function(){
                            //当动画运动结束的的时候,更改动画标识符
                            _this_.rotateFlag=true;
                        });
                    })
                }
                this.posterItems.each(function(i){
                    $(this).css("zIndex",zIndexArryRight[i]);
                });
            },
            /*自动执行函数*/
            autoPlay:function(){
                var self=this;//保存对Carousel引用
                self.timer=setInterval(function(){
                    self.nextBtn.click();
                },self.setting.delay);
                /*this.posterItems.mouseover(function(){
                    clearInterval(self.timer);
                });
                this.posterItems.mouseout(function(){
                    clearInterval(self.timer);//防止效果叠加,需离开的时候在清除一次
                    self.autoPlay();
                })*/

                this.posterItems.hover(function(){ //当鼠标位于图片上
                    clearInterval(self.timer);
                },function(){
                    clearInterval(self.timer);//防止效果叠加,需离开的时候在清除一次
                    self.autoPlay();
                });
                this.nextBtn.hover(function(){//当鼠标位于按钮上
                    clearInterval(self.timer);
                },function(){
                    clearInterval(self.timer);//防止效果叠加,需离开的时候在清除一次
                    self.autoPlay();
                });
                this.prevBtn.hover(function(){//当鼠标位于按钮上
                    clearInterval(self.timer);
                },function(){
                    clearInterval(self.timer);//防止效果叠加,需离开的时候在清除一次
                    self.autoPlay();
                });

            },



            //获取人工配置参数
            getSetting:function(){
                var setting=this.poster.attr("data-setting");
                if(setting&&setting!=""){
                    return $.parseJSON(setting);
                }else{
                    return {};
                }
            },

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,397评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 在日常生活中,我们都会遇到一些欢乐的事情,使我们开心。 如果你想让自己开心,那就去帮助需要帮助的人...
    流浪书者阅读 232评论 0 3
  • 冬午日暖,前往清凉寺与僧人小坐。 读佛教杂志《如是雨林》,登时不愿释手。与师父索价,师父说:不收钱,拿去。上香...
    清灵灵子阅读 703评论 16 3
  • 有人说:你的容颜和人生,都显现在你读的书里。起初,我不以为然,
    安言靜语阅读 205评论 0 1