简单轮播图的实现及原理讲解(js)

JavaScript011

简单轮播图的实现及原理讲解(js),第1张

三个div,最外层id为 parent 的大div内包含了 uls 和 buttons 两个div,div uls 中包含了两个列表 img_ul (图片列表), litCir_ul (小圆点列表),div buttons 里则包含了“左”, “右”两个按钮。

之所用js添加小圆点,是因为小圆点的数量是由图片张数决定的。

默认 li 的 class 为 quiet , 第一张默认为 active 。

首先先理解该轮播图如何滚动,这里是通过控制 img_ul 的 left 值来控制显示某张图片, 为了实现“滚动”的效果,我们需要 逐渐 改变 img_ul 的 left 值,而不能直接使该值变化图片宽度的倍数。这里我们定义一个动画效果函数 Roll() 。

试想下面的情况,当图片从最后一张切换到第一张时,这时就不能通过逐渐改变 img_ul 的 left 值来实现滚动的效果,于是 克隆第一张图片至列表尾部,当滚动完最后一张图片时,继续滚动到克隆的第一张,然后将 img_ul 的 left 值置为0。

需要注意的是小圆点和图片列表的 li 数目是不一样的,当滚动到最后一个克隆项时,此时小圆点实际上在第一个位置。

开始自动滚动:

timer = setInterval(autoRun, gap)

给每个小圆点绑定了onmouseover事件,这个方法有个细节,会根据两次小圆点的距离差调整速率为 rate*times ,使切换效果更自然(也就是说每次切换说花的时间基本一致,无论是第一张到第二张,还是第一张到最后一张)。

触及区域,清除定时器,显示按钮。

离开区域,添加定时器,隐藏按钮。

自动播放就是间隔一定时间不断调用函数“下一张”的过程,所以这里的按钮 right 下一张的实现就是上面的 autoRun 函数。

以上就是轮播图各部分的实现原理,如果你有其他的方法,欢迎一起交流!

2019.3.30更新:

用requestAnimationFrame()实现一个轮播图

首先init()函数用于初始化images数组和image的值,本例中主要是利用setSrc()设置图片的src属性值,这样就达到了图片的切换,图片的轮播是使用定时器来时显的!setInterval('play()',500)的意思是每0.5s调用一次play()函数!

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=UTF-8">

<title>Insert title here</title>

</head>

<script type="text/javascript">

var timeID

var image

var current = 0

var images = new Array(5)

function init(){

for (var i=1i<=5i++){

images[i] = new Image(450,550)

images[i].src = "pictures/"+i+".jpg"

}

image = document.images[0]

}

function setSrc(i){

current = i

//设置图片src的属性,实现图片的切换

image.src = images[i].src

}

function pre(){

if (current <= 0){

alert('已经是第一张了')

}else{

current--

setSrc(current)

}

}

function next(){

if (current >= 5){

alert('已经是最后一张了')

}else{

current++

setSrc(current)

}

}

function play(){

if (current >= 5){

current = 0

}

setSrc(++current)

}

</script>

<body onload="init()">

<input type="button" value="第一张" onclick="setSrc(1)">

<input type="button" value="上一张" onclick="pre()">

<input type="button" value="下一张" onclick="next()">

<input type="button" value="最后一张" onclick="setSrc(5)">

<input type="button" value="幻灯播放" onclick="timeID=setInterval('play()',500)">

<input type="button" value="停止播放" onclick="clearInterval(timeID)">

<div style="border:1px solid bluewidth:450pxheight:550px" id="myPic">

<img src="pictures/1.jpg" />

</div>

</body>

</html>

<script type="text/javascript">

var t = n = 0, count

$(document).ready(function(){

count=$("#ban_list a").length//获取图片数目

$("#ban_list a:not(:first-child)").hide()//除第一张图片都隐藏

$("#ban_info").html($("#ban_list a:first-child").find("img").attr('alt'))//这个是把alt里的内容作为标题

$("#ban_info").click(function(){window.open($("#ban_list a:first-child").attr('href'), "_blank")})//给标题绑定点击事件,添加链接

$("#ban li").click(function() { //按钮点击事件

var i = $(this).text() - 1//获取Li元素内的值,即1,2,3,4

n = i

if (i >= count) return

$("#ban_info").html($("#ban_list a").eq(i).find("img").attr('alt'))//重新获取标题

$("#ban_info").unbind().click(function(){window.open($("#ban_list a").eq(i).attr('href'), "_blank")})//重新绑定标题点击事件

$("#ban_list a").filter(":visible").fadeOut(500).parent().children().eq(i).fadeIn(1000)//渐进渐出效果

document.getElementById("ban").style.background=""

$(this).toggleClass("on")//切换按钮样式

$(this).siblings().removeAttr("class")

})

t = setInterval("showAuto()", 4000)

$("#ban").hover(function(){clearInterval(t)}, function(){t = setInterval("showAuto()", 4000)})

})//鼠标指上停止轮播

function showAuto()//实现轮播的函数

{

n = n >=(count - 1) ? 0 : ++n

$("#ban li").eq(n).trigger('click')

}

</script>

<div id="ban">

<div id="ban_bg"></div>

<div id="ban_info"></div>

<ul>

<li class="on">1</li>

<li>2</li>

<li>3</li>

</ul>

<div id="ban_list">

<a href="/Item/Show.asp?m=1&d=3824" target="_blank"><img src="/UploadFiles/2012-08/admin/2012081511562273110.jpg" alt="" width="414" height="286" /></a>

</div>