JQuery——banner旋转木马效果

博主在浏览网页时无意间发现了一种banner图的轮播方式——像旋转木马一样的轮播方式,博主感觉非常新颖独特,经过查阅资料,观看某课网教程总算搞了出来的,其原理主要利用了JQuery代码实现,好了不多说,看楼下代码及演示效果吧

首先是HTML及CSS代码

HTML

<div class="pictureSlider poster-main" data-setting=‘{"width":1000,"height":270,"posterWidth":640,"posterHeight":270,"scale":0.8,"autoPlay":true,"delay":2000,"speed":300}‘>
    <div class="poster-btn poster-prev-btn"></div>
    <ul class="poster-list">
        <li class="poster-item"><a href="http://www.16sucai.com"><img src="images/01.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/02.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/03.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/04.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/05.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/06.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/07.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/08.jpg" width="100%" height="100%"></a></li>
        <li class="poster-item"><a href="#"><img src="images/09.jpg" width="100%" height="100%"></a></li>
    </ul>
    <div class="poster-btn poster-next-btn"></div>
</div>

CSS代码

*{margin:0;padding:0;list-style: none;border:0;}
.container { margin:150px auto; max-width:1000px;}
.poster-main{ position:relative;width:800px;height:270px;}
.poster-main a,.poster-main img{display:block;}
.poster-main .poster-list{width:800px;height:270px;}
.poster-main .poster-list .poster-item{ position:absolute;left:0;top:0;}
.poster-main .poster-btn{ position:absolute;top:0;width:100px;height:270px; z-index:10; cursor:pointer;  opacity:0.8}
.poster-main .poster-prev-btn{left:0; background: url(../images/btn_l.png) no-repeat center center;}
.poster-main .poster-next-btn{right:0; background: url(../images/btn_r.png) no-repeat center center;}

然后是JS代码

;(function($){

    var Carousel = function(poster){
        var self = this;
        //保存单个旋转木马对象
        this.poster = poster;
        this.posterItemMain = poster.find("ul.poster-list");
        this.nextBtn = poster.find("div.poster-next-btn");
        this.prevBtn = poster.find("div.poster-prev-btn");
        this.posterItems = poster.find("li.poster-item");
        if( this.posterItems.size()%2 == 0 ){
            this.posterItemMain.append( this.posterItems.eq(0).clone() );
            this.posterItems = this.posterItemMain.children();
        };
        this.posterFirstItem = this.posterItems.first();
        this.posterLastItem = this.posterItems.last();
        this.rotateFlag = true;
        //默认配置参数
        this.setting = {
            "width" : 1000,            //幻灯片的宽度
            "height" : 270,            //幻灯片的高度
            "posterWidth" : 640,    //幻灯片第一帧的宽度
            "posterHeight" : 270,    //幻灯片第一帧的高度
            "scale" : 0.9,            //记录显示比例关系
            "speed" : 500,
            "autoPlay" : false,
            "delay" : 5000,
            "verticalAlign" : "middle" //top bottom
        };
        $.extend( this.setting,this.getSetting() );

        //设置配置参数值
        this.setSettingValue();
        //初始化幻灯片位置
        this.setPosterPos();
        //左旋转按钮
        this.nextBtn.click(function(){
            if(self.rotateFlag){
                self.rotateFlag = false;
                self.carouseRotate("left");
            };
        });
        //右旋转按钮
        this.prevBtn.click(function(){
            if(self.rotateFlag){
                self.rotateFlag = false;
                self.carouseRotate("right");
            };
        });
        //是否开启自动播放
        if(this.setting.autoPlay){
            this.autoPlay();
            this.poster.hover( function(){
                //self.timer是setInterval的种子
                window.clearInterval(self.timer);
            }, function(){
                self.autoPlay();
            });
        };
    };
    Carousel.prototype = {
        autoPlay:function(){
            var self = this;
            this.timer = window.setInterval( function(){
                self.nextBtn.click();
            }, this.setting.delay );
        },

        //旋转
        carouseRotate:function(dir){
            var _this_  = this;
            var zIndexArr = [];
            //左旋转
            if(dir === "left"){
                this.posterItems.each(function(){
                    var self = $(this),
                        prev = self.prev().get(0)?self.prev():_this_.posterLastItem,
                        width = prev.width(),
                        height =prev.height(),
                        opacity = prev.css("opacity"),
                        left = prev.css("left"),
                        top = prev.css("top"),
                        zIndex = prev.css("zIndex");

                    zIndexArr.push(zIndex);
                    self.animate({
                        width :width,
                        height :height,
                      //zIndex :zIndex,
                        opacity :opacity,
                        left :left,
                        top :top
                    },_this_.setting.speed,function(){
                        _this_.rotateFlag = true;
                    });
                });
                //zIndex需要单独保存再设置,防止循环时候设置再取的时候值永远是最后一个的zindex
                this.posterItems.each(function(i){
                    $(this).css("zIndex",zIndexArr[i]);
                });
            }else if(dir === "right"){//右旋转
                this.posterItems .each(function(){
                    var self = $(this),
                        next = self.next().get(0)?self.next():_this_.posterFirstItem,
                        width = next.width(),
                        height =next.height(),
                        opacity = next.css("opacity"),
                        left = next.css("left"),
                        top = next.css("top"),
                        zIndex = next.css("zIndex");

                    zIndexArr.push(zIndex);
                    self.animate({
                        width :width,
                        height :height,
                      //zIndex :zIndex,
                        opacity :opacity,
                        left :left,
                        top :top
                    },_this_.setting.speed,function(){
                        _this_.rotateFlag = true;
                    });
                });
                //zIndex需要单独保存再设置,防止循环时候设置再取的时候值永远是最后一个的zindex
                this.posterItems.each(function(i){
                    $(this).css("zIndex",zIndexArr[i]);
                });
            };
        },
        //设置剩余的帧的位置关系
        setPosterPos:function(){
            var self = this,
                sliceItems = this.posterItems.slice(1),
                sliceSize = sliceItems.size()/2,
                rightSlice = sliceItems.slice(0,sliceSize),
                //存在图片奇偶数问题
                level = Math.floor(this.posterItems.size()/2),
                leftSlice = sliceItems.slice(sliceSize);

            //设置右边帧的位置关系和宽度高度top
            var firstLeft = (this.setting.width - this.setting.posterWidth)/2;
            var rw = this.setting.posterWidth,
                fixOffsetLeft = firstLeft + rw,
                rh = this.setting.posterHeight,
                gap = ((this.setting.width - this.setting.posterWidth)/2)/level;

            //设置右边位置关系
            rightSlice.each(function(i){
                level--;
                rw = rw * self.setting.scale;
                rh = rh * self.setting.scale;
                var j = i;
                $(this).css({
                    zIndex :level,
                    width :rw,
                    height :rh,
                    opacity :1/(++j),
                    left :fixOffsetLeft+(++i)*gap - rw,
                    top :self.setVerticalAlign(rh)
                });
            });

            //设置左边的位置关系
            var lw = rightSlice.last().width(),
                lh  =rightSlice.last().height(),
                oloop = Math.floor(this.posterItems.size()/2);
            leftSlice.each(function(i){
                $(this).css({
                    zIndex:i,
                    width:lw,
                    height:lh,
                    opacity:1/oloop,
                    left:i*gap,
                    top:self.setVerticalAlign(lh)
                });
                lw = lw/self.setting.scale;
                lh = lh/self.setting.scale;
                oloop--;
            });
        },

        //设置垂直排列对齐
        setVerticalAlign:function(height){
            var verticalType  = this.setting.verticalAlign,
                top = 0;
            if(verticalType === "middle"){
                top = (this.setting.height-height)/2;
            }else if(verticalType === "top"){
                top = 0;
            }else if(verticalType === "bottom"){
                top = this.setting.height-height;
            }else{
                top = (this.setting.height-height)/2;
            };
            return top;
        },

        //设置配置参数值去控制基本的宽度高度
        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.posterWidth)/2;
            //设置切换按钮的宽高,层级关系
            this.nextBtn.css({
                width:w,
                height:this.setting.height,
                zIndex:Math.ceil(this.posterItems.size()/2)
            });
            this.prevBtn.css({
                width:w,
                height:this.setting.height,
                zIndex:Math.ceil(this.posterItems.size()/2)
            });
            this.posterFirstItem.css({
                width:this.setting.posterWidth,
                height:this.setting.posterHeight,
                left:w,
                top:0,
                zIndex:Math.floor(this.posterItems.size()/2)
            });
        },

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

    Carousel.init = function(posters){
        var _this_ = this;
        posters.each(function(){
            // console.log("halo Louis;")
            new  _this_($(this));
        });
    };

    //挂载到window下
    window.Carousel = Carousel;

})(jQuery);

运行可知其效果如下

时间: 2024-10-08 10:08:41

JQuery——banner旋转木马效果的相关文章

【前端】javascript+jQuery实现旋转木马效果轮播图slider

实现效果: 实现原理: 技术栈: javascript+jQuery+html+css 实现步骤: // 0. 获取元素 // 1. 鼠标放置到轮播图上,显示两侧的控制按钮,移开后隐藏 // 2. 为两侧控制按钮绑定事件(调用同一个方法,只有一个参数,true为正向旋转,false为反向旋转) 实现代码: <!DOCTYPE html> <html> <head> <title>旋转木马效果轮播图</title> <meta charset

jQuery仿3D旋转木马效果插件(带索引按钮)

项目中需要用到旋转木马效果,但是我在网上找的插件,基本都是不带按钮或者只是带前后按钮的,而项目要求的是带索引按钮,也就是说有3张图片轮播,对应的要有3个小按钮,点击按钮,对应的图片位于中间位置.于是就在jQuery的一款插件jquery.carousel.js的基础上进行了一些改进,不足的是,固定就是3张图片. 代码: html <!doctype html> <html lang="zh"> <head> <meta charset=&quo

仿jQuery的siblings效果的js原生代码

仿jQuery的siblings效果的js原生代码 <previousSibling> 属性返回选定节点的上一个同级节点(在相同树层级中的前一个节点). <nextSibling> 属性返回被选节点的下一个同级节点(在相同树层级中的下一个节点). 如果不存在这样的节点,则该属性返回 null.//元素节点的节点类型是 1  obj.previousSibling.nodeType ==1; reverse() 方法用于颠倒数组中元素的顺序. push() 方法可向数组的末尾添加一个

基于jquery多种切换效果的焦点图(兼容ie6)

随着html5和css3的诞生.各种非常酷.非常炫的网页焦点图在各个前端技术网上满天飞.基于html5和css3技术的焦点图有一个弊端就是要在ie9以上才支持.这让需兼容ie6到ie8的页面又爱又恨.下面为大家介绍一款完全基于juery的焦点图,而且这款插件完美支持ie6,多种百叶窗切换,效果还是相当赏目的.无图无真相,还是先上图 点击这里在线预览 点击这里下载源码 使用教程 这款插件代码很简洁,使用也非常简单.看截图 ok.今天就和大家分享到这里.周末好快,作为一名码农真是苦逼,明天还要早起,

jQuery之动画效果show()......animate()

jQuery之动画效果 1.show()显示效果 语法:show(speed,callback) Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slow","normal","fast" callback可选,为当动画完成时执行的函数.   show(speed,[easing],callback) Number/String easing默认是swing,可选linear; $("#div1&qu

jquery的动画效果

序言:昨天复习了jQuery的一些事件,今天我打算继续来复习jQuery的动画效果. 用于写一些网页特效:渐变菜单,渐变显示,图片轮播等. 首先当然得引入插件:<script src="jquery/jquery-1.11.1.js"></script> 1.简单的HTML代码 <input type="button" value="show" id="btn1"/><input ty

Jquery 图片走马灯效果原理

本篇只讲解水平走马灯效果,垂直向上走马灯效果不讲解,原理一样,但是水平走马灯效果有一个小坑.待会讲解 照例先上代码: HTML: <div class="box"> <div style="width: 1000px;" id="boxdiv"> <ul> <li style="display: block;" title="清灵少女宛如梦境仙女"><a

HTML5 CSS3 专题 :诱人的实例 3D旋转木马效果相册

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/32964301 首先说明一下创意的出处:http://www.zhangxinxu.com/study/201209/pictures-3d-slide-view.html(张鑫旭的博客 ),对前台感兴趣的可以没事去看看他的博客,很给力~ 这篇博客的目的是因为上篇HTML5 CSS3专题 诱人的实例 CSS3打造百度贴吧的3D翻牌效果中有个关于CSS 3D效果的比较重要的知识点没

用jquery实现手风琴效果

<style type="text/css"> ul li{ list-style: none; width:200px; height:30px; text-align: center; line-height:30px; background-color:deepskyblue; } ul{ display:none; margin:0; padding:0; } h3{ width:200px; height:30px; margin:0; padding:0; te