JS原生代码实现轮播图(无左右滑动,底下圆点按钮)

时间:2024-03-15 20:55:16

先上效果图:

由于动态图太大,所以只能截屏了;大致效果,图片轮播的过程中,底下的灰色提示渐渐出现;

JS原生代码实现轮播图(无左右滑动,底下圆点按钮)

现在来说实现思路:

       HTML部分:

<div id="content">  
    <img id="img1" />
    <img id="img2" />
    <div id="intro">
        <span></span>
    </div>
</div>

   

   CSS部分:

img,div,ul,li { margin:0;padding:0;}
#content { margin:100px auto 0 auto;width:600px; height:400px; border:1px solid #F00; position:relative;overflow:hidden;}
#img1 { position:absolute;top:0;left:0;}
#img2 { position:absolute;top:0;left:600px;}
#intro {width:600px; height:60px; position:absolute; top:340px; left:0;}
#intro span {display:block; width:600px; height:60px; line-height:60px; text-align:center; color:#fff; background:rgba(160,160,160,0.6); position:absolute; z-index:2;}
img{
    width:600px;
    height:400px;
}

   

   JavaScript部分:

window.onload=
    function(){
        /*获得html中的元素*/
        var intro=document.getElementById("intro");
        var oSpan=document.getElementsByTagName("span")[0];
        var img1=document.getElementById("img1");
        var img2=document.getElementById("img2");
        var imgarr=['images/bg.jpg','images/bg1.jpg','images/bg_01.jpg','images/lg4.jpg','images/lg.jpg'];  //图片地址
        var timer1=null;   //定时器
        var timer2=null;
        var timer3=null;

        /*初始化*/
        var a=0; //img1盒子存放图片的数组的索引值
        var b=1; //img2盒子存放图片的数组的索引值
        var n=0;
        intro.style.top="400px";
        oSpan.innerHTML='图片说明'+(n+1);
        img1.src=imgarr[a];
        img2.src=imgarr[b];

        timer1=setInterval(autoText,3000);   /*设置定时器*/
        timer2=setInterval(changeTop,30);

        //把换图片,标签上移的特效都综合到一个函数里面;并且加上改变oSpan中的文字
        function autoText(){
              clearInterval(timer2);
              clearInterval(timer3);
              intro.style.top="400px";
              timer2=setInterval(changeTop,30);
              timer3=setInterval(autoImg,30);
              n++;
               n%=imgarr.length;  // n=n%imgarr.length; n对数组长度取余,分别为01234;然后n+1对应12345              /* if(n>=imgarr.length)n=0;*/  //这个和上面取余效果相同
              oSpan.innerHTML = '图片说明'+(n+1);

        }



        //图片自动滑动,并且修改图片地址
        function autoImg(){
            var left1=parseInt(getstyle(img1,'left'))-10;  /*每执行一次该函数,图片就会向左移动10px*/
            var left2=parseInt(getstyle(img2,'left'))-10;
            img1.style.left=left1+'px';
            img2.style.left=left2+'px';
            /*判断图片是否完全消失在可见区域*/
            if(left1<=-600){
                img1.style.left='600px';  /*完全消失后,立即将img1盒子转到右边不可见,然后给它后面的图片地址显示*/
                a+=2;
                if(a>=imgarr.length){
                    a-=imgarr.length;
                }
                img1.src=imgarr[a];
                clearInterval(timer3);
            }
            if(left2<=-600){
                img2.style.left="600px";
                b+=2;
                if(b>=imgarr.length){
                    b-=imgarr.length;
                }
                img2.src=imgarr[b];
                clearInterval(timer3);
            }

        }

        //底下灰色标签上移,并且完全出现时,关掉指向自己的定时器
        function changeTop(){
            var top=parseInt(getstyle(intro,'top'))-2;
            intro.style.top=top+'px';
            if(top<=340)clearInterval(timer2);
        }


       //获取元素的属性值;封装该函数,调用方便;
        function getstyle(obj,str){
            return obj.currentStyle?obj.currentStyle[str]:getComputedStyle(obj)[str];
        }
       

    }

    思路:

    1、生成DIV做外框,并设置overflow:hidden;
    2、创建一个数组imgarr,放置图片地址
    3、生成两个并排的图片img1,img2,初始化图片地址为imgarr[0]、 imgarr[1] 并使用绝对定位,便于后面移动图片
    4、开一个定时器,间隔一定时间后,img1 img2的left值同时向左移动图片宽度值的像素   //移动的时候可以再开个定时器,做滑动的效果
   5、当img1的left值为负图片宽度时,赋予img1的left值为正图片宽度,并且将数组的第3张图片地址赋予img1,继续向左移动
   6、当img2的left值为负图片宽度时,赋予img2的left值为正图片宽度,并将数组的第4张图片地址赋予img2,继续向左移动
   7、当两张图片的图片地址到了数组的最后时,循环到第一个图片地址。


涉及的新知识点:

      1、obj.style.property 是一个可读可写的,不仅可以获取属性的值,而且可以改变属性的值;
       但是需要注意的是此方法只能获取内嵌在行内元素的属性值,而不能获取内联在 style 标签 里面的属性值,如果内嵌式没有设置某属性(比如width),而要通过obj.style.width 来获取该属性值,那么获取的结果 空字符串
      2、 obj.currentStyle.propertyIE浏览器支持的获取元素属性值得方法,可以获得任何位置设置的元素的属性值,包括内嵌式,内联式,外联式;
      3、 window.getComputedStyle(obj,null).property 比较大众,谷歌,火狐,opera,sarifi都支持该方法获取元素的属性,其中第二个参数是伪类,不是必需参数,如果需要获取的不是伪类,需要将该值设置为null,也可以不写;
      4、 总结 :obj.style.property只能获取元素的内嵌式样式属性值,但是可读可写;其他两个可以获取内嵌式,内联式 ,外联式中设置的属性值,但是只能读,不能改属性值;
           特别注意一点:如果要获取当前对象的颜色信息,IE返回的是16进制的'#ffffff',而FF返回的是rgb(255,255,255)


参考博客:谢家老树的JS原生代码实现图片轮播无缝切换的一种思路