Blogger Information
Blog 37
fans 0
comment 0
visits 34819
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
选项卡和轮播图
手机用户1607314868
Original
509 people have browsed it

选项卡案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. margin: 0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. }
  13. a {
  14. text-decoration: none;
  15. color: #555;
  16. }
  17. a:hover {
  18. text-decoration: underline;
  19. color: red;
  20. }
  21. li {
  22. list-style: none;
  23. line-height: 1.6em;
  24. }
  25. li:hover {
  26. cursor: default;
  27. }
  28. .tabs {
  29. width: 300px;
  30. height: 300px;
  31. margin: 30px;
  32. background-color: #e6e6e6;
  33. display: flex;
  34. flex-direction: column;
  35. }
  36. .tab {
  37. height: 36px;
  38. display: flex;
  39. }
  40. .tab li {
  41. flex: auto;
  42. text-align: center;
  43. line-height: 36px;
  44. background-color: #fff;
  45. }
  46. .tab li.active {
  47. background-color: #e6e6e6;
  48. }
  49. .tab li:hover {
  50. cursor: pointer;
  51. }
  52. /* 默认所有选项卡只有一个显示,其它隐藏 */
  53. .item {
  54. padding: 20px;
  55. display: none;
  56. }
  57. .item.active {
  58. display: block;
  59. }
  60. </style>
  61. </head>
  62. <body>
  63. <div class="tabs">
  64. <ul class="tab">
  65. <li data-index="1" class="active">新闻</li>
  66. <li data-index="2">体育</li>
  67. <li data-index="3">民生</li>
  68. </ul>
  69. <ul data-index="1" class="item active">
  70. <li><a href="">国际新闻</a></li>
  71. <li><a href="">国内新闻</a></li>
  72. <li><a href="">省内新闻</a></li>
  73. </ul>
  74. <ul data-index="2" class="item">
  75. <li><a href="">国际体育</a></li>
  76. <li><a href="">国内体育</a></li>
  77. <li><a href="">省内体育</a></li>
  78. </ul>
  79. <ul data-index="3" class="item">
  80. <li><a href="">国际民生</a></li>
  81. <li><a href="">国内民生</a></li>
  82. <li><a href="">省内民生</a></li>
  83. </ul>
  84. </div>
  85. <script>
  86. const tab = document.querySelector(".tab");
  87. //三个列表
  88. const items = document.querySelectorAll(".item");
  89. tab.onclick= ev=> {
  90. //1.清除选中状态
  91. [...tab.children].forEach(item=>item.classList.remove("active"));
  92. ev.target.classList.add("active");
  93. //显示列表
  94. items.forEach(item => item.classList.remove("active"));
  95. [...items].filter(item=>item.dataset.index===ev.target.dataset.index)[0].classList.add("active");
  96. };
  97. </script>
  98. </body>
  99. </html>

轮播图案例

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>实战:轮播图</title>
  7. <link rel="stylesheet" href="banner/style.css" />
  8. </head>
  9. <body>
  10. <div class="container">
  11. <!-- 1. 图片组 -->
  12. <nav class="imgs">
  13. <a href="#"
  14. ><img src="banner/banner1.jpg" alt="" data-index="1" class="active"
  15. /></a>
  16. <a href="#"><img src="banner/banner2.jpg" alt="" data-index="2" /></a>
  17. <a href="#"><img src="banner/banner3.jpg" alt="" data-index="3" /></a>
  18. <a href="#"><img src="banner/banner4.jpg" alt="" data-index="4" /></a>
  19. </nav>
  20. <!-- 2. 与图片组对应的按钮组(一个个独立的,数量与图片数量是相同的) -->
  21. <nav class="btns">
  22. <!-- 这些小按钮应该是js根据图片数量动态来创建 -->
  23. <!-- <a href="#" data-index="1" class="active"></a>
  24. <a href="#" data-index="2"></a>
  25. <a href="#" data-index="3"></a>
  26. <a href="#" data-index="4"></a> -->
  27. </nav>
  28. <!-- 3. 翻页按钮(只有二个,分别在左右) -->
  29. <nav class="skip">
  30. <!-- &lt;: 实体符号 -->
  31. <a href="#" class="prev">&lt;</a>
  32. <a href="#" class="next">&gt;</a>
  33. </nav>
  34. </div>
  35. <script>
  36. // 获取相关的元素对象
  37. // 图片组
  38. const imgs = document.querySelectorAll(".container > .imgs img");
  39. // 按钮组
  40. const btnGroup = document.querySelector(" .container > .btns");
  41. // 翻页按钮
  42. const skip = document.querySelector(" .container > .skip");
  43. // 自动生成按钮组,数量与图片数量一致
  44. function autoCreateBtns(ele, imgLength) {
  45. // 使用文档片断
  46. const frag = document.createDocumentFragment();
  47. for (let i = 0; i < imgLength; i++) {
  48. const a = document.createElement("a");
  49. // #: 防止默认行为,更加规范用 ev.preventDefault();
  50. a.href = "#";
  51. // 自定义数据属性
  52. a.dataset.index = i + 1;
  53. // 为第一个按钮添加高亮,这是默认的
  54. if (i === 0) a.classList.add("active");
  55. frag.appendChild(a);
  56. }
  57. ele.appendChild(frag);
  58. }
  59. // 调用该函数自动生成与图片一一对应的小按钮
  60. autoCreateBtns(btnGroup, imgs.length);
  61. // 获取到刚生成的按钮组中所有按钮
  62. const btns = document.querySelectorAll(" .container > .btns > *");
  63. // 下面声明2个公共函数
  64. // 1. 获取激活的元素
  65. function getActiveEle(eles) {
  66. let activities = Array.from(eles).filter(img =>
  67. img.classList.contains("active")
  68. );
  69. return activities.shift();
  70. }
  71. // 2. 设置激活的元素
  72. function setActiveEle(btnIndex) {
  73. // 同时遍历所有图片与按钮
  74. [imgs, btns].forEach(arr => {
  75. // 取消当前激活元素的状态
  76. getActiveEle(arr).classList.remove("active");
  77. // 根据当前用户点击的按钮索引,重置应该激活的元素
  78. arr.forEach(item => {
  79. if (item.dataset.index === btnIndex) {
  80. item.classList.add("active");
  81. }
  82. });
  83. });
  84. }
  85. // 为每一个独立的小按钮添加事件,不要使用事件代理
  86. btns.forEach(btn =>
  87. btn.addEventListener(
  88. "click",
  89. ev => setActiveEle(ev.target.dataset.index),
  90. false
  91. )
  92. );
  93. // 作业1: 为每个翻页按钮添加事件完成图片翻页(兄弟节点的处理)
  94. skip.addEventListener("click", skipImg, false);
  95. // 单独写一个事件监听器,为后面的事件自动派发做准备
  96. skip.children[0].addEventListener("click", skipImg, false);
  97. // 将前后翻页,使用一个回调统一处理
  98. function skipImg(ev) {
  99. // 当前激活的图片,实际上这里用不到它,而应该用它的父级<a>来判断是否存在兄弟节点
  100. let currentImg = getActiveEle(imgs);
  101. // 当前图片组父元素,注意<img>父级是<a>,<a>的父级才是需要的父节点
  102. let parentEle = currentImg.parentElement.parentElement;
  103. // 当前元素的前一个兄弟节点:previousElementSibling;
  104. let prevEle = currentImg.parentElement.previousElementSibling;
  105. // 当前元素的下一个兄弟节点:nextElementSibling;
  106. let nextEle = currentImg.parentElement.nextElementSibling;
  107. // 第一张图片, firstElementChild第一个子元素
  108. let firstImg = parentEle.firstElementChild.firstElementChild;
  109. // 最后一张图片, firstElementChild, 最后一个子元素
  110. let lastImg = parentEle.lastElementChild.firstElementChild;
  111. let activeImg = currentImg;
  112. // 向前翻页
  113. if (ev.target.classList.contains("prev")) {
  114. // 如果存在前一张图片,就使用它,否则就使用最后一张图片来更新它,形成循环显示的效果
  115. let activeImg =
  116. prevEle !== null ? prevEle.firstElementChild : lastImg;
  117. // 使用激活元素来同步更新图片与按钮
  118. setActiveEle(activeImg.dataset.index);
  119. }
  120. // 向后翻页
  121. if (ev.target.classList.contains("next")) {
  122. // 如果不存在下一张图片,就用第一张图片更新它
  123. let activeImg =
  124. nextEle !== null ? nextEle.firstElementChild : firstImg;
  125. setActiveEle(activeImg.dataset.index);
  126. }
  127. }
  128. // 作业2: 图片每隔2秒自动播放(定时器,事件自动派发)
  129. let timer = null;
  130. const slider = document.querySelector(".container");
  131. slider.addEventListener("mouseout", startTimer, false);
  132. slider.addEventListener("mouseover", clearTimer, false);
  133. // 启动定时器
  134. function startTimer() {
  135. // 创建自定义事件对象
  136. const clickEvent = new Event("click");
  137. timer = setInterval(
  138. () => skip.children[0].dispatchEvent(clickEvent),
  139. 2000
  140. );
  141. }
  142. // 清除定时器
  143. function clearTimer() {
  144. clearInterval(timer);
  145. }
  146. </script>
  147. </body>
  148. </html>
Correcting teacher:天蓬老师天蓬老师

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