用jQuery封装图片轮播

一、思路及实现效果

  • 需考虑两个问题:
  1. 在调用的情况下,代码块自己可以跑起来
  2. 在调用的情况下,用户赋予其新的参数,也可以跑起来
  • 效果及实现思路:
  1. 定义一个大块;
  2. 在其中先创建一个大的div,并且它是绝对定位的,层能高点;
  3. 在这个div里创建很多小的dom元素,该dom元素分为方块、横向的、纵向的三种形式,将这三种形式的dom元素以集合的形式加进去
  • 在主页面中需调用封装的代码块:
$("#block").ImageBanner();
  • 新建一个名为silderImage.js的文件:
  1. 文件中使用自执行函数,函数中引入jQuery封装方法、函数封装类对象、封装动画的相关属性、封装初始化的方法、创建dom元素的方法、排图片索引的方法、开始动画的方法、当前的dom元素节点。
  2. jQuery封装方法$.fn.ImageBanner
    (1)接收函数的执行对象(即获取当前的dom元素#block);
    (2)实例化函数封装类对象(将接收到的执行对象elements作为实参传给实例化的对象上);
    (3)执行封装的初始化方法
  3. 函数封装类对象silderImage
    (1)以面向对象的封装方式执行,可创建一个匿名函数(将ele作为形参接收,ele即为元素的dom对象this.element = ele;,把它存给对象的属性,后面用时可直接调属性);
    (2)定义一个大的空div(即silderParent);
    (3)定义一个空集合(即item),存放三种形式的dom元素;
    (4)将图片存为一个属性(即image)
  4. 封装动画的相关属性silderImage.prototype.options:宽、高、列数、行数、计时器的总时间、图片淡入淡出的时间、动画的名称
  5. 封装初始化的方法silderImage.prototype._init:执行后续创建dom元素、排图片索引、开始动画的方法。
  6. 封装创建dom元素的方法silderImage.prototype._create
    (1)创建一个大div,相当于一个父容器(即silderParent),将其加给element(即#block);
    (2)创建方块(定义一个名为square的空字符串,循环遍历行与列后给该字符串拼接一个div),将其加给集合(item[0]);
    (3)创建水平方向的竖条(定义一个名为Hodom的空字符串,循环遍历列后给该字符串拼接一个div),将其加给集合(item[1]);
    (4)创建垂直方向的横条(定义一个名为Vedom的空字符串,循环遍历行后给该字符串拼接一个div),将其加给集合(item[2])
  7. 封装排图片索引的方法silderImage.prototype._setindex
    (1)根据z-index排图片索引,拿到每张图片后遍历每张图片,改变其索引层;
    (2)除过图片的第一张,其余设置为隐藏
  8. 封装开始动画的方法silderImage.prototype._play
    (1)图片的淡入淡出动画:通过计时器控制第一张图片淡出(动画完成后,更新集合里的图片,将自身索引层改为下一张图的索引层,并将自身加给最后一张图片的后面),第二张图片淡入(动画完成后,更新集合里的图片);
    (2)随机一组动画的dom元素:将三种形式的dom元素动画加给大的div
  9. 封装动画效果并执行$.animateinfo
    (1) animateinfo相当于调用方法,执行方法,方法里面传了一个枚举对象作为形参,在其中可写全部动画;
    (2)方法的函数体,即需调用的动画,在其中进行对象的合并
  10. dom元素进入页面的同时去执行dom元素的动画:先随机出dom动画的名称, 拿动画的名称去枚举对象里拿枚举对象,再取它的函数,再执行动画的函数
  11. 给每个块添加下一张图that.silderParent.children().each():随机一组动画的dom元素后,每个块里的内容是空的,此时需给块添加下一张图,使得下一张图刷出来时是以块的动画出来的9(获取背景图片的地址,改其坐标,元素大小)

二、代码块
主页面:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        #block{
            position: relative;
            width: 800px;
            height: 400px;
            border: 1px solid silver;
            margin: 0 auto;
        }
        .image{
            width: 800px;
            height: 400px;
        }
        .image img{
            position: absolute;
            width: 800px;
            height: 400px;
        }
        .parentdom>div{
            border: 1px solid #ffbe1b;
            box-sizing: border-box;
        }
    </style>
</head>
<body>
<div id="block">
    <div class="image">
        <img src="img/1.jpg">
        <img src="img/2.jpg">
        <img src="img/3.jpg">
        <img src="img/4.jpg">
        <img src="img/5.jpg">
        <img src="img/6.jpg">
    </div>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="modeljs/silderImage.js"></script>
<script>
    //调用封装的代码块
    $("#block").ImageBanner();
</script>
</body>
</html>

silderImage.js:

(function ($) {
    //jQuery封装方法
    $.fn.ImageBanner = function () {
        var elements = $(this);
        var instances = new silderImage(elements);
        instances._init();
    }
    //效果
    var effects = {}
    //函数封装类对象
    var silderImage = function (ele) {
        this.element = ele;
        this.item = [];
        this.silderParent = null;
        this.image = null;
        this.index = 0;
        this.nowdom = null;
    }
    //动画的相关属性
    silderImage.prototype.options = {
        width: 800,
        height: 400,
        Hov: 20,
        Ver: 10,
        times: 4000,
        speed: 2000,
        domspeed: 900,
        //动画的名称
        animate: [
            'fadeTop'
        ]
    }
    //封装初始化的方法
    silderImage.prototype._init = function () {
        this._create();
        this._setindex();
        this._play();
    }
    //封装一个排图片索引的方法
    silderImage.prototype._setindex = function () {
        var that = this;
        //that.element指dom元素的父节点[div#block]
        that.image = that.element.find("img");
        that.image.each(function (index) {
            $(this).css("zIndex", that.image.length - index - 1);
        });
        that.image.not(that.image.eq(0)).css("display", "none");
    }
    //封装一个开始动画的方法
    silderImage.prototype._play = function () {
        var that = this;
        setInterval(function () {
            //随机一组动画的dom元素
            that.nowdom = that.item[that.index];  //当前的dom元素节点
            that.silderParent.html(that.nowdom);
            //给每个块添加下一张图
            that.silderParent.children().each(function () {
                var left = $(this).css("left");
                var top = $(this).css("top");
                $(this).css({
                    "backgroundImage": "url(" + that.image.eq(1).attr("src") + ")",
                    "backgroundSize": that.options.width + "px " + that.options.height + "px",
                    "backgroundPosition": (-parseInt(left)) + "px " + (-parseInt(top)) + "px"
                });
            });
            //随机一组动画
            /*var animateindex=Math.floor(Math.random()*that.options.animate.length);
             var effectsname=that.options.animate[animateindex];  //效果的名称*/
            var effectsname = that.options.animate[0];
            effects[effectsname].call(that)
            that.index++;
            if (that.index > that.item.length - 1) {
                that.index = 0;
            }
            //图片的淡入淡出动画
            that.image.eq(0).fadeOut(that.options.speed, function () {
                that.image = that.element.find("img");  //页面元素的图片已经变化,但集合里的没变,因此需将集合里的图片更新,下一次进来的第零个是变过的第零个
                $(this).parent().append($(this));
            });
            that.image.eq(1).fadeIn(that.options.speed, function () {
                that.image = that.element.find("img");
            });
        }, that.options.times);
    }
    //方法的函数体  需调用的动画
    $.animateinfo = function () {
        //对象的合并
        effects = $.extend({}, effects, arguments[0]);
    }
    //封装一个创建dom元素的方法
    silderImage.prototype._create = function () {
        var that = this;
        //创建一个大块,相当于一个父容器
        that.silderParent = $("<div class='parentdom' style='position: absolute;top: 0;left: 0;z-index:10;width: " + that.options.width + "px;height:" + that.options.height + "px'></div>");
        that.element.append(that.silderParent);

        //创建方块
        var square = "";
        for (var i = 0; i < that.options.Ver; i++) {
            for (var k = 0; k < that.options.Hov; k++) {
                square += "<div style='width:40px;height:40px;position: absolute;left:" + k * 40 + "px;top:" + i * 40 + "px'></div>";
            }
        }
        that.item[0] = square;

        //创建竖的
        var Hodom = "";
        for (var i = 0; i < that.options.Hov; i++) {
            Hodom += "<div style='width:40px;height:" + that.options.height + "px;position:absolute;left: " + i * 40 + "px;top:0px'></div>";
        }
        that.item[1] = Hodom;

        //创建横的
        var Vedom = "";
        for (var i = 0; i < that.options.Ver; i++) {
            Vedom += "<div style='width:" + that.options.width + "px;height:40px;position: absolute;left: 0px;top: " + i * 40 + "px'></div>";
        }
        that.item[2] = Vedom;
    }
    //函数自身  可写全部的动画  效果的代码
    $.animateinfo({
        'fadeTop': function () {
            var that = this, dom = that.silderParent;
            dom.children("div").css("opacity", 0).each(function (index) {
                $(this).delay(index * 35).animate({
                    opacity: 1
                }, that.options.domspeed / 3);
            });
        }
    });
})(jQuery);

三、遇到的问题及解决方案
1.问题:其同胞兄弟的zIndex为自身层加1时,除最后一张图片索引值为0,其余图片索引值一直在加1
思路:计时器控制第一张图片淡出,动画完成后将自身加给最后一张图片之后,设置自身的zIdex为0,其同胞兄弟的zIndex为自身层加1
代码如下

that.image.eq(0).fadeOut(that.options.speed,function(){
         $(this).parent().append($(this));
         $(this).css("zIndex",0).siblings().each(function(){
              $(this).css("zIndex",parseInt($(this).css("zIndex"))+1);
         });
});

原因:页面元素的图片已经变化,但集合里的没变
解决思路:动画完成后,更新集合里的图片,将自身索引层改为下一张图的索引层,并将自身加给最后一张图片的后面
解决方法:淡入与淡出动画执行完成之后,将集合里的图片更新(重新找图片),下一次进来的第0个是变过的第0个
改后代码

that.image.eq(0).fadeOut(that.options.speed,function(){
         that.image=that.element.find("img");  
         $(this).parent().append($(this));
});
that.image.eq(1).fadeIn(that.options.speed,function(){
         that.image=that.element.find("img");
});

2.问题:dom元素的动画只闪了一下,并没有相互切换的效果
解决方法:将创建的大div的层调高
代码

that.silderParent = $("<div class='parentdom' style='position: absolute;top: 0;left: 0;z-index:10;width: " + that.options.width + "px;height:" + that.options.height + "px'></div>");

3.问题:Cannot read property ‘call’ of undefined
代码如下

$.animteinfo = function () {
        //对象的合并
         $.extend({}, effects, arguments[0]);
}

解决方法:合并完之后有返回值
改后代码

$.animteinfo = function () {
        effects = $.extend({}, effects, arguments[0]);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值