<!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),所以用户肉眼看上去没有什么变化,就这样实现了无限滚动的效果,其他同理!那么如果没有那两张图片作为过渡的话,效果就会是这样,当轮播到最后一张的时候会闪一下就没有了。