原生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 相关文章推荐
网页图片延时加载的js代码
Apr 22 Javascript
基于JQUERY的多级联动代码
Jan 24 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
May 22 Javascript
2014 年最热门的21款JavaScript框架推荐
Dec 25 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
May 01 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
Jan 04 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
js实现文字超出部分用省略号代替实例代码
Sep 01 Javascript
Iview Table组件中各种组件扩展的使用
Oct 20 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 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程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
一个数据采集类
2007/02/14 PHP
php里array_work用法实例分析
2015/07/13 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
详细分析Python垃圾回收机制
2020/07/01 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
小学教师办公室制度
2014/02/03 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
个人批评与自我批评
2014/10/15 职场文书
置业顾问岗位职责
2015/02/09 职场文书
博士导师推荐信
2015/03/25 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
Oracle使用别名的好处
2022/04/19 Oracle
mybatis 获取更新记录的id
2022/05/20 Java/Android