Blogger Information
Blog 33
fans 0
comment 0
visits 27661
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
前端 - JS - 实战案例
Original
868 people have browsed it

前端 - 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和事件处理的特点以及基本用法。
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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!