原生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 相关文章推荐
javascript让setInteval里的函数参数中的this指向特定的对象
Jan 31 Javascript
javascript中substring()、substr()、slice()的区别
Aug 30 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
js实现简单的网页换肤效果
Jan 18 Javascript
js实现按座位号抽奖
Apr 05 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
Vue2几种常见开局方式详解
Sep 09 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
Dec 25 Javascript
vue中$nextTick的用法讲解
Jan 17 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
Mar 04 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
JS异步宏队列与微队列原理区别详解
Jul 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 分页类 扩展代码
2009/06/11 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
php多任务程序实例解析
2014/07/19 PHP
基于jQuery的history历史记录插件
2010/12/11 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
python多线程编程方式分析示例详解
2013/12/06 Python
Python中使用PDB库调试程序
2015/04/05 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
python Celery定时任务的示例
2018/03/13 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
python中re模块知识点总结
2021/01/17 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
欢迎家长标语
2014/10/08 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
英语辞职信范文
2015/02/28 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python