如何使用JavaScript实现无缝滚动自动播放轮播图效果


Posted in Javascript onAugust 20, 2020

在一些项目开发中,我们经常需要使用到轮播图,但是没有深入学习的情况下做轮播图是非常困难的。

如何使用JavaScript实现无缝滚动自动播放轮播图效果

思路

分成小问题来解决

1. 动态生成序号12345

如何使用JavaScript实现无缝滚动自动播放轮播图效果

页面有多少li(图片),就有多少序号

2. 点击序号、显示高亮、切换图片

2.1 给序号注册onclick事件

2.2 取消其他序号高亮显示,让当前点击的序号高亮显示

2.3 点击序号,动画的方式切换到当前点击的图片位置(设置自定义属性,记录当前索引,有了索引就可用动画进行移动)

如何使用JavaScript实现无缝滚动自动播放轮播图效果

3. 鼠标放到盒子上的时候显示左右箭头,移开时候隐藏

onmouseenter和onmouseleave

如何使用JavaScript实现无缝滚动自动播放轮播图效果

4. 实现左右箭头播放上一张下一张(无缝滚动)

如何使用JavaScript实现无缝滚动自动播放轮播图效果

5. 隔多少时间自动播放

setIntervalelement1..click() 联合即可实现

代码: index.html:

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
      * {
        padding: 0;
        margin: 0;
        list-style: none;
        border: 0;
      }

      body {
        margin: 0;
        background-color: rgb(55, 190, 89);
      }

      .all {
        width: 500px;
        height: 200px;
        padding: 4px;
        margin: 100px auto;
        position: relative;
        background-color: #fff;
        border-radius: 20px;
      }

      .screen {
        width: 500px;
        height: 200px;
        border-radius: 17px;
        overflow: hidden;
        position: relative;
      }

      .screen li {
        width: 500px;
        height: 200px;
        overflow: hidden;
        float: left;
      }

      .screen ul {
        position: absolute;
        left: 0;
        top: 0px;
        width: 3000px;
      }

      .all ol {
        position: absolute;
        right: 180px;
        bottom: 10px;
        line-height: 20px;
        text-align: center;
      }
      
      .all ol li {
        float: left;
        width: 20px;
        height: 20px;
        background: #fff;
        border-radius: 10px;
        border: 1px solid #ccc;
        margin-left: 10px;
        cursor: pointer;
        opacity: 0.5;
        /* 透明度 */
      }

      .all ol li.current {
        opacity: 1.0;
      }

      #arr {
        display: none;
        z-index: 1000;

      }

      #arr span {
        width: 40px;
        height: 40px;
        position: absolute;
        left: 5px;
        top: 50%;
        margin-top: -20px;
        background: #000;
        cursor: pointer;
        line-height: 40px;
        text-align: center;
        font-weight: bold;
        font-family: '黑体';
        font-size: 30px;
        color: #fff;
        opacity: 0.5;
        border: 1px solid #fff;
        border-radius: 5px;
      }

      #arr #right {
        right: 5px;
        left: auto;
      }
    </style>
  </head>

  <body>
    <div class="all" id='box'>
      <div class="screen">
        <ul>
          <li><img src="images/wf1.jpg" width="500" height="200" /></li>
          <li><img src="images/wf2.jpg" width="500" height="200" /></li>
          <li><img src="images/wf3.jpg" width="500" height="200" /></li>
          <li><img src="images/wf4.jpg" width="500" height="200" /></li>
          <li><img src="images/wf5.jpg" width="500" height="200" /></li>
        </ul>
        <ol>
        </ol>
      </div>
      <div id="arr"><span id="left"><</span><span id="right">></span></div>
    </div>
    <script src="common.js"></script>
    <script src="animate.js"></script>
    <script src="index.js"></script>
  </body>

</html>

index.js

//获取元素
var box = my$('box');
var screen = box.children[0];
var ul = screen.children[0];
var ol = screen.children[1]
//获取箭头
var arr = my$('arr');
var arrLeft = my$('left');
var arrRight = my$('right');
var count = ul.children.length; /* 获取图片数量 还没有放cloneLi,所以数值是5*/
var imgWidth = screen.offsetWidth; /* 获取的图片(盒子)的宽高 */
//1.动态生成序号
for (i = 0; i < count; i++) {
  // 在ol内创建li
  var li = document.createElement('li');
  ol.appendChild(li);
  // li内赋予数值
  setInnerText(li, i + 1);
  li.onclick = liClick;
  // 设置标签的自定义属性(创建索引)
  li.setAttribute('index', i);
}

// 2.点击序号,切换,显示高亮
function liClick() {
  // 取消其他的li的高亮,显示当前li高亮
  for (i = 0; i < ol.children.length; i++) {
    var li = ol.children[i];
    li.className = '';
    this.className = 'current';
  }

  // 获取的自定义属性是字符串类型,要转成整数
  var liIndex = parseInt(this.getAttribute('index'));
  animate(ul, -liIndex * imgWidth);
  //使得后面定义的全局变量index等于li的属性liIndex
  index = liIndex;
}

//ol内的第一个li显示高亮色
ol.children[0].className = 'current';

//3.鼠标放上去的时候显示箭头
// onmouseover和onmouseout会触发事件冒泡;onmouseleave和onmouseenter不会触发事件冒泡
box.onmouseenter = function () {
  arr.style.display = 'block';
  clearInterval(timeId);
}

box.onmouseleave = function () {
  arr.style.display = 'none';
  timeId = setInterval(function () {
    arrRight.click();
  }, 2500)
}

// 4.实现上一张,下一张的功能  
var index = 0; //第一张图片的索引

arrRight.onclick = function () {
  // 判断是否是克隆的第一张图片,如果是克隆的第一张图片,此时修改ul的坐标,显示真正的第一张图片
  if (index === count) {
    ul.style.left = '0px';
    index = 0;
  }


  // 如果是最后一张图片,不让index++
  index++;
  // 有5张图片,但是还有一张克隆的图片,克隆图片索引是5
  if (index < count) {
    //获取图片对应的序号,让序号进行点击
    ol.children[index].click();
  } else {
    animate(ul, -index * imgWidth);
    // 取消所有的高亮现实,让第一个序号高亮显示
    for (var i = 0; i < ol.children.length; i++) {
      var li = ol.children[i];
      li.className = '';
    }
    ol.children[0].className = 'current';
  }

  // 
}

arrLeft.onclick = function () {
  if (index === 0) {
    index = count;
    ul.style.left = -index * imgWidth + 'px';
  }
  index--;
  ol.children[index].click();
}

// 无缝滚动
var firstLi = ul.children[0];
// 克隆li  
//cloneNode() 复制节点:参数 true 复制节点中的内容 ;false 只复制当前节点,不复制里面的内容
var cloneLi = firstLi.cloneNode(true);
ul.appendChild(cloneLi)


// 5.自动播放
var timeId = setInterval(function () {
  // 切换到下一张图片
  arrRight.click();
}, 2500)

common.js

function my$(id) {
  return document.getElementById(id);
 }
 
 // 处理浏览器兼容性
 // 获取第一个子元素
 function getFirstElementChild(element) {
   var node, nodes = element.childNodes, i = 0;
   while (node = nodes[i++]) {
     if (node.nodeType === 1) {
       return node;
     }
   }
   return null;
 }
 
 // 处理浏览器兼容性
 // 获取下一个兄弟元素
  function getNextElementSibling(element) {
   var el = element;
   while (el = el.nextSibling) {
    if (el.nodeType === 1) {
      return el;
    }
   }
   return null;
  }
 
 
 // 处理innerText和textContent的兼容性问题
 // 设置标签之间的内容
 function setInnerText(element, content) {
  // 判断当前浏览器是否支持 innerText
  if (typeof element.innerText === 'string') {
   element.innerText = content;
  } else {
   element.textContent = content;
  }
 }
 
 // 处理注册事件的兼容性问题
 // eventName, 不带on, click mouseover mouseout
 function addEventListener(element, eventName, fn) {
  // 判断当前浏览器是否支持addEventListener 方法
  if (element.addEventListener) {
   element.addEventListener(eventName, fn); // 第三个参数 默认是false
  } else if (element.attachEvent) {
   element.attachEvent('on' + eventName, fn);
  } else {
   // 相当于 element.onclick = fn;
   element['on' + eventName] = fn;
  }
 }
 
 // 处理移除事件的兼容性处理
 function removeEventListener(element, eventName, fn) {
  if (element.removeEventListener) {
   element.removeEventListener(eventName, fn);
  } else if (element.detachEvent) {
   element.detachEvent('on' + eventName, fn);
  } else {
   element['on' + eventName] = null;
  }
 }
 
 // 获取页面滚动距离的浏览器兼容性问题
 // 获取页面滚动出去的距离
 function getScroll() {
  var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
  var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  return {
   scrollLeft: scrollLeft,
   scrollTop: scrollTop
  }
 }
 
 // 获取鼠标在页面的位置,处理浏览器兼容性
 function getPage(e) {
  var pageX = e.pageX || e.clientX + getScroll().scrollLeft;
  var pageY = e.pageY || e.clientY + getScroll().scrollTop;
  return {
   pageX: pageX,
   pageY: pageY
  }
 }
 
 
 //格式化日期对象,返回yyyy-MM-dd HH:mm:ss的形式
 function formatDate(date) {
  // 判断参数date是否是日期对象
  // instanceof instance 实例(对象)  of 的
  // console.log(date instanceof Date);
  if (!(date instanceof Date)) {
   console.error('date不是日期对象')
   return;
  }
 
  var year = date.getFullYear(),
    month = date.getMonth() + 1,
    day = date.getDate(),
    hour = date.getHours(),
    minute = date.getMinutes(),
    second = date.getSeconds();
 
  month = month < 10 ? '0' + month : month;
  day = day < 10 ? '0' + day : day;
  hour = hour < 10 ? '0' + hour : hour;
  minute = minute < 10 ? '0' + minute : minute;
  second = second < 10 ? '0' + second : second;
 
  return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
 }
 
 // 获取两个日期的时间差
 function getInterval(start, end) {
  // 两个日期对象,相差的毫秒数
  var interval = end - start;
  // 求 相差的天数/小时数/分钟数/秒数
  var day, hour, minute, second;
 
  // 两个日期对象,相差的秒数
  // interval = interval / 1000;
  interval /= 1000;
 
  day = Math.round(interval / 60 / 60 / 24);
  hour = Math.round(interval / 60 / 60 % 24);
  minute = Math.round(interval / 60 % 60);
  second = Math.round(interval % 60);
 
  return {
   day: day,
   hour: hour,
   minute: minute,
   second: second
  }
 }

animage.js

// var timerId = null;
// 封装动画的函数
function animate(element, target) {
  // 通过判断,保证页面上只有一个定时器在执行动画
  if (element.timerId) {
   clearInterval(element.timerId);
   element.timerId = null;
  }
 
  element.timerId = setInterval(function () {
   // 步进 每次移动的距离
   var step = 10;
   // 盒子当前的位置
   var current = element.offsetLeft;
   // 当从400 到 800 执行动画
   // 当从800 到 400 不执行动画
 
   // 判断如果当前位置 > 目标位置 此时的step 要小于0
   if (current > target) {
    step = - Math.abs(step);
   }
 
   // Math.abs(current - target)  <= Math.abs(step)
   if (Math.abs(current - target)  <= Math.abs(step)) {
    // 让定时器停止
    clearInterval(element.timerId);
    // 让盒子到target的位置
    element.style.left = target + 'px';
    return;
   }
   // 移动盒子
   current += step;
   element.style.left = current + 'px';
  }, 5);
 }

总结

到此这篇关于如何使用JavaScript实现无缝滚动自动播放轮播图效果的文章就介绍到这了,更多相关js无缝滚动自动播放内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用javascript实现给出的盒子的序列是否可连为一矩型
Aug 30 Javascript
JS去除右边逗号的简单方法
Jul 03 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
简单谈谈javascript代码复用模式
Jan 28 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
jQuery实现背景弹性滚动的导航效果
Jun 01 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
详解JS-- 浮点数运算处理
Nov 28 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
基于vue和websocket的多人在线聊天室
Feb 01 Javascript
JavaScript 空间坐标的使用
Aug 19 #Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 #Javascript
jQuery实现评论模块
Aug 19 #jQuery
javaScript代码飘红报错看不懂?读完这篇文章再试试
Aug 19 #Javascript
jQuery实现简单评论功能
Aug 19 #jQuery
原生JS实现多条件筛选
Aug 19 #Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
Aug 19 #Javascript
You might like
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
手机业务员岗位职责
2013/12/13 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
身边的榜样活动方案
2014/08/20 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
个人查摆剖析材料
2014/10/04 职场文书
班主任工作实习计划
2015/01/16 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
幽灵公主观后感
2015/06/09 职场文书