Blogger Information
Blog 14
fans 0
comment 0
visits 7646
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
js 仿淘宝移动端轮播图效果
深巷的博客
Original
458 people have browsed it

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. }

效果图

仿淘宝移动端轮播图效果

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:完成的很好, 没什么问题, 继续加油
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post