博客列表 >JavaScript 轮播图实例 - 仿php中文网首页轮播图

JavaScript 轮播图实例 - 仿php中文网首页轮播图

尹辉
尹辉原创
2023年04月01日 22:04:11293浏览

仿php中文网首页轮播图

页面效果

HTML 部分

  1. <div class="slideshow">
  2. <!-- 1. 图片组 -->
  3. <div class="images"></div>
  4. <!-- 2. 按钮组 -->
  5. <div class="bottoms"></div>
  6. </div>
  7. <script type="module">
  8. // 获取图片组的入口
  9. const images = document.querySelector('.images')
  10. // 获取按钮组的入口
  11. const bottoms = document.querySelector('.bottoms')
  12. // 导入轮播图模块: slideshow.js
  13. import slide from './slide.js'
  14. window.onload = function () {
  15. // 1. 创建图片组
  16. slide.createImages(images)
  17. // 2. 创建按钮组
  18. slide.createBottoms(images, bottoms)
  19. // 3. 创建按钮事件: 实现图片的切换
  20. ;[...bottoms.children].forEach(function (btn) {
  21. btn.onclick = function () {
  22. slide.switchImage(this, images)
  23. }
  24. })
  25. // 4. 定时轮播器: 间歇式的定时器
  26. // 间歇式定时器,第2秒换一张图片
  27. setInterval(
  28. function (bottomsArr, bottomKeys) {
  29. slide.timePlay(bottomsArr, bottomKeys)
  30. },
  31. 2000,
  32. [...bottoms.children],
  33. Object.keys([...bottoms.children])
  34. )
  35. }
  36. </script>

JavaScript 部分

1, 数据模块

  1. /**
  2. * @desc 轮播图的数据模块
  3. * @param {number} key - 图片ID
  4. * @param {string} src - 图片path
  5. * @param {string} url - 点击后跳转url
  6. */
  7. // 默认导出(匿名导出)它的标识符由调用者自定义
  8. export default [
  9. {
  10. key: 1,
  11. src: 'https://img.php.cn/upload/aroundimg/000/000/068/63da26d3406b8838.png',
  12. url: 'https://www.php.cn',
  13. },
  14. {
  15. key: 2,
  16. src: 'https://img.php.cn/upload/aroundimg/000/000/001/63997a4d5d9fd596.png',
  17. url: 'https://www.php.cn',
  18. },
  19. {
  20. key: 3,
  21. src: 'https://img.php.cn/upload/aroundimg/000/000/001/64194356c0829952.png',
  22. url: 'https://www.php.cn',
  23. },
  24. ]

2,轮播功能模块

  1. // 导入图片组的数据(图片信息)
  2. import imgArr from './data.js'
  3. /**
  4. * @desc 创建图片组
  5. * @param {Element} images - 图片容器
  6. */
  7. function createImages(images) {
  8. // 使用文档片断来优化,将图片的生成与挂载放在内存中完成,以减少页面渲染和抖动
  9. // 创建文档片断对象
  10. const frag = new DocumentFragment()
  11. for (let i = 0; i < imgArr.length; i++) {
  12. // 1. 创建图片元素<img>
  13. const img = document.createElement('img')
  14. // 2. 为图片添加 src, data-key
  15. img.src = imgArr[i].src
  16. img.dataset.key = imgArr[i].key
  17. // 3. 默认显示第一张: class='active'
  18. if (i === 0) img.classList.add('active')
  19. // 4. 为<img>添加click事件,跳转地址
  20. img.onclick = () => (location.hre = imgArr[i].url)
  21. // 5. 将<img>添加文档片断中
  22. frag.append(img)
  23. }
  24. // 将<img>添加到:图片容器中
  25. images.append(frag)
  26. }
  27. /**
  28. * @desc 创建按钮组
  29. * @param {Element} images - 图片容器
  30. * @param {Element} bottoms - 按钮容器
  31. */
  32. function createBottoms(images, bottoms) {
  33. // 1. 获取到图片的数量
  34. const length = images.childElementCount
  35. // 2. 根据图片的数量生成对应的按钮
  36. for (let i = 0; i < length; i++) {
  37. const span = document.createElement('span')
  38. // 添加data-key 实现与图片的data-key的联动(绑定)
  39. span.dataset.key = images.children[i].dataset.key
  40. if (i === 0) span.classList.add('active')
  41. bottoms.append(span)
  42. }
  43. }
  44. /**
  45. * @desc 创建按钮事件: 实现图片的切换
  46. * @param {Element} bottoms - 当前按钮
  47. * @param {Element} images - 图片容器
  48. */
  49. function switchImage(bottoms, images) {
  50. // 1. 去掉所有按钮和图片的"激活"状态active
  51. ;[...bottoms.parentNode.children].forEach(btn => btn.classList.remove('active'))
  52. ;[...images.children].forEach(img => img.classList.remove('active'))
  53. // 2. 将当前用户正在点击的按钮设置为激活active
  54. bottoms.classList.add('active')
  55. // 3. 根据当前按钮的key,找到对应的图片
  56. const currImg = [...images.children].find(img => img.dataset.key === bottoms.dataset.key)
  57. // 4. 把这个图片设置为激活active(显示出来)
  58. currImg.classList.add('active')
  59. }
  60. /**
  61. * @desc 定时轮播器: 间歇式的定时器
  62. * @param {Element} bottomsArr - 按钮数组(用来绑定事件)
  63. * @param {Array} bottomKeys - 按钮的键构成的数组
  64. */
  65. function timePlay(bottomsArr, bottomKeys) {
  66. // 定时器 + 事件派发
  67. // setInterval + dispatchEvent
  68. // 1. 从头部取一个
  69. let key = bottomKeys.shift()
  70. // 2. 根据索引,从按钮组中找到与该索引对应的按钮,给它自动派发一个点击事件
  71. bottomsArr[key].dispatchEvent(new Event('click'))
  72. // 3. 将刚才取出的按钮,再次从尾部添加到按钮数组中,实现首尾相边的效果
  73. bottomKeys.push(key)
  74. }
  75. // 默认导出
  76. export default { createImages, createBottoms, switchImage, timePlay}
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议