通过轮播图例子复习封装动画函数和定时器

概述:使用js实现自动播放、无缝连接的轮播图

图片轮播的实质是改变图片相对于父对象的左边距的值,利用offsetLeft获取,利用style.left修改

封装动画函数如下:
function animate(element,target)
{

clearInterval(element.timeId);
element.timeId=setInterval(function(){
var current=element.offsetLeft;
var step=10;
step=target>current?step:-step;
current+=step;
if(Math.abs(target-current)<Math.abs(step))
{
current+=step;
element.style.left=current+"px";
}
else
{
element.style.left=target+"px";
clearInterval(element.timeId);
}
},20)

}

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:0;
padding: 0;

}
.all
{
width: 580px;
height: 360px;

border: 1px solid red;
margin:auto;
position: relative;
overflow: hidden;
}
.screen
{
width: 580px;
height: 360px;

}
ul
{
list-style: none;
width: 2900px;
height: 360px;
position: absolute;

}
ul img
{
float: left;
width: 580px;
height: 360px;

}
ol
{
list-style: none;
position: absolute;
right: 3px;
bottom: 5px;

}
ol li
{
margin-left: 5px;
width: 20px;
height: 20px;
float: left;
border: 1px solid green;
cursor: pointer;
}
#arr
{
width: 580px;
height: 20px;
position: absolute;
left:3px;
top:180px;
margin-top: -10px;
display: none;
}
#left
{
width: 40px;
height: 20px;
background-color: lightgrey;
position: absolute;
left:0;
line-height: 20px;
text-align: center;

}
#right
{
width: 40px;
height: 20px;
background-color: lightgrey;
position: absolute;
right:0;
line-height: 20px;
text-align: center;

}
.current
{
background-color: red;
}

</style>
</head>
<body>
<div class="all" id="box">
<div class="screen">
<ul>
<li><img src="../image/01.jpg" ></li>
<li><img src="../image/02.jpg" ></li>
<li><img src="../image/taobao.jpg" ></li>
<li><img src="../image/yifan.jpg" ></li>
</ul>
<ol></ol>
</div>
<div id="arr">
<span id="left"><</span>
<span id="right">></span>
</div>

</div>

<script src="../js/common.js"></script>
<script>

//移动函数
function animate(element,target)
{

clearInterval(element.timeId);
element.timeId=setInterval(function(){
var current=element.offsetLeft;
var step=10;
step=target>current?step:-step;
current+=step;
if(Math.abs(target-current)<Math.abs(step))
{
current+=step;
element.style.left=current+"px";
}
else
{
element.style.left=target+"px";
clearInterval(element.timeId);
}
},20)

}
function clickHandle()
{
console.log(pic);
if(pic==liObj1.length-1)
{
pic=0;
ulObj.style.left=0+"px";
}
pic++;
animate(ulObj,-pic*imgWidth);
console.log("hhhhh"+pic);
if(pic==liObj1.length-1)
{
liObj2[0].setAttribute("class","current");
liObj2[liObj2.length-1].removeAttribute("class");

}
else
{
console.log(pic);
for(var i=0;i<liObj1.length-1;i++)
{
liObj2[i].removeAttribute("class");
}
liObj2[pic].setAttribute("class","current");

}

}

//获取元素
var box=my$("box");
var screen=box.children[0];
var ulObj=screen.children[0];
var olObj=screen.children[1];
var liObj1=ulObj.children;
var liObj2=olObj.children;
var imgWidth=screen.offsetWidth;
var arr=my$("arr");
var left=my$("left");
var right=my$("right");
var pic=0;

//根据图片元素个数在ol中添加添加li
for(var i=0;i<liObj1.length;i++)
{
var li=document.createElement("li");
olObj.appendChild(li);
li.innerHTML=(i+1);
li.setAttribute("index",i);
olObj.children[0].setAttribute("class","current");
//为每个li添加鼠标经过事件
li.onmouseover=function()
{
pic=this.getAttribute("index")
console.log(-pic*imgWidth);
animate(ulObj,-pic*imgWidth);

for(var j=0;j<olObj.children.length;j++)
{
olObj.children[j].removeAttribute("class");

}
this.setAttribute("class","current");
}
}
ulObj.appendChild(ulObj.children[0].cloneNode(true));

var timeId=setInterval(clickHandle,1000);//设置自动播放,加载时设置一个定时器 鼠标经过停止,鼠标退出继续
//为box添加鼠标经过就出现左右焦点事件
box.onmouseover=function()
{
arr.style.display="block";
clearInterval(timeId);

}
box.onmouseout=function()
{
arr.style.display="none";
timeId=setInterval(clickHandle,1000);

}
//为左右焦点绑定点击事件
right.onclick=clickHandle;
left.onclick=function()
{
if(pic==0)//如果是第一个图片要向左则先定位到第五张再向左
{
pic=liObj2.length;
}
pic--;
console.log(pic);
animate(ulObj,-pic*imgWidth);

if(pic==liObj1.length-1)//如果是第最后张图片则将第一个按钮变颜色最后一个按钮无颜色
{
liObj2[0].setAttribute("class","current");
liObj2[liObj2.length-1].removeAttribute("class");

}
else
{
console.log(pic);
for(var i=0;i<liObj1.length-1;i++)
{
liObj2[i].removeAttribute("class");
}
liObj2[pic].setAttribute("class","current");

}

}

</script>

</body>
</html>

原文地址:https://www.cnblogs.com/front-end0829/p/10360611.html

时间: 2024-11-25 21:29:25

通过轮播图例子复习封装动画函数和定时器的相关文章

用原生js封装轮播图

原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不懂的可以直接私信我 slide.js /* * 轮播图 */ function Slide(elem, ms, d, ind){ this.el = elem; this.w = parseInt(getStyle(elem, "width")); this.h = parseInt(ge

简要分析javascript的选项卡和轮播图

选项卡 思路 1.按钮和展示的页面要对应:分别遍历,记住当前按钮的索引,让其成为展示页面的索引 2.只出现所对应的页面:所有的页面隐藏,只展示想要的页面 只展示js代码 for(var i=0;i<input.length;i++){ input[i].index=i //让浏览器解析HTML文档时,保存每一个input的索引 input[i].onclick=function(){ for(var j=0;j<div.length;j++){ //所有的div为隐藏 div[j].style

axure 轮播图

axure设置轮播图详细流程,有问题欢迎指正,直接上流程,demo下载 :https://files.cnblogs.com/files/fannyLi/%E8%BD%AE%E6%92%AD%E5%9B%BE.rp.zip 1.打开axure新建一个页面,拖入动态面板 2.双击动态面板,弹出面板管理,填写动态面板名称:轮播图,点击绿色加号添加3个面板状态(个数根据需求而定) 3.双击动态面板中的轮播图一进入状态一,添加一张图片 4.动态面板中轮播图二.三同上,各添加一张图片 5.回到index页

JS 无缝轮播图1-节点操作

无缝轮播图 (使用节点操作) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> *{ padding:0; margin:0; } body{ background:#F5F5F5; } #content{ width:300px; height:200px;

08第二种定时器_封装动画函数_轮播图_offset系列

前面复习: 下面会说第二种定时器. 第二种定时器: 第一种的定时器回顾: 另一个定时器 setTimeout() 它是一个一次性的定时器: 因为,代码是从上往下执行的,btn 还没有生成,所以getElementById("btn").onclick = 肯定是会报错的. 它是一次性的定时器,如果没有取消的话,它会一直占着空间,所以一般都要写按钮btn 去取消timeId  . 1 <!DOCTYPE> 2 <html lang="en">

JavaScript动画:offset和匀速动画详解(含轮播图的实现)

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. offset简介 我们知道,三大家族包括:offset/scroll/client.今天来讲一下offset,以及与其相关的匀速动画. offset的中文是:偏移,补偿,位移. js中有一套方便的获取元素尺寸的办法就是offset家族.offset家族包括: offsetWidth offsetHight offsetLeft offsetTop offsetParen

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

如何用面向对象的思维去封装一个小型轮播图插件

1.面向对象与面向过程 既然说到面向对象的思维,那就免不了要对面向过程的编程思维与面向对象的思维做一番比较. 笔者有 一段时间天真的认为有一个类,然后new一个对象就是面向对象编程了,现在想想还是太naive了呀. 其实面向对象的编程思维和面向过程的编程思维重要的不是对象和过程,而是思维. 比如说在生活中我们要做一道西红柿炒鸡蛋,很多人的第一反应就是西红柿炒鸡蛋第一步.第二步.第三步应该怎么做,每一步放什么调料.然后在做的过程中找每一步需要的调料.这就是很典型的面向过程的思维方式:怎么做,需要什

js动画之轮播图

一. 使用Css3动画实现 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> body,ul{ list-style: none; } .outer{ width: 750px; height: 366px; margin: 100px auto;