php cms 轮播图,原生JS运动实现轮播图

原生JS运动实现轮播图

**基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到最后一张时,将ul的left值设为0,即可达到图片无线轮播的效果。

运动函数的实现

函数需传入元素(即需要参与运动的元素)、目标值(以对象的形式呈现,如{left: 300})、callback(回调函数)。

//多物体多值运动+回调机制

function startMove(dom, attrObj, callback) {

var key = true;

var iSpeed = null,

iCur = null;

clearInterval(dom.timer);

if (key) {

dom.timer = setInterval(function() {

//bStop用来判断是否开始执行回调函数

var bStop = true;

//判断传入目标值中的“键”类型是否为opacity

for (var attr in attrObj) {

//若要改变的样式为opacity,则将元素的opacity扩大100被进行操作

if (attr === 'opacity') {

iCur = parseFloat(getStyle(dom, attr)) * 100;

} else {

iCur = parseInt(getStyle(dom, attr));

}

//运动速度设为目标值减去当前值的一半,即当前状态离目标值越接近,运动速度越小

iSpeed = (attrObj[attr] - iCur) / 2;

//对速度进行取整

iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);

if (attr === 'opacity') {

dom.style.opacity = (iCur + iSpeed) / 100;

} else {

dom.style[attr] = iCur + iSpeed + 'px';

}

if (iCur !== attrObj[attr]) {

bStop = false;

}

}

//当bStop为true时,元素的所有样式均已达到目标值,清理定时器并执行回调函数

if (bStop) {

clearInterval(dom.timer);

typeof callback == 'function' && callback();

}

}, 30)

}

if (!key) {

}

}

//用来获取元素实时的样式值

function getStyle(elem, prop){

if (window.getComputedStyle){

return window.getComputedStyle(elem, null)[prop];

}

}

HTML部分

HTML中包含一个div,用来显示当前要播放的图片,该div中又包含一个ul(用来存放所有包含图片的li)、三个div(其中两个充当图片左右切换的按钮,第三个存放图片索引点,通过点击索引也可切换到要查看的图片),代码如下:

  • %E9%98%BF%E6%8B%89%E6%96%AF%E5%8A%A0.jpeg

  • %E6%AF%94%E7%86%8A.jpeg

  • %E8%BE%B9%E7%89%A7.jpeg

  • %E6%9F%AF%E5%9F%BA.jpeg

  • %E9%98%BF%E6%8B%89%E6%96%AF%E5%8A%A0.jpeg

<
>

CSS代码

此处采用的为内联样式表

*{

margin: 0;

padding: 0;

list-style: none;

}

.wrapper{

position: relative;

margin: 100px auto 0;

width: 600px;

height: 360px;

overflow: hidden;

}

.wrapper .sliderPage{

position: absolute;

left: 0;

width: 3000px;

height: 360px;

}

.wrapper .sliderPage li{

width: 600px;

height: 360px;

float: left;

}

.wrapper .sliderPage li img{

width: 100%;

height: 100%;

}

.btn{

position: absolute;

top: 50%;

width: 20px;

height: 20px;

color: #fff;

text-align: center;

line-height: 20px;

background-color: #000;

opacity: 0.2;

cursor: pointer;

}

.leftBtn{

left: 5px;

}

.rightBtn{

right: 5px;

}

.wrapper:hover .btn{

opacity: 0.8;

}

.sliderIndex{

position: absolute;

width: 100%;

bottom: 10px;

cursor: pointer;

text-align: center;

}

span{

width: 8px;

height: 8px;

background-color: #cccccc;

border-radius: 50%;

display: inline-block;

margin-right: 5px;

}

.active{

background-color: orange;

}

图片自动运动及点击运动事件绑定

要点:

1、当图片运动到最后一张时(显示图片为第一张图片),将ul的left值设为0即可实现无限轮播;

2、图片每次运动的值为li的宽度;

3、图片的运动需要一定的时间,因此在图片运动过程中应禁止产生其它定时器,否则会造成运动尺寸混乱而导致图片轮播出现问题,这里用lock来进行实现,在ul运动过程中将lock值设为false,运动结束后又将lock值设为true;

4、通过index值来实现索引显示图片功能,图片轮播过程中,index初始值为0,当图片向右轮播时index值加1,图片向左轮播时,index值减1,index值为0时,若让图片向左轮播,则将index值设为n(li个数)并进行轮播,而当index值为3且图片向右轮播时,在ul运动完成后将index值设为0;

var timer = null;

var sliderPage = document.getElementsByTagName('ul')[0];

var moveWidth = sliderPage.children[0].offsetWidth;

var num = sliderPage.children.length - 1;

var leftBtn = document.getElementsByClassName('leftBtn')[0];

var rightBtn = document.getElementsByClassName('rightBtn')[0];

var lock = true;

var index = 0;

var indexArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span');

//索引切换

for (var i = 0; i < indexArray.length; i ++){

(function(myindex){

indexArray[myindex].onclick = function(){

lock = false;

clearTimeout(timer);

index = myindex;

changeIndex(index);

startMove(sliderPage, {left: -index * moveWidth}, function(){

lock = true;

timer = setTimeout(autoMove, 3000);

})

}

}(i))

}

//图片运动过程中改变index点的样式

function changeIndex(index){

for (var i = 0; i < indexArray.length; i++){

indexArray[i].className = '';

}

indexArray[index].className = 'active';

}

timer = setTimeout(autoMove, 3000);

//向左翻

leftBtn.onclick = function (){

autoMove('right->left');

}

//向右翻

rightBtn.onclick = function (){

autoMove('left->right');

}

//direction

//默认轮播方向 'left->right' / undefined

//点击left按钮 'right->left'

function autoMove(direction){

clearTimeout(timer);

if (lock){

lock = false;

if (!direction || direction === 'left->right'){

index++;

startMove(sliderPage, {left: sliderPage.offsetLeft - moveWidth}, function(){

if (sliderPage.offsetLeft === - num * moveWidth){

index = 0;

sliderPage.style.left = '0px';

}

timer = setTimeout(autoMove, 3000);

lock = true;

changeIndex(index);

});

}else if(direction === 'right->left'){

if (sliderPage.offsetLeft === 0){

index = num;

sliderPage.style.left = - num * moveWidth + 'px';

}

index--;

startMove(sliderPage, {left: sliderPage.offsetLeft + moveWidth}, function () {

timer = setTimeout(autoMove, 3000);

lock = true;

changeIndex(index);

})

}

}

}

以上即为通过原生JS运动所实现的图片轮播。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值