原生js轮播特效


Posted in Javascript onMay 18, 2017

作为一名前端工程师,手写轮播图应该是最基本掌握的技能,以下是我自己原生js写的轮播,欢迎指点批评:

原生js轮播特效

首先css代码

a{text-decoration:none;color:#3DBBF5;}
   *{
    margin: 0;
    padding: 0;
   }
   .wrapper{
    width: 400px;
    height: 300px;
    margin: 100px auto;
   }
   #lunbo{
    position: relative;
    overflow: hidden;
   }
   #list{
    position: relative;
    white-space: nowrap; // 这块用行元素模拟,所以才用该属性,块元素可修改这块
   }
   #list span{
    display: inline-block;
    width: 400px;
    height: 300px;
    text-align: center;
    line-height: 300px;
    font-weight: bold;
    font-size: 100px;
    color: #fff;
   }
   #buttons{
    position: absolute;
    bottom: 0;
    text-align: center;
    width: 100%;
    height: 40px;
    line-height: 40px;
   }
   #buttons span{
    display: inline-block;
    width: 15px;
    height: 5px;
    background: #fff;
    margin: 0 10px;
    cursor: pointer;
    transition: all .5s;
   }
   #buttons span.on{
    height: 20px;
   }
   .arrow{
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    font-size: 80px;
    font-weight: bold;
    color: #fff;
    opacity: .3;
    transition: all .5s;
   }
   .wrapper:hover .arrow{
    opacity: 1;
   }
   #prev{
    left: 10px;
   }
   #next{
    right: 10px;
   }

然后HTML代码

<div class="wrapper">
   <div id="lunbo">
    <div id="list" style="left: -400px;">
     <span style="background:yellow;">5</span><span style="background: red;">1</span><span style="background:black;">2</span><span style="background:green;">3</span><span style="background:blue;">4</span><span style="background:yellow;">5</span><span style="background: red;">1</span>
    </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>
  </div>

最后js代码

window.onload=function () {
   var lunBo = document.getElementById("lunbo");
   var list = document.getElementById("list");
   var btn = document.getElementById("buttons").getElementsByTagName('span');
   var prev = document.getElementById("prev");
   var next = document.getElementById('next');
   var interval = 3000;
   var timer;
   var index = 1;
   var animated = false;
   for (var i=0;i<btn.length;i++) { //按钮加点击事件
    btn[i].onclick=function () {
     if(this.className=='on') //如果是状态按钮直接返回节约资源
     {
      return
     };
     var myIndex =parseInt(this.getAttribute('index'));//获取按钮的index属性值
     var offset = -400*(myIndex-index); //根据属性值 计算偏移量
     animate(offset)  //轮播动画
     index = myIndex; // 改变索引值
     showBtn();   //显示状态按钮
    }
   }
   function showBtn () { 
    for (var i=0;i<btn.length;i++) {
     btn[i].className=''; 
    }
    btn[index-1].className='on';
   }
   prev.onclick=function () { //上一页事件
    if (animated) { //如果是动画状态 直接返回解决bug
     return;
    }
    if (index==1) { 
     index =btn.length;
    } else{
     index-=1;
    }
    animate(400); 
    showBtn();
   }
   next.onclick=function () {
    if (animated) {
     return;
    }
    if (index==btn.length) {
     index =1;
    } else{
     index+=1;
    }
    animate(-400);
    showBtn();
   }
   function animate(offset) {
    animated = true; //表示在动画状态
    var newLeft = parseInt(list.style.left) + offset; //计算新的left值
    var time = 400; //设置动画总时间
    var interval = 10; //动画帧时间
    var speed = offset/(time/interval); //每帧运动距离
    function go () { 
     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) 
     } else{
      animated = false; //动画状态结束
      list.style.left = newLeft + 'px'; //现在的位移
      if (parseInt(list.style.left)<-2000) { // 辅助假图
       list.style.left = -400 + 'px';
      } else if( parseInt(list.style.left)>-400){
       list.style.left = -2000 + 'px';
      }
     }
    }
    go();
   }
   function play () { 
    timer = setTimeout(function () {
     next.onclick();
     play();
    },interval)
   }
   play();
   function stop () {
    clearTimeout(timer);
   }
   lunBo.onmouseover=stop;
   lunBo.onmouseout=play;
  }

以上是所有代码,欢迎指点交流!

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

Javascript 相关文章推荐
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
jquery实现select选中行、列合计示例
Apr 25 Javascript
JavaScript实现的多种鼠标拖放效果
Nov 03 Javascript
详解AngularJS控制器的使用
Mar 09 Javascript
Bootstrap基本样式学习笔记之图片(6)
Dec 07 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
JS中input表单隐藏域及其使用方法
Feb 13 Javascript
基于Node.js的WebSocket通信实现
Mar 11 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
Nov 01 Javascript
JavaScript canvas实现文字时钟
Jan 10 Javascript
js实现放大镜特效
May 18 #Javascript
vue v-on监听事件详解
May 17 #Javascript
vue v-model表单控件绑定详解
May 17 #Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
May 17 #Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 #Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
May 17 #Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 #Javascript
You might like
php防注
2007/01/15 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
python实现数据图表
2017/07/29 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
python中reader的next用法
2018/07/24 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
使用python绘制温度变化雷达图
2019/10/18 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
中专生求职自荐信范文
2013/12/22 职场文书
好的演讲稿开场白
2013/12/30 职场文书
运动会演讲稿50字
2014/08/25 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
使用Ajax实现进度条的绘制
2022/04/07 Javascript
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python