原生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 相关文章推荐
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 Javascript
JavaScript移除数组元素减少长度的方法
Sep 05 Javascript
js替代copy(示例代码)
Nov 27 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
javascript实现前端成语点击验证优化
Jun 24 Javascript
让Vue响应Map或Set的变化操作
Nov 11 Javascript
javascript实现点击小图显示大图
Nov 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
js验证账户名是否重复
2020/05/26 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
python类型强制转换long to int的代码
2013/02/10 Python
详细介绍Python中的偏函数
2015/04/27 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
百丽国际旗下购物网站:优购
2017/02/28 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
电子工程专业毕业生求职信
2014/03/14 职场文书
员工培训协议书
2014/09/15 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书