Web前端笔记之轮播图和定时器

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>焦点图和轮播</title>
	<style>
		*{ 
		    margin: 0;
		    padding: 0; 
		    
		}
		a{
		    text-decoration: none;
		}
		body { 
		    padding: 20px;
		}
		#container { 
		    width: 600px;     /*这里600x400是图片的宽高*/
		    height: 400px; 
		    border: 3px solid #333; 
		    overflow: hidden;   /*隐藏溢出的图片,因为图片左浮动,总宽度为4200*/
		    position: relative;
		}
		#list { 
		    width: 4200px;   /*这里设置7张图片总宽度*/
		    height: 400px; 
		    position: absolute;  /*基于父容器container进行定位*/
		    z-index: 1;
		}
		#list img { 
			width: 600px;     /*这里600x400是图片的宽高*/
		    height: 400px; 
		    float: left;
		}
		#buttons { 
		    position: absolute; 
		    height: 10px; 
		    width: 100px; 
		    z-index: 2;   /*按钮在图片的上面*/
		    bottom: 20px; 
		    left: 250px;
		}
		#buttons span { 
		    cursor: pointer; 
		    float: left; 
		    border: 1px solid #fff; 
		    width: 10px; 
		    height: 10px; 
		    border-radius: 50%; 
		    background: #333; 
		    margin-right: 5px;
		}
		#buttons .on {  
		    background: orangered;   /*选中的按钮样式*/
		}
		.arrow { 
		    cursor: pointer; 
		    display: none;    /*左右切换按钮默认先隐藏*/
		    line-height: 39px; 
		    text-align: center; 
		    font-size: 36px; 
		    font-weight: bold; 
		    width: 40px; 
		    height: 40px;  
		    position: absolute; 
		    z-index: 2; 
		    top: 180px; 
		    background-color: RGBA(0,0,0,.3); 
		    color: #fff;
		}
		.arrow:hover { 
		    background-color: RGBA(0,0,0,.7);
		}
		#container:hover .arrow { 
		    display: block;   /*当鼠标放上去容器上面就显示左右切换按钮*/
		}
		#prev { 
		    left: 20px;
		}
		#next { 
		    right: 20px;
		}

	</style>
	<script>
    window.onload = function () {
    var container = document.getElementById('container');
    var list = document.getElementById('list');
    var buttons = document.getElementById('buttons').getElementsByTagName('span');
    var prev = document.getElementById('prev');
    var next = document.getElementById('next');
    var index = 1;    //用于索引当前按钮
    var len = 5;      //图片的数量
    var animated = false;   //用于判断切换是否进行
    var interval = 3000;    //自动播放定时器秒数,这里是3秒
    var timer;             //定时器


    function animate (offset) {
        animated = true;     //切换进行中
        var time = 300;     //位移总时间
        var inteval = 10;   //位移间隔时间
        var speed = offset/(time/inteval);   //每次位移量
        var left = parseInt(list.style.left) + offset; //目标值

        var go = function (){
            //这两种情况表示还在切换中
         if ( (speed > 0 && parseInt(list.style.left) < left) || (speed < 0 && parseInt(list.style.left) > left)) {
                list.style.left = parseInt(list.style.left) + speed + 'px';
                setTimeout(go, inteval); //继续执行切换go()函数
            }
            else {
                list.style.left = left + 'px';
                if(left>-600){
                    list.style.left = -600 * len + 'px';
                }
                if(left<(-600 * len)) {
                    list.style.left = '-600px';
                }
                animated = false; //切换完成
            }
        }
        go();
    }
    //用于为按钮添加样式
    function showButton() {
        //先找出原来有.on类的按钮,并移除其类
        for (var i = 0; i < buttons.length ; i++) {
            if( buttons[i].className == 'on'){
                buttons[i].className = '';
                break;
            }
        }
        //为当前按钮添加类
        buttons[index - 1].className = 'on';
    }
     //自动播放
    function play() {
        timer = setTimeout(function () {
            next.onclick();
            play();
        }, interval);
    }
     //清除定时器
    function stop() {
        clearTimeout(timer);
    }
    //右点击
    next.onclick = function () {
        if (animated) {    //如果切换还在进行,则直接结束,直到切换完成
            return;
        }
        if (index == 5) {
            index = 1; 
        }
        else {
            index += 1;
        }
        animate(-600);
        showButton();
    }
    //左点击
    prev.onclick = function () {
        if (animated) {       //如果切换还在进行,则直接结束,直到切换完成
            return;
        }
        if (index == 1) {
            index = 5;
        }
        else {
            index -= 1;
        }
        animate(600);
        showButton();
    }

    for (var i = 0; i < buttons.length; i++) {
        buttons[i].onclick = function () {
            if (animated) {         //如果切换还在进行,则直接结束,直到切换完成
                return;
            }
            if(this.className == 'on') {     //如果点击的按钮是当前的按钮,不切换,结束
                return;
            }
            //获取按钮的自定义属性index,用于得到索引值
            var myIndex = parseInt(this.getAttribute('index'));
            var offset = -600 * (myIndex - index);   //计算总的位移量

            animate(offset);
            index = myIndex;   //将新的索引值赋值index
            showButton();
        }
    }

    container.onmouseover = stop;//父容器的移入移出事件
    container.onmouseout = play;

    play();  //调用自动播放函数

}
	</script>
</head>
<body>
	<div id="container">
    <div id="list" style="left: -600px;">
        <img src="5.png" alt="1"/>
        <img src="1.png" alt="1"/>
        <img src="2.png" alt="2"/>
        <img src="3.png" alt="3"/>
        <img src="4.png" alt="4"/>
        <img src="5.png" alt="5"/>
        <img src="1.png" alt="5"/>
    </div>
    <div id="buttons">
        <span index="1" class="on"></span>
        <span index="2"></span>
        <span index="3"></span>
        <span index="4"></span>
        <span index="5"></span>
    </div>
    <a href="javascript:;" id="prev" class="arrow"><</a>
    <a href="javascript:;" id="next" class="arrow">></a>
</div>
</body>
</html>
首先讲几个函数的使用
parseint():

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

such as:

parseInt("10");			//返回 10
parseInt("19",10);		//返回 19 (10+9)
parseInt("11",2);		//返回 3 (2+1)
parseInt("17",8);		//返回 15 (8+7)
parseInt("1f",16);		//返回 31 (16+15)
parseInt("010");		//未定:返回 10 或 8



我这里是将list.style.left返回的字符串转为10进制整数

其次是讲讲思路,轮播图的实现实际上就是将元素浮动排列比如每张图height400pxwidth600px7张图就是4200pxwidth400px,实际上使用一个图片的父级div设置overflow来实现每次只实现一张图片,其他图片只是顺序的排列在后面,然后通过设置两个a标签相对定位到父级元素两侧(一般采取的布局是先父类绝对定位,然后子类元素相对父类元素 相对定位),通过设置a标签的onclick事件来使list.style.left的值发生改变来使用户看到不同的图片内容,比如刚开始是-600px,对应的是第一张图,点了右边的next的a标签后list.style.right的值变为了-1200px;这时看到的就是第二张图了,不过这么切换有个弊端那就是很突兀,所以我们设置了一个speed偏移量,再者我们要通过图片下面的5个圆点来控制图片,此时引入了index索引,写个for循环批量给5个圆点设置onclick事件,在点击的时候获取当前元素的index值通过减去全局变量的index(圆点按下时的页面的index)的值来获得偏移量并改变所有圆点class为空再给要切换的圆点增加on的class值来设置原点的选中样式,进而通过定时器里递归调用来实现无限循环播放,第一张图片(5.jpg)和最后一张图片(1.jpg)的作用是为了实现无限滚动的效果,因为此效果是通过设置id为list的div容器的left值来实现图片切换的,所以当轮播到第五张图片(5.jpg)的时候,再进行向右切换的时候,这时最后一张图片被切换进来,此时left值已经为-3600px,并且同时我们又将其left值改为-600px,这样就回到了真正的第一张图。由于最后一张图片就是第一张图片(1.jpg),所以用户肉眼看上去没有什么变化,就这样实现了无限滚动的效果,其他同理!那么如果没有那两张图片作为过渡的话,效果就会是这样,当轮播到最后一张的时候会闪一下就没有了。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值