博客列表 >js 仿淘宝移动端轮播图效果

js 仿淘宝移动端轮播图效果

深巷的博客
深巷的博客原创
2022年11月13日 17:01:35461浏览

js 仿淘宝移动端轮播图效果

HTML

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>仿淘宝移动端轮播图</title>
  8. <link rel="stylesheet" href="static/css/slideshow.css" />
  9. </head>
  10. <body>
  11. <!-- 轮播图容器 -->
  12. <div class="slideshow">
  13. <!-- 图片容器 -->
  14. <div class="imgs"></div>
  15. <!-- 按钮容器 -->
  16. <div class="btns"></div>
  17. </div>
  18. <!-- 模块化开发,添加type="module" -->
  19. <script type="module">
  20. //获取图片容器
  21. const imgs = document.querySelector(".imgs");
  22. //获取按钮容器
  23. const btns = document.querySelector(".btns");
  24. //导入模块
  25. import {
  26. createImgs,
  27. createBtns,
  28. switchImg,
  29. timePlay,
  30. } from "./static/js/slideshow.js";
  31. //页面加载完成后的动作window.onload
  32. window.onload = function () {
  33. //执行模块的createImgs(创建图片组)
  34. createImgs(imgs);
  35. //执行模块的createBtns
  36. createBtns(imgs, btns);
  37. //创建按钮事件,点击按钮执行的动作(显示对应图片)
  38. //将类数组转为真数组然后用forEach循环遍历
  39. //forEach的参数是一个函数,函数中有三个参数分别是值(必选),索引,数组本身
  40. /*[...btns.children].forEach(function (btn) {
  41. btn.onclick = function () {
  42. switchImg(this, imgs);
  43. };
  44. });*/
  45. Array.from(btns.children).forEach(function (btn) {
  46. btn.onclick = function () {
  47. //被点击时执行模块的switchImg
  48. switchImg(this, imgs);
  49. };
  50. });
  51. //添加定时器,实现图片轮播
  52. //按钮数组
  53. const btnArr = [...btns.children];
  54. //按钮索引
  55. const btnKeys = Object.keys(btns.children);
  56. //console.log(btnKeys);
  57. //定时器setInterval()
  58. setInterval(play, 2000, btnArr, btnKeys);
  59. function play(btnArr, btnKeys) {
  60. //执行模块的timePlay
  61. timePlay(btnArr, btnKeys);
  62. }
  63. };
  64. </script>
  65. </body>
  66. </html>

JavaScript

  1. // 轮播图模块
  2. //图片组数据
  3. const imgArr = [
  4. {
  5. key: 1,
  6. src: "static/images/item1.jpeg",
  7. url: "http://php.cn",
  8. },
  9. {
  10. key: 2,
  11. src: "static/images/item2.jpeg",
  12. url: "http://php.cn",
  13. },
  14. {
  15. key: 3,
  16. src: "static/images/item3.jpeg",
  17. url: "http://php.cn",
  18. },
  19. ];
  20. //创建图片组
  21. function createImgs(imgs) {
  22. //图片资源较大,用文档片段来做
  23. const frag = new DocumentFragment();
  24. //for循环获取imgArr全部图片资源
  25. for (let i = 0; i < imgArr.length; i++) {
  26. // 创建图片元素
  27. const img = new Image();
  28. //添加img的src
  29. img.src = imgArr[i].src;
  30. //添加自定义属性data-key
  31. img.dataset.key = imgArr[i].key;
  32. //第一张图片添加class='active'
  33. if (i === 0) img.classList.add("active");
  34. //添加图片点击事件
  35. img.onclick = function () {
  36. location.href = imgArr[i].url;
  37. };
  38. //img.onclick = () => (location.href = imgArr[i].url);
  39. //将图片添加到临时文档片段frag
  40. frag.append(img);
  41. }
  42. //将文档片段添加到图片容器imgs
  43. imgs.append(frag);
  44. }
  45. //创建按钮组,按钮数量根据图片数量得来
  46. function createBtns(imgs, btns) {
  47. //获取图片容器中的图片数量childElementCount
  48. const length = imgs.childElementCount;
  49. for (let i = 0; i < length; i++) {
  50. //创建按钮元素span
  51. const btn = document.createElement("span");
  52. //添加自定义元素data-key
  53. btn.dataset.key = imgs.children[i].dataset.key;
  54. //第一个按钮添加class='active'
  55. if (i === 0) btn.classList.add("active");
  56. //将按钮元素添加到按钮容器btns
  57. btns.append(btn);
  58. }
  59. }
  60. //按钮点击事件
  61. function switchImg(btn, imgs) {
  62. //按钮被点击时去除默认的激活状态class='active'
  63. //由于激活状态的按钮并不是固定的,所以进行遍历去除
  64. Array.from(btn.parentNode.children).forEach(function (btn) {
  65. btn.classList.remove("active");
  66. });
  67. /*[...btn.parentNode.children].forEach(function(btn){
  68. btn.classList.remove('active');
  69. });*/
  70. /*[...btn.parentElement.children].forEach(function(btn){
  71. btn.classList.remove('active');
  72. });*/
  73. [...imgs.children].forEach(function (img) {
  74. img.classList.remove("active");
  75. });
  76. //修改当前按钮处于激活状态,添加class='active'
  77. btn.classList.add("active");
  78. //查找索引与当前按钮索引一致的图片元素
  79. const currImg = [...imgs.children].find(function (img) {
  80. return img.dataset.key == btn.dataset.key;
  81. });
  82. //修改图片元素处于激活状态
  83. currImg.classList.add("active");
  84. }
  85. //定时播放
  86. //将按钮索引从第一个开始 取出、进行点击事件、添加到尾部实现首尾相连循环播放
  87. // 0,1,2
  88. // 1,2,0
  89. // 2,0,1
  90. // 0,1,2
  91. function timePlay(btnArr, btnKeys) {
  92. //shift()删除数组中的第一个元素并返回该值
  93. let key = btnKeys.shift();
  94. //dispatchEvent()对取出值按钮进行点击事件
  95. btnArr[key].dispatchEvent(new Event("click"));
  96. //push()将该取出值添加到数组尾部
  97. btnKeys.push(key);
  98. }
  99. //导出
  100. export { createImgs, createBtns, switchImg, timePlay };

CSS

  1. /* 添加背景色 */
  2. body {
  3. background-color: #eee;
  4. }
  5. /* 轮播图容器 */
  6. .slideshow {
  7. width: 240px;
  8. height: 360px;
  9. }
  10. /* 图片容器 */
  11. .slideshow .imgs {
  12. /* inherit父元素的值 */
  13. width: inherit;
  14. height: inherit;
  15. }
  16. /* 图片适应 */
  17. .slideshow img {
  18. width: 100%;
  19. height: 100%;
  20. /* border-radius设置圆角 */
  21. border-radius: 10px;
  22. /* 图片默认状态-隐藏 */
  23. display: none;
  24. }
  25. /* 图片激活状态 */
  26. .slideshow img.active {
  27. display: block;
  28. }
  29. /* 鼠标悬停图片时小手样式 */
  30. .slideshow img:hover {
  31. cursor: pointer;
  32. }
  33. /* 按钮容器 */
  34. .slideshow .btns {
  35. /* flex布局 */
  36. display: flex;
  37. /* 居中 */
  38. place-content: center;
  39. /* transform 属性允许你旋转,缩放,倾斜或平移给定元素。 */
  40. transform: translateY(-40px);
  41. }
  42. .slideshow .btns > span {
  43. /* rgba(,,,,)颜色和透明度 */
  44. background-color: rgba(233, 233, 233, 0.5);
  45. height: 16px;
  46. width: 16px;
  47. /* 按钮圆形 */
  48. border-radius: 50%;
  49. /* 按钮间距 */
  50. margin: 5px;
  51. }
  52. .slideshow .btns > span.active {
  53. background-color: orangered;
  54. }
  55. .slideshow .btns > span:hover {
  56. cursor: pointer;
  57. }

效果图

仿淘宝移动端轮播图效果

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议