原生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动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
js调用css属性写法
Sep 21 Javascript
jQuery中queue()方法用法实例
Dec 29 Javascript
javascript中substring()、substr()、slice()的区别
Aug 30 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
js实现随机抽选效果、随机抽选红色球效果
Jan 13 Javascript
深入浅出es6模板字符串
Aug 26 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
JavaScript定时器使用方法详解
Mar 26 Javascript
js实现碰撞检测
Jan 29 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
MVC模式的PHP实现
2006/10/09 PHP
php四种定界符详解
2017/02/16 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
Python实现周期性抓取网页内容的方法
2015/11/04 Python
浅析Python中的多条件排序实现
2016/06/07 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
室内设计专业个人的自我评价
2013/12/18 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
亲属关系公证书样本
2015/01/23 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
Python实现文字pdf转换图片pdf效果
2022/04/03 Python