JQ 图片轮播并封装

利用面向对象自己动手写了一个封装好的jquery轮播对象,可满足一般需求,需要使用时只需调用此对象的轮播方法即可。

demo:https://github.com/zsqosos/shopweb

具体代码如下:

HTML结构:

 1 <div class="banner" id="J_bg_ban">
 2   <ul>
 3     <li><a href="#"><img src="banner_04.jpg" alt="广告图 /></a></li>
 4     <li><a href="#"><img src="banner_04.jpg" alt="广告图 /></a></li>
 5     <li><a href="#"><img src="banner_03.jpg" alt="广告图"/></a></li>
 6     <li><a href="#"><img src="banner_04.jpg" alt="广告图"/></a></li>
 7     <li><a href="#"><img src="banner_05.jpg" alt="广告图"/></a></li>
 8   </ul>
 9   <div class="indicator" id="J_bg_indicator">
10   </div>
11   <div class="ban-btn clearfloat" id="J_bg_btn">
12     <a class="next-btn fr" href="javascript:">&gt;</a><a class="prev-btn fl" href="javascript:">&lt;</a>
13   </div>
14 </div>

css样式:

.banner {
    height: 325px;
    width: 812px;
    position: relative;
    overflow: hidden;
}
.banner ul li{
    position: absolute;  top: 0;  left: 0;
}
.banner ul li img{
    height: 325px;
    width: 812px;
    display: block;
}
.ban-btn{
    width: 100%;
    position: absolute;
    top: 136px;
    z-index: 2;
}
.ban-btn a{
    display: inline-block;
    height: 60px;
    width: 35px;
    background: rgba(180,180,180,0.5);
    font-size: 25px;
    text-align: center;
    line-height: 60px;
    color: #fff;
}
.ban-btn a:hover{
    background: rgba(100,100,100,0.5);
}
.indicator{
    width: 100%;
    position: absolute;
    text-align: center;
    bottom: 15px;
    z-index: 2;
}
.indicator a{
    display: inline-block;
    width: 20px;
    height: 5px;
    margin:0 3px;
    background: #fff;
}
.indicator-active{
    background: #FF8C00!important;
}

jquery代码:

$.carousel = {
    now : 0,                    //当前显示的图片索引
    hasStarted : false,         //是否开始轮播
    interval : null,            //定时器
    liItems : null,             //要轮播的li元素集合
    len : 0,                    //liItems的长度
    aBox : null,                //包含指示器的dom对象
    bBox : null,                //包含前后按钮的dom对象

    /**
     * 初始化及控制函数
     * @param bannnerBox string 包含整个轮播图盒子的id或class
     * @param aBox  string 包含指示器的盒子的id或class
     * @param btnBox string 包含前后按钮的盒子的id或class
     */
    startPlay : function(bannnerBox,aBox,btnBox) {
        //初始化对象参数
        var that = this;
        this.liItems = $(bannnerBox).find(‘ul‘).find(‘li‘);
        this.len = this.liItems.length;
        this.aBox = $(bannnerBox).find(aBox);
        this.bBox = $(bannnerBox).find(btnBox);
        //让第一张图片显示,根据轮播图数量动态创建指示器,并让第一个指示器处于激活状态,隐藏前后按钮
        this.liItems.first(‘li‘).css({‘opacity‘: 1, ‘z-index‘: 1}).siblings(‘li‘).css({‘opacity‘: 0, ‘z-index‘: 0});
        var aDom = ‘‘;
        for (var i = 0; i < this.len; i++){
            aDom += ‘<a></a>‘;
        }
        $(aDom).appendTo(this.aBox);
        this.aBox.find(‘a:first‘).addClass("imgnum-active");
        this.bBox.hide();
        //鼠标移入banner图时,停止轮播并显示前后按钮,移出时开始轮播并隐藏前后按钮
        $(bannnerBox).hover(function (){
            that.stop();
            that.bBox.fadeIn(200);
        }, function (){
            that.start();
            that.bBox.fadeOut(200);
        });
        //鼠标移入指示器时,显示对应图片,移出时继续播放
        this.aBox.find(‘a‘).hover(function (){
            that.stop();
            var out = that.aBox.find(‘a‘).filter(‘.indicator-active‘).index();
            that.now = $(this).index();
            if(out!=that.now) {
                that.play(out, that.now)
            }
        }, function (){
            that.start();
        });
        //点击左右按钮时显示上一张或下一张
        $(btnBox).find(‘a:first‘).click(function(){that.next()});
        $(btnBox).find(‘a:last‘).click(function(){that.prev()});
        //开始轮播
        this.start()
    },
    //前一张函数
    prev : function (){
        var out = this.now;
        this.now = (--this.now + this.len) % this.len;
        this.play(out, this.now);
    },
    //后一张函数
    next : function (){
        var out = this.now;
        this.now = ++this.now % this.len;
        this.play(out, this.now);
    },
    /**
     * 播放函数
     * @param out number 要消失的图片的索引值
     * @param now number 接下来要轮播的图的索引值
     */
    play : function (out, now){
        this.liItems.eq(out).stop().animate({opacity:0,‘z-index‘:0},500).end().eq(now).stop().animate({opacity:1,‘z-index‘:1},500);
        this.aBox.find(‘a‘).removeClass(‘imgnum-active‘).eq(now).addClass(‘indicator-active‘);
    },
    //开始函数
    start : function(){
        if(!this.hasStarted) {
            this.hasStarted = true;
            var that = this;
            this.interval = setInterval(function(){
                that.next();
            },2000);
        }
    },
    //停止函数
    stop : function (){
        clearInterval(this.interval);
        this.hasStarted = false;
    }
};

$(function(){  $.carsouel.startPlay(‘#J_bg_bn‘,‘#J_bg_indicator‘,‘#J_bg_btn‘);})

最初实现时使用面向过程的方法来完成,虽然可以达到想要的效果,但代码复用性不高,需要为页面上每一个需要轮播的模块分别写对应的函数。进行封装后,不需要写太多的代码,使用时只需调用carsouel的startPlay方法并传入三个参数即可,大大提高了易用性。

但是,当前代码的缺陷也非常明显,就是当一个页面上同时有多个轮播件需要轮播时,只有最后一个会正常工作,这是由于carsouel对象只有一个,可以通过复制carsouel对象来解决这个问题,如:

    var banner1 = $.extend(true,{},carousel);
    var banner2 = $.extend(true,{},carousel);
    var banner3 = $.extend(true,{},carousel);
    banner1.startPlay(‘#J_bg_ban1‘,‘#J_bg_indicator1‘,‘#J_bg_btn1‘);
    banner2.startPlay(‘#J_bg_ban2‘,‘#J_sm_indicator2‘,‘#J_bg_btn2‘);
    banner3.startPlay(‘#J_bg_ban3‘,‘#J_sm_indicator3‘,‘#J_bg_btn3‘);

这样虽然可以满足需求,但每次调用都会复制出一个新的对象,不仅影响性能,carsouel对象内的方法还不能够重用,所以还需要进一步改进。

要想让多个轮播件可以同时使用carsouel对象,并且可以复用carsouel对象内部的函数,必须将carsouel对象作为一个构造函数或原型对象,每次需要使用时在进行实例化操作,这样可满足多个轮播件同时使用的需求,同时做到最大化的函数复用。我会在后续的文章中解决这个问题,欢迎关注或提出指导。

本文转载自:http://www.cnblogs.com/zsqos/p/6126782.html

时间: 2024-12-25 09:08:13

JQ 图片轮播并封装的相关文章

UISCrollView —— 图片轮播器封装实现(三)——(第三讲)

1.分析 利用xib布局,然后自定义一个UIView,解析xib,然后利用控制器传入数据,将其加载到控制器的view上展示即可 2. 程序结构 3. 代码具体实现 1>  xib文件 2>  创建类 XMGPageView,然后将其与xib文件关联,选中xib文件,然后设置下文中 " custom class " 为定义的类,让其来管理xib 1>    (如图,设置xib与类关联) 2>  XMGPageView.h 文件中,声明分页图片数组属性,及其一个快速

自己做的jq图片轮播

新手开始学习js写的一个经常能用到的图片轮播效果 html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>图片轮播</title> <link rel="stylesheet" href="css/font-awesome/css/font-awesome.min.css"> <

JQ图片轮播

<script src="{staticurl action="jquery.js" type="js"}"></script> <style type="test/css"> div.LunBo {position: relative;list-style-type: none;height: 170px;width: 490px;}div.LunBo ul{list-style:none

jq实现图片轮播:圆形焦点+左右控制+自动轮播

来源:http://www.ido321.com/862.html html代码: 1: <!DOCTYPE html> 2: <html lang="en"> 3: <head> 4: <meta http-equiv="content-type" content="text/html;charset=utf-8"> 5: <title>JQ图片轮播</title> 6:

Android事件分发学习应用-图片轮播实现

前一篇写到Android事件分发机制学习笔记,下面我们通过一个实例的应用来实践理解下Android事件分发的机制.我们这里来实现一个图片的轮播功能,最后顺便实现下图片的自动轮播. 我们的图片轮播是封装在一个ViewGroup里,当我们进行横向滑动的时候,我们需要阻止事件从ViewGroup往子控件分发,ViewGroup来消费我们当前的滑动图片何去何从.下面我们贴出我们的封装的ViewGroup的代码实现如下: public class ImageSwitcher extends ViewGro

图片轮播小插件

在手上工作完成之余,自己写了一个jQuery小插件,针对我们现在所用到的图片轮播特效进行一个封装,没事就写写,记录我的前端历程上的点点滴滴. 编写背景: 在web端经常会看到图片滚来滚去的,自己就想一个方式,让前端团队开发这些特效时间更快,效果更好,实现特效的方式更多,可以随意替换图片轮播的方式,兼容各个浏览器,是我的初衷,也是对自己的js编程经验一个积攒,我相信带着兴趣做自己喜欢的事,是工作生活的初衷意义... 插件介绍: 本“小插”是基于jQuery上进行开发,对所播放的图片大小做了自适应,

基于ionic框架封装一个图片轮播指令的几点

在这里我想在项目中封装一个图片轮播的指令 (本项目使用的是ionic框架) 1)定义指令 define(['app'],function(myapp){ myapp.directive('myslidebanner',['$state',function(s){ return{ templateUrl:'directives/slide-banner/slide-banner.html', scope:{ banimg:'=',//数据的来源 }, link:function(s,el,atr)

原生JavaScript实现的图片轮播左右滑动效果函数封装

原生js实现的图片轮播左右滑动效果函数封装 方便以后需要的时候拿出来复用. 适合新手学习使用. 使用方法轮播图的html结构就不多说了.不过有一点:为了实现无缝无限轮播,需要在三张图片的最前面和最后面再额外添加两张图片(见下),原理简单说就是当图片滑动到最后一张时立马跳到第二张,眼睛看上去就像前后无缝一样. 把img_slider.js引入html,然后编辑window.onload = (function () { ··· });中的内容. (获取图片床,按钮,标识等元素.然后调用slideI

Swift 使用CollectionView 实现图片轮播封装就是这样简单

前言: 这篇你可以学会自定义视图,创建collectionView,协议的使用,定时器; 自制图片 先上Demo:Github上封装好的下载即用, 好用请Star Thanks首先新建一个继承于UIView的视图, 且用collectionView实现所以需要签订两个协议代码如下: let sectionNum: Int = 100 // 区的数量 let width = UIScreen.mainScreen().bounds.size.width // 屏幕宽度 let height = U