slick 是一个基于 jQuery 的响应触摸式幻灯片插件,支持IE8+,Chrome, Firefox, and Safari,具有以下特点:
支持响应式
浏览器支持 CSS3 时,则使用 CSS3 过度/动画
支持移动设备滑动
支持桌面浏览器鼠标拖动
支持循环
支持左右控制
支持动态添加、删除、过滤
支持自动播放、圆点、箭头、回调等等
兼容
浏览器兼容:兼容 IE7+ 及其他主流浏览器,若要兼容 IE7,需修改 CSS(slick.css)。
jQuery兼容:兼容 1.7 及以上版本。
使用方法
1、引入文件
<link rel="stylesheet" href="style/slick.css">
<script src="script/jquery.min.js"></script>
<script src="script/slick.min.js"></script>
注意:需jQuery 1.7 +
2、HTML
<div class="slick">
<div><a href="http://www.dowebok.com"><img src="images/1.jpg" alt=""></a></div>
<div><a href="http://www.dowebok.com"><img src="images/2.jpg" alt=""></a></div>
<div><a href="http://www.dowebok.com"><img src="images/4.jpg" alt=""></a></div>
<div><a href="http://www.dowebok.com"><img src="images/3.jpg" alt=""></a></div>
</div>
3、JavaScript
$(function(){
$('.slick').slick({
dots: true
})
})
参数
参数类型默认值说明
accessibility布尔值true启用Tab键和箭头键导航
autoplay布尔值false自动播放
autoplaySpeed整数3000自动播放间隔
centerMode布尔值false中心模式
centerPadding字符串’50px’中心模式左右内边距
cssEase字符串‘ease’CSS3 动画
customPagingfunctionn/a自定义分页
dots布尔值false指示点
draggable布尔值true启用桌面拖动
easing字符串‘linear’animate() fallback easing
fade布尔值false淡入淡出
arrows布尔值true左右箭头
infinite布尔值true循环播放
lazyLoad字符串‘ondemand’延迟加载,可选 ondemand 和 progressive
onBeforeChange(this, index)methodnull开始切换前的回调函数
onAfterChange(this, index)methodnull切换后的回调函数
onInit(this)methodnull第一次初始化后的回调函数
onReInit(this)methodnull再次初始化后的回调函数
pauseOnHover布尔值true鼠标悬停暂停自动播放
responsiveobjectnull断点触发设置
slide字符串‘div’滑动元素查询
slidesToShow整数1幻灯片每屏显示个数
slidesToScroll整数1幻灯片每次滑动个数
speed整数300滑动时间
swipe布尔值true移动设备滑动事件
touchMove布尔值true触摸滑动
touchThreshold整数5滑动切换阈值,即滑动多少像素后切换
useCSS布尔值true使用 CSS3 过度
vertical布尔值false垂直方向
方法
方法Argument说明
slick()options : object初始化 slick
unslick() 销毁 slick
slickNext() 切换下一张
slickPrev() 切换上一张
slickPause() 暂停自动播放
slickPlay() 开始自动播放
slickGoTo()index : int切换到第 x 张
slickCurrentSlide() 返回当前幻灯片索引
slickAdd()element : html or DOM object, index: int, addBefore: boolAdd a slide. If an index is provided, will add at that index, or before if addBefore is set. If no index is provided, add to the end or to the beginning if addBefore is set. Accepts HTML String
slideRemove()index: int, removeBefore: boolRemove slide by index. If removeBefore is set true, remove slide preceding index, or the first slide if no index is specified. If removeBefore is set to false, remove the slide following index, or the last slide if no index is set.
slickFilter()filter : selector or functionFilters slides using jQuery .filter syntax
slickUnfilter() Removes applied filter
slickSetOption(option,value,refresh)option : string(option name), value : depends on option, refresh : 布尔值Sets an option live. Set refresh to true if it is an option that changes the display
三个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()实现一个轮播图
古老的做法是用settimeout或者setinterval实现循环动画,但是这样就会造成题主说的,在且页面的时候会造成混乱。
因为当页面失去焦点时浏览器不再渲染页面,但是settimeout/setinterval的请求不会停止,队列会一直堆积动画,当页面再次获得焦点时动画队列早已堆积了大量命令,就会导致动画混乱。
现在的做法,笼统地说,是使用requestanimationframe函数,用法和settimeout/setinterval类似,只不过requestanimationframe不接受时间参数,函数的执行频率由浏览器的渲染帧数决定,这就实现了由浏览器决定动画队列,避免了动画混乱。当然也可以使用一些现成的轮播图插件,题主可以自己百度,这里对比举例说明一下settimeout和requestanimationframe的用法。
//用setTimeout实现在控制台循环输出hello worldfunction fun(){
console.log('hello world')
setTimeout(function(){
fun()
},3000)
}
fun()//执行fun函数,就可以每隔3000毫秒递归的输出hello world
//用reqestanimationframe实现在控制台循环输出hello world
function fun(){
console.log('hello world')
requestAnimationFrame(function(){
fun()
})
}
fun()//执行fun函数,就可以每隔3000毫秒递归的输出hello world
//requestAnimationFrame没有时间参数,所以直接使用不能控制间隔
//但我们可以人为的限制执行间隔,方法如下
function fun(last_time){
if(new Date().getTime() - last_time > 3000){
console.log('hello world')
requestAnimationFrame(function(){
fun(new Date().getTime())
})
}else{
requestAnimationFrame(function(){
fun(last_time)
})
}
}
fun(new Date().getTime())
//这样就可以为requestAnimationFrame设置间隔,实现每隔3000毫秒输出hello world
//抱歉我主写c副写python偶尔写javaweb,分号用的有些乱。