js轮播图功能

简介: js轮播图功能
[{
    "path": "./img/lv66666.jpg"
  },
  {
    "path": "./img/lv66.jpg"
  },
  {
    "path": "./img/lllv.jpg"
  },
  {
    "path": "./img/llllll.png"
  },
  {
    "path": "./img/6.jpg"
  },
  {
    "path": "./img/123.jpg"
  },
  {
    "path": "./img/121.jpg"
  }
]
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
 
      .all {
        margin-left: 10%;
      }
 
      .show {
        width: 86%;
        height: 650px;
        margin-left: 20px;
        margin-top: 20px;
        overflow: hidden;
        position: relative;
      }
 
      .print {
        display: flex;
        width: 800%;
        transition: all 0.5s;
      }
 
      .dots {
        display: flex;
        position: absolute;
        bottom: 10px;
        left: 50%;
        transform: translateX(-50%);
      }
 
      .dot {
        width: 15px;
        height: 15px;
        margin-left: 13px;
        border-radius: 10px;
        background-color: honeydew;
        cursor: pointer;
      }
 
      .dot.active {
        background-color: pink;
      }
 
      .print img {
        width: 100%;
        height: 650px;
        object-fit: cover;
      }
 
      #direction {
        width: 100%;
        height: 5vh;
        position: absolute;
        top: 45%;
        display: flex;
      }
 
      #direction div {
        width: 3%;
        height: 5vh;
        text-align: center;
        border-radius: 10px;
        line-height: 5vh;
        font-size: 16px;
        background-color: rgba(0, 0, 0, 0.2);
        color: #fff;
        overflow: hidden;
        cursor: pointer;
      }
 
      .two {
        margin-left: 94%;
      }
    </style>
  </head>
  <body>
    <div class="all">
      <div class="show">
        <div class="print"></div>
        <div class="dots"></div>
        <div id="direction">
          <div onclick="prev()">⬅</div>
          <div class="two" onclick="next()">➡</div>
        </div>
      </div>
    </div>
    <script>
      // 获取数据
      // 存储从JSON文件读取的数据
      let data; 
      // 获取class为'all'的第一个元素
      let big = document.getElementsByClassName('all')[0]; 
      // 初始化索引变量,用于记录当前显示的图片索引
      let index = 0; 
      // 获取class为'dots'的元素,用于插入小圆点
      let dotContainer = document.querySelector('.dots'); 
      // 获取class为'print'的元素,用于插入图片
      let print = document.querySelector('.print'); 
      // 存储所有的小圆点元素
      let dots = []; 
      // 创建XMLHttpRequest对象,用于发送HTTP请求
      let xhr = new XMLHttpRequest(); 
      // 配置HTTP请求,从'js/lunbo.json'获取数据,异步请求
      xhr.open('get', 'js/lunbo.json', true); 
      // 发送HTTP请求
      xhr.send(); 
      // 监听XHR对象的状态变化
      xhr.onreadystatechange = function() { 
        // 确认请求已完成且成功
          if (xhr.readyState == 4 && xhr.status == 200) { 
          // 获取响应数据(JSON格式的字符串)
              let text = xhr.responseText; 
          // 将JSON字符串解析为JavaScript对象
              data = JSON.parse(text); 
          // 获取数据后调用renderer函数渲染轮播图
              renderer(data); 
          }
      };
      
      // 渲染轮播图
      function renderer(data) {
        // 用于存储构建图片标签的字符串
          let str = ''; 
        // 用于存储构建小圆点的字符串
          let dotStr = ''; 
      // 循环遍历数据的长度
          for (let i = 0; i < data.length; i++) {
          // 构建图片标签,data[i].path是图片路径
              str += `<img src="${data[i].path}" alt="" />`; 
          // 构建小圆点,点击调用control函数
              dotStr += `<div class="dot" onclick="control(${i})"></div>`; 
          }
      // 添加第一张图片到最后,实现无缝轮播
          str += `<img src="${data[0].path}" alt="" />`; 
        // 将图片标签插入到print元素中
          print.innerHTML = str; 
        // 将小圆点插入到dotContainer元素中
          dotContainer.innerHTML = dotStr; 
        // 获取所有的小圆点元素
          dots = document.querySelectorAll('.dot'); 
        // 将第一个小圆点设为激活状态
          dots[0].classList.add('active'); 
      }
      
      // 定时器,控制自动轮播
      let time = setInterval(function() {
        // 切换到下一张图片
          next(); 
        //  每隔3秒调用next函数
      }, 3000);
      
      // 下一张
      function next() {
        // 索引加一,显示下一张图片
          index++; 
        // 移动轮播图
          moveSlide(); 
      }
      
      // 上一张
      function prev() {
        // 索引减一,显示上一张图片
          index--; 
        // 移动轮播图
          moveSlide(); 
      }
      
      // 控制显示特定图片
      function control(i) {
        // 设置索引为i,显示特定的图片
          index = i; 
        // 移动轮播图
          moveSlide(); 
      }
      
      // 移动轮播图
      function moveSlide() {
        // 处理超出范围的情况
          if (index > data.length) { 
          // 去除过渡效果
              print.style.transition = "none"; 
          // 将margin-left设为0%,显示第一张图片
              print.style.marginLeft = "0%"; 
           // 索引设为0
              index = 0;
              setTimeout(function() {
            // 0.5秒的过渡效果
                  print.style.transition = "margin-left 0.5s"; 
                  // 索引加一
            index++; 
            // 移动到下一张图片
                  print.style.marginLeft = `-${index * 100}%`; 
            // 等待20毫秒再执行过渡效果,避免立即执行过渡效果造成闪烁
              }, 20); 
          // 处理负数的情况
          } else if (index < 0) { 
          // 去除过渡效果
              print.style.transition = "none"; 
          // 索引设为最后一张图片的索引
              index = data.length - 1; 
          // 移动到最后一张图片
              print.style.marginLeft = `-${index * 100}%`; 
              setTimeout(function() {
             // 0.5秒的过渡效果
                  print.style.transition = "margin-left 0.5s";
            // 等待20毫秒再执行过渡效果,避免立即执行过渡效果造成闪烁
              }, 20); 
          // 正常情况下的移动
          } else { 
          // 0.5秒的过渡效果
              print.style.transition = "margin-left 0.5s"; 
          // 根据索引移动到对应的图片
              print.style.marginLeft = `-${index * 100}%`; 
          }
        // 更新小圆点状态
          updateDots(); 
      }
      
      // 更新小圆点状态
      function updateDots() {
        // 遍历所有的小圆点
          dots.forEach(function(dot, i) { 
          // 遍历所有的小圆点
              let actualIndex = index % data.length; 
              if (i === actualIndex) {
             // 激活当前图片对应的小圆点
                  dot.classList.add('active');
              } else {
            // 移除其他小圆点的激活状态
                  dot.classList.remove('active'); 
              }
          });
      }
      
      // 鼠标悬停暂停自动轮播
      big.onmouseover = function() {
        // 清除定时器,停止自动轮播
          clearInterval(time); 
      }
      
      big.onmouseout = function() {
         // 清除定时器,停止自动轮播
          clearInterval(time);
          time = setInterval(function() {
          // 每隔3秒调用next函数,继续自动轮播
              next(); 
          }, 3000);
      }
    </script>
  </body>
</html>
目录
相关文章
|
8月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
411 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
8月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
597 11
|
10月前
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
187 10
|
10月前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
147 8
|
11月前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
11月前
|
JavaScript
时尚简洁的js轮播图特效插件
这是一款时尚简洁的js轮播图特效插件。该轮播图采用es6语法制作,底部带缩略图和描述信息。图片和描述信息在切换时同步滑动。
|
12月前
|
JavaScript 前端开发 容器
jQuery多功能滑块插件r-slider.js
r-slider.js是一款jQuery多功能滑块插件。使用该插件,可以制作出滑块、开关按钮、进度条、向导步骤等多种效果。
176 5
|
JavaScript
js实现简洁实用的网页计算器功能源码
这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
191 2
|
前端开发
js-基础轮播图制作
js-基础轮播图制作
92 7
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
386 1