原生js实现无限循环轮播图效果


Posted in Javascript onJanuary 20, 2017

知识要点

1.实现无限循环的原理:

以偏移的距离来判断是否跳回第一张和最后一张

也可以利用循环判断图片的当前索引值

var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量
list.style.left=newLeft+"px";//当前的偏移值=新的偏移值
//以偏移的距离来判断是否跳回第一张和最后一张
if(newLeft>-600){
 list.style.left=-3000+"px";
}
if (newLeft<-3000){
 list.style.left=-600+"px";
}

2.当前图片轮播的圆点变色显示:

因为每次点击index+1 所以当前的index-1就是button的索引

//添加on前先清空on
for(var i=0;i<buttons.length;i++){
 if(buttons[i].className=="on"){
 buttons[i].className="";
 break;
 }
}
buttons[index-1].className="on";

3.实现动画滚动效果:

原理就是把每次的偏移量分为多次完成比如一次600px那就分为10次每次偏移60px

就要用到setTimeout(go,10);//10毫秒再次调用go函数,一直到不满足条件就停

var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量
var time=300;//位移总时间
var interval=10;//位移间隔时间
//动画效果自定义公式: 每次位移的距离=单次偏移距离/位移次数
var speed=offset/(time/interval);
//递归函数 直到不满足条件(跳到辅助图)
//递归就是把600偏移量分为多次完成偏移
function go(){
 //speed<0 并且 当前偏移量>下一次偏移量 就是向左偏移 || 反之向右偏移 
 if ((speed<0 &&parseInt(list.style.left)>newLeft) || (speed>0 &&parseInt(list.style.left)<newLeft)) {
 list.style.left=parseInt(list.style.left)+speed+"px";//每次位移的值
 setTimeout(go,interval);//10毫秒再次调用go函数
 }else{
 animated=false;
 list.style.left=newLeft+"px";//当前的偏移值=新的偏移值
 if(newLeft>-600){
 list.style.left=-3000+"px";
 }
 if (newLeft<-3000){
 list.style.left=-600+"px";
 }
 }
}

4.点击圆点按钮执行动画:

原理获取当前的按钮位置再获取要点击的按钮的位置

用(点击的——当前的)*-600=需要跳转的正负距离(向左或向右)

for(var i=0;i<buttons.length;i++){
 buttons[i].onclick=function(){
 if(this.className=="on"){
 return;
 }
 //要点击的index属性的值 转换为整数
 var myIndex=parseInt(this.getAttribute("index"));
 //偏移量=-600*(要点击的位置-当前所在的位置),当前的位置就是index循环所得
 var os=-600*(myIndex-index);
 //切换完成后,把点击的index位置变成当前的index位置 
 index=myIndex;
 showButton();
 if(!animated){
 animate(os);
 }
 }
}

5.自动播放:

给外层容器加个onmouseover事件再调用setInterval方法

//给方法定义全局变量是因为停止的时候要使用
function play(){
 timer=setInterval(function(){
 next.onclick();
 },3000);
}
clearInterval(timer)

完整代码

注:图片链接本地替换一下

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>demo</title>
<style>
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0;}
h1,h2,h3,h4,h5,h6{font-size:100%;}
address,cite,dfn,em,var{font-style:normal;}
code,kbd,pre,samp{font-family:courier new,courier,monospace;}
ul,ol{list-style:none;}
a{text-decoration:none;}
a:hover{text-decoration:none;}
sup{vertical-align:text-top;}
sub{vertical-align:text-bottom;}
legend{color:#000;}
fieldset,img{border:0;}
button,input,select,textarea{font-size:100%;}
table{border-collapse:collapse;border-spacing:0;}
.clear{clear: both;float: none;height: 0;overflow: hidden;}
#container{width: 600px; height: 400px; overflow: hidden; position: relative; }
#list{width: 4200px; height: 400px; position: absolute; z-index: 1;}
#list img{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> 
</head> 
<body>
 <div id="container">
 <div id="list" style="left: -600px;">
 <img src="images/5.jpg" alt="5"/>  
  <img src="images/1.jpg" alt="1"/>
  <img src="images/2.jpg" alt="2"/>
  <img src="images/3.jpg" alt="3"/>
  <img src="images/4.jpg" alt="4"/>
  <img src="images/5.jpg" alt="5"/>
  <img src="images/1.jpg" alt="1"/>
 </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>
 <script type="text/javascript">
 //在页面加载完后立即执行多个函数方案。
 function addloadEvent(func){
 var oldonload=window.onload;
 if(typeof window.onload !="function"){
  window.onload=func;
 }
 else{
  window.onload=function(){
  if(oldonload){
   oldonload(); 
  }
  func();
  }
 }
 }
 //在页面加载完后立即执行多个函数方案结束。
 addloadEvent(lbt);
 //轮播图动画切换原理
 function lbt(){
 var container=document.getElementById("container");
 var prev=document.getElementById("prev");
 var next=document.getElementById("next");
 var list=document.getElementById("list");
 var buttons=document.getElementById("buttons").getElementsByTagName("span");
 var imgs=list.getElementsByTagName("img");
 var index=1;
 var animated=false;
 var timer;
 //当前图片轮播的圆点变色显示,原理:index数值是跟随list滑动次数递增的,第一次index=1,所以第一个button的索引值就是0。
 //for循环是添加on样式之前要清空之前的on。
 function showButton(){
 for(var i=0;i<buttons.length;i++){
 if(buttons[i].className=="on"){
 buttons[i].className="";
 break;
 }
 }
 buttons[index-1].className="on";
 }
 //圆点变色显示 结束。
 function animate(offset){
 animated=true;
 var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量
 var time=300;//位移总时间
 var interval=10;//位移间隔时间
 //动画效果自定义公式: 每次位移的距离=单次偏移距离/位移次数
 var speed=offset/(time/interval);
 //递归函数 直到不满足条件(跳到辅助图)
 //递归就是把600偏移量分为多次完成偏移
 function go(){
 //speed<0 并且 当前偏移量>下一次偏移量 就是向左偏移 || 反之向右偏移 
 if ((speed<0 &&parseInt(list.style.left)>newLeft) || (speed>0 &&parseInt(list.style.left)<newLeft)) {
 list.style.left=parseInt(list.style.left)+speed+"px";//每次位移的值
 setTimeout(go,interval);//10毫秒再次调用go函数
 }else{
 animated=false;
 list.style.left=newLeft+"px";//当前的偏移值=新的偏移值
 if(newLeft>-600){
 list.style.left=-3000+"px";
 }
 if (newLeft<-3000){
 list.style.left=-600+"px";
 }
 }
 }
 go();
 }
 //自动播放3秒执行一次next.onclick
 function play(){
 timer=setInterval(function(){
 next.onclick();
 },3000);
 }
 function stop(){
 clearInterval(timer);
 }
 //执行所有函数
 next.onclick=function(){
 if(index==5){
 index=1;
 }else{
 index+=1;
 }
 showButton();
 if(!animated){
 animate(-600);
 }
 }
 //执行所有函数
 prev.onclick=function(){
 if(index==1){
 index=5;
 }else{
 index-=1;
 }
 showButton();
 if(!animated){
 animate(600);
 }
 }
 //点击圆点按钮 偏移
 for(var i=0;i<buttons.length;i++){
 buttons[i].onclick=function(){
 if(this.className=="on"){
 return;
 }
 //要点击的index属性的值 转换为整数
 var myIndex=parseInt(this.getAttribute("index"));
 //偏移量=-600*(要点击的位置-当前所在的位置),当前的位置就是index循环所得
 var os=-600*(myIndex-index);
 //切换完成后,把点击的index位置变成当前的index位置 
 index=myIndex;
 showButton();
 if(!animated){
 animate(os);
 }
 }
 }
 container.onmouseover=stop;
 container.onmouseout=play;
 play();
 }
 </script>
</body> 
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript 写类方式之五
Jul 05 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
使用js实现关闭js弹出层的窗口
Feb 10 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
javascript函数特点实例分析
May 14 Javascript
js面向对象的写法
Feb 19 Javascript
JS原型链怎么理解
Jun 27 Javascript
jQuery设置Easyui校验规则(推荐)
Nov 21 Javascript
详解jQuery中的easyui
Sep 02 jQuery
解决新建一个vue项目过程中遇到的问题
Oct 22 Javascript
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
原生js实现弹出层效果
Jan 20 #Javascript
jQuery中DOM节点删除之empty与remove
Jan 20 #Javascript
原生js实现图片放大缩小计时器效果
Jan 20 #Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 #Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 #Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
Jan 20 #Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
Jan 20 #Javascript
You might like
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
php基础知识:类与对象(1)
2006/12/13 PHP
第五章 php数组操作
2011/12/30 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php构造函数的继承方法
2015/02/09 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
施工安全协议书
2013/12/11 职场文书
党员学习十八大感想
2014/01/17 职场文书
高一地理教学反思
2014/01/18 职场文书
模范教师事迹材料
2014/02/10 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
单位租车协议书
2015/01/29 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
oracle通过存储过程上传list保存功能
2021/05/12 Oracle