博客列表 >前端 - JS - 实战案例

前端 - JS - 实战案例

郴
原创
2020年06月24日 13:02:21869浏览

前端 - JS - 实战案例

一、选项卡

  • 原理:
  1. 1.使用css样式来进行激活导航栏、显示列表样式
  2. 2.使用html data-*属性建立每一个导航栏与每一个显示列表相同的索引,每当点击导航栏时就会激活相同索引的显示列表
  3. 3.对导航栏使用事件委托
  1. <!DOCTYPE html>
  2. <html lang="zh_hans">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. }
  13. .box {
  14. width: 300px;
  15. height: 340px;
  16. }
  17. .nav-box {
  18. height: 40px;
  19. background-color: lightsalmon;
  20. }
  21. .nav-box ul {
  22. list-style: none;
  23. display: flex;
  24. justify-content: space-between;
  25. }
  26. .nav-box ul li {
  27. width: 75px;
  28. height: 40px;
  29. display: flex;
  30. align-items: center;
  31. justify-content: center;
  32. }
  33. .list-box {
  34. height: 300px;
  35. background-color: lightcoral;
  36. }
  37. /*导航栏的激活样式*/
  38. .u01 .active {
  39. background-color: yellow;
  40. }
  41. /*显示区块默认都是隐藏的*/
  42. .d {
  43. display: none;
  44. }
  45. /*显示区块的激活样式*/
  46. .list-box .d.active {
  47. display: block;
  48. }
  49. </style>
  50. </head>
  51. <body>
  52. <div class="box">
  53. <div class="nav-box">
  54. <ul class="u01">
  55. <!--第一个导航列表默认是激活的-->
  56. <li class="active" data-index="1">家具</li>
  57. <li data-index="2">家电</li>
  58. <li data-index="3">电脑</li>
  59. <li data-index="4">手机</li>
  60. </ul>
  61. </div>
  62. <div class="list-box">
  63. <!--第一个显示区块默认是激活的-->
  64. <div class="d active" data-index="1">家具内容</div>
  65. <div class="d" data-index="2">家电内容</div>
  66. <div class="d" data-index="3">电脑内容</div>
  67. <div class="d" data-index="4">手机内容</div>
  68. </div>
  69. </div>
  70. </body>
  71. <script>
  72. // 1. 获取导航栏:利用事件委托触发子节点的onclick事件
  73. var u01 = document.getElementsByClassName("u01")[0];
  74. // 2. 获取显示区块
  75. var div = document.getElementsByClassName("d");
  76. // 3. 给导航栏添加click事件:每当点击导航栏中的每一个列表项时显示对应的区块
  77. u01.addEventListener("click", show, false);
  78. // 4. 给导航栏添加mouseover事件:每当点击导航栏中的每一个列表项时显示对应的区块
  79. u01.addEventListener("mouseover", show, false);
  80. //事件回调函数
  81. function show(ev) {
  82. // 1. 每当点击时先清空导航栏原有激活样式
  83. Array.from(ev.target.parentNode.children).forEach(function (item) {
  84. item.classList.remove("active");
  85. });
  86. // 2. 再对点击的节点激活样式
  87. ev.target.classList.toggle("active");
  88. // 3. 导航栏之后再清空显示区块的原有激活样式
  89. Array.from(div).forEach(function (item) {
  90. item.classList.remove("active");
  91. });
  92. // 4. 在显示区块中查询data-index与导航栏的data-index相等的内容,将它设置为激活
  93. Array.from(div).forEach(function (item) {
  94. if (item.dataset.index === ev.target.dataset.index) {
  95. item.classList.add("active");
  96. }
  97. });
  98. }
  99. </script>
  100. </html>

二、轮播图

  • 原理:
  1. 1.原点随图片数量动态生成
  2. 2.使用css样式来进行激活原点、显示对应图片样式
  3. 3.使用html data-*属性建立每一个原点与每一个显示图片相同的索引,每当点击原点时就会激活相同索引的显示图片
  4. 4.使用事件委托机制为每一个小圆点添加点击事件
  5. 5.翻页按钮利用触发激活原点进行翻页的机制
  6. 6.使用定时器实现移入移出轮播图区域暂停和继续翻页效果
  1. <!DOCTYPE html>
  2. <html lang="zh_hans">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>轮播图</title>
  7. <style>
  8. /*父容器属性*/
  9. .car-box {
  10. position: relative;
  11. margin: 0 auto;
  12. width: 1000px;
  13. height: 350px;
  14. }
  15. .car-box .slider {
  16. width: 1000px;
  17. height: 350px;
  18. display: none;
  19. }
  20. .car-box .slider.active {
  21. display: block;
  22. }
  23. /*原点列表样式*/
  24. .car-box .point-list {
  25. position: absolute;
  26. left: 50%;
  27. margin-left: -38px;
  28. top: 310px;
  29. }
  30. .car-box .point-list .point {
  31. display: inline-block;
  32. width: 12px;
  33. height: 12px;
  34. margin: 0 5px;
  35. background-color: white;
  36. border-radius: 100%;
  37. }
  38. .car-box .point-list .point:hover {
  39. cursor: pointer;
  40. }
  41. .car-box .point-list .point.active {
  42. background-color: black;
  43. }
  44. /*跳转按钮样式*/
  45. .skip {
  46. position: absolute;
  47. top: 140px;
  48. display: inline-block;
  49. width: 40px;
  50. height: 80px;
  51. text-align: center;
  52. line-height: 80px;
  53. background-color: lightgray;
  54. color: white;
  55. opacity: 0.2;
  56. font-size: 36px;
  57. }
  58. .car-box .prev {
  59. left: 0;
  60. }
  61. .car-box .next {
  62. right: 0;
  63. }
  64. .car-box .skip:hover {
  65. cursor: pointer;
  66. opacity: 0.5;
  67. color: black;
  68. }
  69. </style>
  70. </head>
  71. <body>
  72. <div class="car-box">
  73. <!--图片-->
  74. <img
  75. src="./images/banner1.jpg"
  76. alt=""
  77. class="slider active"
  78. data-index="1"
  79. />
  80. <img src="./images/banner2.jpg" alt="" class="slider" data-index="2" />
  81. <img src="./images/banner3.jpg" alt="" class="slider" data-index="3" />
  82. <img src="./images/banner4.jpg" alt="" class="slider" data-index="4" />
  83. <!--原点列表-->
  84. <div class="point-list">
  85. <!--应该随图片数量动态生成
  86. <span class="point active" data-index="1"></span>
  87. <span class="point" data-index="2"></span>
  88. <span class="point" data-index="3"></span>
  89. <span class="point" data-index="4"></span>-->
  90. </div>
  91. <!--跳转按钮-->
  92. <span class="skip prev">&lt;</span>
  93. <span class="skip next">&gt;</span>
  94. </div>
  95. </body>
  96. <script>
  97. //获取图片
  98. var imgs = document.querySelectorAll(".slider");
  99. //获取原点列表
  100. var plist = document.querySelector(".point-list");
  101. //动态生成原点
  102. imgs.forEach(function (item, index) {
  103. var span = document.createElement("span");
  104. span.classList.add("point");
  105. //第一个默认是激活样式
  106. if (index === 0) {
  107. span.classList.add("active");
  108. }
  109. //添加索引,和图片索引进行关联
  110. span.dataset.index = item.dataset.index;
  111. plist.appendChild(span);
  112. });
  113. //获取所有小圆点
  114. var point = document.querySelectorAll(".point");
  115. //使用事件委托为每一个小圆点添加点击事件
  116. plist.addEventListener(
  117. "click",
  118. function (ev) {
  119. //如果点击的小圆点的索引值和图片的索引值一样则激活样式
  120. imgs.forEach(function (item) {
  121. if (item.dataset.index === ev.target.dataset.index) {
  122. //清除图片原有激活样式
  123. imgs.forEach(function (item) {
  124. item.classList.remove("active");
  125. });
  126. //设置图片激活
  127. item.classList.add("active");
  128. //清除小圆点原有激活样式和设置小圆点激活
  129. setPorintActive(item.dataset.index);
  130. }
  131. });
  132. },
  133. false
  134. );
  135. //公共函数:设置小圆点激活
  136. function setPorintActive(imgIndex) {
  137. //清除小圆点原有激活样式
  138. point.forEach(function (item) {
  139. item.classList.remove("active");
  140. });
  141. //设置小圆点激活
  142. point.forEach(function (item) {
  143. if (item.dataset.index === imgIndex) {
  144. item.classList.add("active");
  145. }
  146. });
  147. }
  148. //获取翻页按钮
  149. var skips = document.querySelectorAll(".skip");
  150. //给翻页按钮添加点击事件
  151. skips.item(0).addEventListener("click", skipImg, false);
  152. skips.item(1).addEventListener("click", skipImg, false);
  153. //翻页函数
  154. function skipImg(ev) {
  155. // 1. 找到当前正在显示的图片
  156. var currentImg = null;
  157. imgs.forEach(function (img) {
  158. if (img.classList.contains("active")) {
  159. currentImg = img;
  160. }
  161. });
  162. // 2. 判断是否点击了前一页
  163. if (ev.target.classList.contains("prev")) {
  164. // 1. 先清空当前图片的激活样式
  165. currentImg.classList.remove("active");
  166. // 2. 再把当前页设置为前一页
  167. currentImg = currentImg.previousElementSibling;
  168. // 3. 把当前页激活,为防止越界,先判断前一页存不存在
  169. if (currentImg !== null && currentImg.nodeName === "IMG") {
  170. //存在则激活
  171. currentImg.classList.add("active");
  172. } else {
  173. //不存在则直接跳转到最后一页
  174. currentImg = imgs[imgs.length - 1];
  175. currentImg.classList.add("active");
  176. }
  177. }
  178. // 3. 判断是否点击了后一页
  179. if (ev.target.classList.contains("next")) {
  180. // 1. 先清空当前图片的激活样式
  181. currentImg.classList.remove("active");
  182. // 2. 再把当前页设置为后一页
  183. currentImg = currentImg.nextElementSibling;
  184. // 3. 把当前页激活,为防止越界,先判断后一页存不存在
  185. if (currentImg !== null && currentImg.nodeName === "IMG") {
  186. //存在则激活
  187. currentImg.classList.add("active");
  188. } else {
  189. //不存在则直接跳转到第一页
  190. currentImg = imgs[0];
  191. currentImg.classList.add("active");
  192. }
  193. }
  194. // 4. 关联小圆点高亮
  195. setPorintActive(currentImg.dataset.index);
  196. }
  197. //获取轮播图容器
  198. var box = document.querySelector(".car-box");
  199. //定义一个定时器,用来清空定时器
  200. var timer = null;
  201. // 1. 当鼠标移出轮播图区域时,启动定时器
  202. box.addEventListener("mouseout", startTimer, false);
  203. // 2. 当鼠标移入轮播图区域时,清空定时器
  204. box.addEventListener("mouseover", clearTimer, false);
  205. //启动定时器函数
  206. function startTimer() {
  207. //定义一个点击事件
  208. var click = new Event("click");
  209. //间歇式执行,间隔为2秒
  210. setInterval(function () {
  211. //使用事件派发向翻页按钮派发点击事件,触发翻页函数
  212. skips.item(1).dispatchEvent(click);
  213. }, 2000);
  214. }
  215. //清除定时器函数
  216. function clearTimer() {
  217. clearInterval(timer);
  218. }
  219. </script>
  220. </html>

四、课程总结

  • 今天进行了 JavaScript 的实战,通过上课认真听讲和认真完成老师布置的作业,使得我对 js经典案例比如选项卡和轮播图 的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了操作DOM和事件处理的特点以及基本用法。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议