滑动轮播图实现最后一张图片无缝衔接第一张图片

原理:使用insertBefore和insertAfter方法调整图片顺序。

测试:firefox/chrome/IE11正常

已知不足:每次播放均使用了一次insertBefore和insertAfter,可考虑在最后一张图的时候将前几张图片整体后移。以后有空再优化。

1、HTML结构

alt的值将作为图片的描述信息出现在infobox里。

<div class="outerbox">
    <div class="innerbox">
        <a href="http://www.baidu.com"><img src="img/img1.jpg" alt="JavaScript高级程序设计"></a>
        <a href="http://www.w3school.com.cn/"><img src="img/img2.jpg" alt="油藏工程原理与方法"></a>
        <a href="http://www.cnblogs.com/zczhangcui/"><img src="img/img3.jpg" alt="高等数学第六版上册"></a>
        <a href="http://cn.bing.com/"><img src="img/img4.jpg" alt="银河帝国2:基地与帝国"></a>
        <a href="http://cn.bing.com/academic/?FORM=Z9LH2"><img src="img/img5.jpg" alt="三体"></a>
        <a href="http://cn.bing.com/dict/?FORM=HDRSC6"><img src="img/img6.jpg" alt="计算机科学导论"></a>
    </div>
</div>

2、CSS

为方便轮播组件复用,大部分CSS样式包含在了jq组件中,所以在CSS中只需设置outerbox容器的高度和宽度。

.outerbox{
    height: 500px;
    width: 800px;
}

3、jquery轮播函数,尚未封装。

给每个图片设置了data-idx属性来标识它们,使infobox能够与每个图片对应。

function slideshow(thetime,thecolor){
    var color="#317EF3";
    var time=5000;
    if(arguments.length==1){
        time=arguments[0];
    }else if(arguments.length==2){
        time=arguments[0];
        color=arguments[1];
    }else if(arguments.length>2){
        return false;
    }

    var adTimer=null;
    var innerbox=$(".outerbox .innerbox");
    var imgnum=$(".outerbox img").length;
    var imgwidth=$(".outerbox").width();
    var imgheight=$(".outerbox").height();

    for(var i=0;i<imgnum;i++){
        $(".outerbox .innerbox img").eq(i).attr(‘data-idx‘, i);
    }
    //设置各个div的css样式
    $(".outerbox img").css(‘float‘, ‘left‘);
    $(".outerbox").css({
        overflow: ‘hidden‘,
        position: ‘relative‘
    });
    innerbox.css({
        width: imgwidth*imgnum+"px",
        position: ‘absolute‘,
        left:‘0‘,
        top:‘0‘
    });
    //在outerbox下新增一个显示alt的div
    var $infobox=$("<div class=‘infobox‘></div>");
    $(".outerbox").append($infobox);
    $(".outerbox .infobox").css({
        position: ‘absolute‘,
        left: ‘0‘,
        bottom:‘0‘,
        width:imgwidth+10+"px",
        height:‘13%‘,
    });
    var liheight=$(".outerbox .infobox").height();

    var lists="";
    for(var i=0;i<imgnum;i++){
        lists+="<li><a href=‘‘><span></span></a></li>";
    }
    var ullists="<ul>"+lists+"</ul>";
    $(".outerbox .infobox").append($(ullists));
    $(".outerbox .infobox ul").css({
        height: liheight+"px",
        paddingLeft:‘0‘,
        marginTop:‘0‘,
        marginBottom:‘0‘
    });
    $(".outerbox .infobox ul li").css({
        display: ‘inline-block‘,
        float:‘left‘,
        marginRight:‘3px‘,
        background: "rgba(0,0,0,0.4)",
        height:liheight+"px",
        width:(imgwidth-(imgnum-1)*3)/imgnum+"px",
        lineHeight:liheight+‘px‘,
        verticalAlign:‘middle‘
    });
    $(".outerbox .infobox ul li a").css({
        display: ‘inline-block‘,
        width:$(".outerbox .infobox ul li").width()+"px",
        textAlign:‘center‘,
    });
    $(".outerbox .infobox ul li a span").css({
        display:‘inline-block‘,
        lineHeight:‘1.1em‘,
        paddingLeft:liheight*0.2+"px",
        paddingRight:liheight*0.2+"px",
        verticalAlign: ‘middle‘,
        color:‘#ddd‘,
        fontSize:‘12px‘
    });
    //获得img上层a的href属性,赋给infobox里的a元素
    for(var i=0;i<imgnum;i++){
        var link=$(".outerbox .innerbox a").eq(i).attr("href");
        var info=$(".outerbox .innerbox img").eq(i).attr("alt");
        $(".outerbox .infobox a").eq(i).attr(‘href‘, link);
        if(info){
            $(".outerbox .infobox span").eq(i).append(info);
        }else{
            $(".outerbox .infobox span").eq(i).append(i+1);
        }
    }
    //增加左右箭头
    var arrows=‘<div class="leftarrow arrow">&lt;</div><div class="rightarrow arrow">&gt;</div>‘;
    $(".outerbox").append($(arrows));
    $(".outerbox .arrow").css({
        width:liheight*0.8+"px",
        height: liheight*1.5+"px",
        position:‘absolute‘,
        top:(imgheight*0.5-liheight*0.75-10)+"px",
        background: "rgba(0,0,0,0.4)",
        textAlign:‘center‘,
        lineHeight:liheight*1.45+‘px‘,
        fontSize:‘1.5em‘,
        color:‘#ddd‘,
        cursor:‘pointer‘
    });
    $(".outerbox .leftarrow").css(‘left‘, ‘0‘);
    $(".outerbox .rightarrow").css(‘right‘, ‘0‘);
    //鼠标放在箭头上时,箭头变色
    $(".outerbox .leftarrow").hover(function() {
        $(this).css(‘background‘, color);
    }, function() {
        $(this).css(‘background‘, ‘rgba(0,0,0,0.4)‘);
    });
    $(".rightarrow").hover(function() {
        $(this).css(‘background‘, color);
    }, function() {
        $(this).css(‘background‘, ‘rgba(0,0,0,0.4)‘);
    });
    //点击右箭头
    $(".outerbox ul li").eq(0).css(‘backgroundColor‘, color).siblings().css(‘background‘, ‘rgba(0,0,0,0.4)‘);
    $(".outerbox .rightarrow").click(function() {
        if (!innerbox.is(‘:animated‘)) {
            innerbox.animate({left:-imgwidth}, "normal",function(){
                $(".outerbox .innerbox a:first").insertAfter($(".outerbox .innerbox a:last"));
                innerbox.css(‘left‘, ‘0‘);
                var dataidx=$(".outerbox .innerbox a:first").find(‘img‘).attr("data-idx");
                $(".outerbox ul li").eq(dataidx).css(‘backgroundColor‘, color).siblings().css(‘background‘, ‘rgba(0,0,0,0.4)‘);
            });
        }
    });
    //点击左箭头
    $(".outerbox .leftarrow").click(function() {
        if (!innerbox.is(‘:animated‘)) {
                $(".outerbox .innerbox a:last").insertBefore($(".outerbox .innerbox a:first"));
                innerbox.css(‘left‘, -imgwidth);
                innerbox.animate({left:0}, "normal");
                var dataidx=$(".outerbox .innerbox a:first").find(‘img‘).attr("data-idx");
                $(".outerbox ul li").eq(dataidx).css(‘backgroundColor‘, color).siblings().css(‘background‘, ‘rgba(0,0,0,0.4)‘);
        }
    });
    //每5s自动滚动,鼠标放在div上时箭头出现,移走箭头消失
    $(".outerbox").hover(function() {
        $(this).find(‘.leftarrow‘).stop().animate({left:"0"},300);
        $(this).find(‘.rightarrow‘).stop().animate({right:"0"},300);
        $(this).find(‘.infobox‘).stop().animate({bottom:"0"}, 300);
        if (adTimer) {
            clearInterval(adTimer);
        }
    }, function() {
        $(this).find(‘.leftarrow‘).stop().animate({left:-liheight*0.8+"px"},300);
        $(this).find(‘.rightarrow‘).stop().animate({right:-liheight*0.8+"px"},300);
        $(this).find(‘.infobox‘).stop().animate({bottom:-(liheight-7)+"px"}, 300);
        adTimer=setInterval(function () {
            $(".outerbox .rightarrow").trigger(‘click‘);
        },time);
    }).trigger(‘mouseleave‘);
    //鼠标放在下方的颜色块上时移动图片
    $(".outerbox .infobox ul li").mouseover(function() {
        var index=$(this).index();
        var dataidx=$(".outerbox .innerbox a:first").find(‘img‘).attr("data-idx");
        $(".outerbox ul li").eq(index).css(‘backgroundColor‘, color).siblings().css(‘background‘, ‘rgba(0,0,0,0.4)‘);
        if(index-dataidx>0){
            for(var i=0;i<Math.abs(index-dataidx);i++){
                    $(".outerbox .innerbox a:first").insertAfter($(".outerbox .innerbox a:last"));
            }
        }else if(index-dataidx<0){
            for(var i=0;i<Math.abs(index-dataidx);i++){
                    $(".outerbox .innerbox a:last").insertBefore($(".outerbox .innerbox a:first"));
            }
        }
    });
}

$(function(){ slideshow(5000);});

4、引入jq和该函数,并设置outerbox的宽度和高度,便可以实现滑动循环切换的轮播效果。

时间: 2024-11-04 06:45:08

滑动轮播图实现最后一张图片无缝衔接第一张图片的相关文章

html+css+js 实现自动滑动轮播图

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>轮播图</title> <script type="text/javascript" src="js/jquery.min.js"></script> <style type="te

jquery手写焦点轮播图-------解决最后一张无缝跳转第一张的问题

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>轮播图</title> <style> *{padding: 0;margin: 0;list-style-type: none;} .wrap{width: 520px;height: 280px;margin: 50px auto;} .ba

jquery自定义banner图滚动插件---(解决最后一张图片倒回第一张图片的bug)

banner图的滚动效果动画 最近做项目中banner滚动的时候遇到了一个小bug,当banner滚动到最后一张图再跳回第一张图时, 会出现默认的倒回第一张图的过渡效果,看了几个插件都是这样,所以自定义了一个插件修改了一下, 方便以后使用. by一个刚上路的女码农 有后退动画的banner效果如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jquer

移动端滑动轮播图

---恢复内容开始--- css样式如下: <style> *{ padding: 0; margin: 0; list-style: none; } html{ font-size: 20px; } #wrap{ width: 16rem; height: 7rem; margin: 0 auto; overflow: hidden; } #wrap ul{ width: 80rem; height: 7rem; transform: translate3d(-16rem,0,0); } #

原生JavaScript实现无缝轮播图

无缝轮播图是页面常用的特效之一,然而在实际的开发过程中,大部分的开发者都会使用插件来对轮播图进行开发,那么它的底层到底是怎么实现的呢,本文章将围绕这一问题展开探讨. 在讨论如何利用原生JS实现图片之间无缝切换轮播的动画效果之前,我们先来谈谈无缝轮播图片的css布局. 首先我们需要一个用来显示图片的DIV容器,然后把想要轮播的图片没有缝隙的排成一行放入DIV容器中,给DIV容器设置 overflow: hidden,这样在页面中就可以只看到一张图片,然后通过利用JS来移动ul的left值就能达到无

0199 移动端 之 轮播图

1.2.1 案例: 移动轮播图 移动端轮播图功能和基本PC端一致. 可以自动播放图片 手指可以拖动播放轮播图 1.2.2 案例分析 自动播放功能 开启定时器 移动端移动,可以使用translate 移动 想要图片优雅的移动,请添加过渡效果 自动播放功能-无缝滚动 注意,我们判断条件是要等到图片滚动完毕再去判断,就是过渡完成后判断 此时需要添加检测过渡完成事件? transitionend? 判断条件:如果索引号等于 3 说明走到最后一张图片,此时 索引号要复原为 0 此时图片,去掉过渡效果,然后

支持触屏的jQuery轮播图插件

移动轮播图我看到两类, 一款是无线天猫的m.tmall.com和携程,实现了无缝轮播. 一款是蘑菇街的,没有实现无缝轮播. 我自己重写一个,类似天猫.不过功能上简单点,只实现支持触屏和无缝轮播. 1.页面代码 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml" lang="UTF-8"> 3 <head> 4 <meta charset="U

JavaScript实现移动端轮播图效果

功能描述: 自动无缝轮播图片,底部小圆点跟图片保持一致:手指左右移动轮播图,移动距离大于50px播放下一张(或上一张),小于50px则回弹 具体功能实现: 1.定时器 自动轮播图片 先声明一个index=0用来存图片索引: 添加一个定时器,每隔两秒调用一次,每调用一次定时器(图片播放一次)index就加一: 通过transform(变形)属性和transition(过渡)属性实现图片的轮播. 1 var index = 0; 2 var timer = setInterval(function(

Android——ViewPager和内部view之间的事件分发及轮播图

viewpager 在滑动的过程中是如何触发view身上的事件的,换句话说,viewpager在滑动的过程中到底是滑动的它里面的view,还是滑动的viewpager本身? 一.示例代码: 1.自定义ViewPager:MyViewPager,重新dispatchTouchEvent方法,添加一些事件处理的log信息. package com.example.viewpagerdemo; import android.content.Context; import android.support