原生JS实现图片轮播切换效果


Posted in Javascript onDecember 15, 2016

首先来分析一下轮播图效果的实现原理:

1、父元素作为显示窗口,大小固定超出部分隐藏,即设置overflow:hidden;

2、子元素存放图片列表用ul,ul固定定位,参照为父元素,即父元素position:relative;ul元素position:absolute;

3、一个li即一张图片的宽度为父元素的显示宽度

4、初始时,ul的left为0,这时第一张图片即第一个li显示

5、点击下一张按钮,将整个ul左移,使第二个li对齐父元素的左边框,此时ul的left为负的一个li的宽度

6、点击上一张按钮,将整个ul右移

7、对特殊情况进行处理,即第一张图时点上一张,最后一张图时点下一张

第一张图时点上一张,我们滚动到最后一张图,整个ul左移,即把left值改为负的n-1张图的宽度;

最后一张图时点下一张,我们滚到第一张图的位置,整个ul右移,即把left值改为0

用一张图来帮助理解:

原生JS实现图片轮播切换效果

修改ul元素的left值很简单ul.style.left=设定值,就可以了,但我们想有一个滑动的效果,那我们需要用setInterval来实现

最后的效果如下:

原生JS实现图片轮播切换效果

动图不能录制太大CSDN有2M的限制_(:з?∠)_

下面放代码

script部分

<script>
 window.onload= function () {
  var nav=document.getElementById("nav").getElementsByTagName("li");
  var img=document.getElementById("imgList");
  var prev=document.getElementById("prev");
  var next=document.getElementById("next");
  var index=0;//当前图片序列号
  var timer;//定时器名字
  var iSpeed=-10;//滚动的速度
  function goRoll(){
   timer=setInterval(function () {
    img.style.left=img.offsetLeft+iSpeed+'px';
    var stop=-index*870+'px';//当达到目标位置是停止定时器
    if(img.style.left==stop){
     iSpeed=-10;
     clearInterval(timer);
    }
   },10)
  }
//  上一张和下一张点击效果
  prev.onclick= function () {
   if(index==0){
    index=2;
    iSpeed=-20;
   }else{
    index--;
    iSpeed=10;
   }
   goRoll();
   //img.style.left=-index*870+'px';

  };
  next.onclick= function () {
   if(index==2){
    index=0;
    iSpeed=20;
   }else{
    index++;
    iSpeed=-10;
   }
   goRoll();
   //img.style.left=-index*870+'px';
  };
 }
</script>

html放一下

<div class="panel center-panel bc_rice">
 <div class="panel-box">
  <a class="prev-btn" id="prev"></a>
  <div class="img-box">
   <div class="list-box">
    <ul class="img-list" id="imgList">
     <li>
      <img src="img/c1.jpg"/>
     </li>
     <li>
      <img src="img/c2.jpg"/>
     </li>
     <li>
      <img src="img/c3.jpg"/>
     </li>
    </ul>
   </div>
  </div>
  <a class="next-btn" id="next"></a>
  <img class="mT20" src="img/shadow1.png"/>
 </div>
 <div class="center-line bc_brown"></div>
</div>

CSS放一下

.fb{font-weight:bold;}
.c_fff{color:#fff;}
.f24{font-size:24px;}
.f72{font-size:72px;}
.lh40{line-height:40px;}
.bc_brown{background:#533d3b;}
.bc_green{background:#74cdab;}
.bc_rice{background:#ecf1c8;}
.bc_beige{background:#d1d5b0;}
.mT10{margin-top:10px;}
.mT20{margin-top:20px;}
.mT30{margin-top:30px;}
.mT40{margin-top:40px;}
.tc{text-align:center;}
.dblock{display:block;}
.clearfix:after{content:'';display:block;visibility:hidden;clear:both;line-height:0;font-size:0;}
.clearfix{zoom:1;}
html,body{width:100%;height:100%;font-size:14px;font-family:Myriad Pro;color:#433c3c;}
div,p,a,span,ul,li,em{margin:0;padding:0;}
ul li{list-style-type:none;}
a:hover{cursor:pointer;}
/*main-panel*/
.main-panel{width:100%;min-width:1030px;margin:0 auto;}
.main-panel .panel{width:100%;}
.main-panel .panel .line{width:100%;height:23px;background:url('../img/line.png');}
.main-panel .panel .panel-box{width:960px;height:100%;margin:0 auto;overflow:hidden;position:relative;}
.center-panel{height:510px;position:relative;}
.center-panel .panel-box{width:990px;z-index:1000;}
.center-panel .center-line{height:76px;position:absolute;width:100%;top:200px;z-index:10;}
.center-panel .panel-box a{width:51px;height:82px;display:block;position:absolute;top:200px;}
.center-panel .prev-btn{background:url('../img/Button-left.png');left:0;}
.center-panel .next-btn{background:url('../img/Button-right.png');right:0;}
.center-panel .img-box{width:940px;height:366px;background:url('../img/shadow.png');margin-top:45px;margin-left:10px;overflow:hidden;}
.center-panel .list-box{width:870px;height:334px;margin:16px auto;overflow:hidden;position:relative;}
.center-panel .img-list{width:4000px;height:334px;position:absolute;left:0;}
.center-panel .img-list li{width:870px;height:100%;float:left;}

因为我写了一整个页面都放出来没啥用,所以我只截取了用到的部分。
现在还是有些问题的,比如如果点击过快是会出问题的,这个以后看看能不能完善。

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

Javascript 相关文章推荐
强制设为首页代码
Jun 19 Javascript
jQuery创建插件的代码分析
Apr 14 Javascript
iframe 异步加载技术及性能分析
Jul 19 Javascript
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
jQuery切换所有复选框选中状态的方法
Jul 02 Javascript
js实现YouKu的漂亮搜索框效果
Aug 19 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
JS延时器提示框的应用实例代码解析
Apr 27 Javascript
jquery 正整数数字校验正则表达式
Jan 10 Javascript
vue后台管理之动态加载路由的方法
Aug 13 Javascript
javascript canvas封装动态时钟
Sep 30 Javascript
vscode中使用npm安装babel的方法
Aug 02 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Dec 15 #Javascript
利用vue写todolist单页应用
Dec 15 #Javascript
jquery插件bootstrapValidator表单验证详解
Dec 15 #Javascript
jQuery中的100个技巧汇总
Dec 15 #Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Dec 14 #Javascript
详解jQuery中的事件
Dec 14 #Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 #Javascript
You might like
php IP及IP段进行访问限制的代码
2008/12/17 PHP
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
jquery each()源代码
2011/02/14 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
vue 动态表单开发方法案例详解
2019/12/02 Javascript
Python 字符串操作方法大全
2014/03/11 Python
python使用Berkeley DB数据库实例
2014/09/26 Python
详解详解Python中writelines()方法的使用
2015/05/25 Python
Python lxml模块安装教程
2015/06/02 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
Django中提示消息messages的设置方式
2019/11/15 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
奥地利网上书店:Weltbild
2017/07/14 全球购物
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
新学期国旗下演讲稿
2014/05/08 职场文书
绿色校园广播稿
2014/10/13 职场文书
中秋节慰问信
2015/02/15 职场文书
公司年会主持词范文!
2019/05/07 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL