博客列表 >选项卡和轮播图

选项卡和轮播图

手机用户1607314868
手机用户1607314868原创
2021年01月13日 01:05:14508浏览

选项卡案例

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