js实现轮播图效果 纯js实现图片自动切换


Posted in Javascript onAugust 09, 2020

本文实例为大家分享了纯js实现图片自动切换的具体代码,供大家参考,具体内容如下

1.鼠标经过的时候左右两个小按钮会自动弹出,自动播放停止,点击左右小按钮可以切换图片;
2. 鼠标离开,恢复自动播放;
3. 点击下方中间几个小圆圈,也会自动切换图片;

js实现轮播图效果 纯js实现图片自动切换

js实现轮播图效果 纯js实现图片自动切换

源代码:

<!DOCTYPE html>


<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
  * {
   margin: 0;
   padding: 0;
  }

  /* 轮播图盒子样式 */
  .lunbotu {
   position: relative;
   width: 520px;
   height: 280px;
   margin: 50px auto;
   background-color: blue;
   overflow: hidden;
  }

  /* 左右按钮样式 */
  .left,
  .right {
   display: none;
   position: absolute;
   top: 50%;
   margin-top: -15px;
   width: 30px;
   height: 30px;
   background-color: cornsilk;
   border-radius: 15px;
   text-align: center;
   line-height: 30px;
   cursor: pointer;
   z-index: 1;
  }

  .left {
   left: 0;
  }

  .right {

   right: 0;
  }


  li {
   list-style: none;
  }

  /* 设置图片的ul的样式 */
  .firstul {
   position: absolute;
   top: 0;
   left: 0;
   width: 500%;

  }

  .firstul li {
   float: left;
   /* display: none; */
  }

  /* 设置小圆圈的样式 */
  ol {
   /* width: 90px; */
   padding: 0 5px 0 5px;
   position: absolute;
   bottom: 10px;
   left: 50%;
   margin-left: -45px;
   background-color: darkgrey;
   text-align: center;
   border-radius: 9px;
  }

  ol li {
   display: inline-block;
   width: 15px;
   height: 15px;
   border-radius: 50%;
   margin-right: 5px;
   background-color: white;
   cursor: pointer;
  }

  .current {
   background-color: red;
  }
 </style>
 <script src="animation.js"></script>
</head>

<body>
 <!-- 图片大小全部是520*280 -->
 <div class="lunbotu">
  <!-- 左右按钮 -->
  <div class="left">></div>
  <div class="right"><</div>
    <!-- 图片部分 -->
    <ul class="firstul">
     <li><a href=""><img src=" images/1.jpg" alt=""> </a></li>
     <li><a href=""><img src=" images/2.jpg" alt=""> </a></li>
     <li><a href=""><img src=" images/3.gif" alt=""> </a></li>
     <li><a href=""><img src=" images/4.webp" alt=""> </a></li>
    </ul>
    <!-- 小圆圈 -->
    <ol class="firstol"></ol>
  </div>
  <!-- JS部分 -->
  <script>
   // 1.获取事件源
   var lunbotu = document.querySelector('.lunbotu');
   var leftBox = document.querySelector('.left');
   var rightBox = document.querySelector('.right');
   var ul = lunbotu.querySelector('ul');
   var ol = lunbotu.querySelector('ol');
   var right = document.querySelector('.right');
   var left = document.querySelector('.left');
   var lunbotuWidth = lunbotu.offsetWidth;
   // console.log(ul)
   // console.log(ol)
   // 第一步:
   // 鼠标经过轮播图的时候,左右小按钮弹出
   lunbotu.addEventListener('mouseenter', function () {
    leftBox.style.display = 'block';
    rightBox.style.display = 'block';
    // 鼠标经过轮播图的时候,停止定时器
    clearInterval(timer);
   })
   // 鼠标离开轮播图的时候,左右小按钮隐藏
   lunbotu.addEventListener('mouseleave', function () {
    leftBox.style.display = 'none';
    rightBox.style.display = 'none';
    timer = setInterval(function () {
     right.click();
    }, 2000)

   })
   // 第二步:
   // 1.动态生成小圆圈
   // 2.小圆圈的个数要跟图片一样
   // 3.先得到ul里面图片的张数(图片放入li里面,所以就是li的个数)
   // 4.利用循环动态生成小圆圈(这个小圆圈要放入ol里面)
   // 5.创建节点createElement('li')]
   // 6.插入节点ol.appendChild(li)
   // 7.第一个小圆圈需要添加current类
   for (var i = 0; i < ul.children.length; i++) {
    // 创建一个li
    var li = document.createElement('li')
    // 记录当前小圆圈的索引号 通过自定义属性来做
    li.setAttribute('index', i);
    // 把li添加到ol
    ol.appendChild(li);
   }
   // 排他思想:让小Li变白色
   for (var i = 0; i < ol.children.length; i++) {
    ol.children[i].addEventListener('click', function () {
     for (var i = 0; i < ol.children.length; i++) {
      ol.children[i].className = '';
     } this.className = 'current';

     // 点击小圆圈的时候切换到对应的图片
     // 得到索引号 index
     var index = this.getAttribute('index');
     // 解决小bug
     num = index;
     num_ol = index;
     // console.log(lunbotuWidth);
     // console.log(index)
     animation(ul, - index * lunbotuWidth)
    })
   }
   // 给第一个li变颜色
   ol.children[0].className = 'current';
   // 克隆第一个li
   var first = ul.children[0].cloneNode(true);
   ul.appendChild(first);
   // 第三步:
   // 点击右边按钮事件
   var num = 0;
   // 点击右侧按钮的时候小圆圈跟着滚动
   var num_ol = 0;
   // 节流阀,防止点击过快,最后才加这句优化
   var flag = true;
   // 右侧按钮:
   right.addEventListener('click', function () {
    if (flag) {
     flag = false; // 关闭节流阀
     if (num == ul.children.length - 1) {
      ul.style.left = 0;
      num = 0;
     }
     num++;
     animation(ul, -num * lunbotuWidth, function () {
      flag = true;
     });
     num_ol++;
     if (num_ol == ol.children.length) {
      num_ol = 0
     }
     for (var i = 0; i < ol.children.length; i++) {
      ol.children[i].className = '';
     }
     ol.children[num_ol].className = 'current';
    }
   });
   // 左侧按钮:
   left.addEventListener('click', function () {
    if (flag) {
     flag = false;
     if (num == 0) {
      ul.style.left = -(ul.children.length - 1) * lunbotuWidth + 'px';
      num = ul.children.length - 1;
     }
     num--;
     animation(ul, -num * lunbotuWidth, function () {
      flag = true;
     });
     num_ol--;
     // num_ol=0的时候需要,点击左侧按钮,需要转跳到ol.children.length-1的位置
     if (num_ol < 0) {
      num_ol = ol.children.length - 1
     }
     for (var i = 0; i < ol.children.length; i++) {
      ol.children[i].className = '';
     }
     ol.children[num_ol].className = 'current';
    }
   });
   // 自动播放图片
   var timer = setInterval(function () {
    right.click();
   }, 2000)
  </script>
</body>
</html>

5.Js文件的代码

// 封装了一个动画js文件
function animation(obj,target,fn1){
 // console.log(fn1);
 // fn是一个回调函数,在定时器结束的时候添加
 // 每次开定时器之前先清除掉定时器
 clearInterval( obj.timer);
 obj.timer = setInterval(function(){
 // 步长计算公式 越来越小
 // 步长取整
 var step = (target - obj.offsetLeft) /10;
 step = step > 0 ? Math.ceil(step) :Math.floor(step); 

 if(obj.offsetLeft == target){
  clearInterval( obj.timer);
  // 如果fn1存在,调用fn
  if(fn1){
  fn1();
  }
 }else{
  // 每50毫秒就将新的值给obj.left
 obj.style.left = obj.offsetLeft +step +'px';
 }
 },30)
}

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

Javascript 相关文章推荐
javaScript 简单验证代码(用户名,密码,邮箱)
Sep 28 Javascript
JQuery Easyui Tree的oncheck事件实现代码
May 28 Javascript
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
Jquery插件easyUi表单验证提交(示例代码)
Dec 30 Javascript
javascript数组操作方法小结和3个属性详细介绍
Jul 05 Javascript
js使用post 方式打开新窗口
Feb 26 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
Jul 01 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
又一枚精彩的弹幕效果jQuery实现
Jul 25 Javascript
仿京东快报向上滚动的实例
Dec 13 Javascript
vue配置font-awesome5的方法步骤
Jan 27 Javascript
vue 子组件watch监听不到prop的解决
Aug 09 #Javascript
vue 重塑数组之修改数组指定index的值操作
Aug 09 #Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
Aug 09 #Javascript
bootstrap实现tab选项卡切换
Aug 09 #Javascript
vue动画—通过钩子函数实现半场动画操作
Aug 09 #Javascript
js利用iframe实现选项卡效果
Aug 09 #Javascript
解决vue 退出动画无效的问题
Aug 09 #Javascript
You might like
索尼ICF-SW100收音机评测
2021/03/02 无线电
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
python基础练习之几个简单的游戏
2017/11/10 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Python 私有化操作实例分析
2019/11/21 Python
opencv python图像梯度实例详解
2020/02/04 Python
python统计字符的个数代码实例
2020/02/07 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
Python如何通过百度翻译API实现翻译功能
2020/04/02 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
家长评语大全
2014/01/22 职场文书
书法比赛获奖感言
2014/02/10 职场文书
科级干部考察材料
2014/02/15 职场文书
协议书样本
2014/04/23 职场文书
求职简历自荐信
2014/06/18 职场文书
故宫英文导游词
2015/01/31 职场文书