博客列表 >演示选项卡与轮播图功能

演示选项卡与轮播图功能

lus菜
lus菜原创
2021年01月13日 21:51:11624浏览

选项卡:

样式代码:

  1. <title>选项卡</title>
  2. <style>
  3. * {
  4. margin: 0;
  5. padding: 0;
  6. box-sizing: border-box;
  7. }
  8. a {
  9. text-decoration: none;
  10. color: #555;
  11. }
  12. a:hover {
  13. text-decoration: underline;
  14. color: red;
  15. }
  16. li {
  17. list-style: none;
  18. line-height: 1.6em;
  19. }
  20. li:hover {
  21. cursor: default;
  22. }
  23. .tabs {
  24. width: 300px;
  25. height: 300px;
  26. margin: 30px;
  27. background-color: #e6e6e6;
  28. display: flex;
  29. flex-direction: column;
  30. }
  31. .tab {
  32. height: 36px;
  33. display: flex;
  34. }
  35. .tab li {
  36. flex: auto;
  37. text-align: center;
  38. line-height: 36px;
  39. background-color: #fff;
  40. }
  41. .tab li.active {
  42. background-color: #e6e6e6;
  43. }
  44. .tab li:hover {
  45. cursor: pointer;
  46. }
  47. .item { //默认所有选项卡只有一个显示,其它隐藏
  48. padding: 20px;
  49. display: none;
  50. }
  51. .item.active {
  52. display: block;
  53. }
  54. </style>
  55. <body>
  56. <div class="tabs">
  57. <ul class="tab"> //导航
  58. <li class="active" data-index="1">省内</li>
  59. <li data-index="2">国内</li>
  60. <li data-index="3">国际</li>
  61. </ul>
  62. <ul data-index="1" class="item active"> //detail
  63. <li><a href="">合肥GDP破万亿</a></li>
  64. <li><a href="">京东方第10代生产线</a></li>
  65. <li><a href="">德国大众(安徽)正式成立</a></li>
  66. </ul>
  67. <ul data-index="2" class="item">
  68. <li><a href="">北京禁止春节前后举办群众性活动</a></li>
  69. <li><a href="">目前疫情仍处于完全可控范围</a></li>
  70. <li><a href="">重庆6岁女童屁股被打伤</a></li>
  71. </ul>
  72. <ul data-index="3" class="item">
  73. <li><a href="">特朗普支持者闯国会干了啥</a></li>
  74. <li><a href="">大批日本居民在东京游行支持特朗普</a></li>
  75. <li><a href="">新加坡总理李显龙公开接种新冠疫苗</a></li>
  76. </ul>
  77. </div>
  78. <script>
  79. const tab = document.querySelector(".tab"); // 事件代理
  80. const items = document.querySelectorAll(".item"); // 三个列表
  81. tab.onclick = ev => {
  82. //1.清空之前所有处于激活状态的选项卡,并将当前点击对象激活
  83. [...tab.children].forEach(item => item.classList.remove("active"));
  84. ev.target.classList.add("active");
  85. // 2. 根据自定义属性data-index找到对应的列表并显示出来 NodeList对象内置了forEach接口
  86. items.forEach(item => item.classList.remove("active"));
  87. [...items].filter(item => item.dataset.index === ev.target.dataset.index)[0].classList.add("active");
  88. };
  89. </script>
  90. </body>

效果预览:


轮播图:

样式代码:

  1. <title>轮播图</title>
  2. <link rel="stylesheet" href="banner/style.css" />
  3. <body>
  4. <div class="container">
  5. //1.图片组
  6. <nav class="imgs">
  7. <nav class="imgs">
  8. <a href="#"><img src="banner/banner1.jpg" alt="" data-index="1" class=""/></a>
  9. <a href="#"><img src="banner/banner2.jpg" alt="" data-index="2" class="active"/></a>
  10. <a href="#"><img src="banner/banner3.jpg" alt="" data-index="3" class=""/></a>
  11. <a href="#"><img src="banner/banner4.jpg" alt="" data-index="4" class=""/></a>
  12. </nav>
  13. </nav>
  14. //2.图片小按钮
  15. <nav class="btns"></nav>
  16. //3.翻页
  17. <nav class="skip">
  18. <a href="#" class="prev">&lt;</a>
  19. <a href="#" class="next">&gt;</a>
  20. </nav>
  21. </div>
  22. <script>
  23. const imgs = document.querySelectorAll(".container > .imgs img"); // 所有图片
  24. const btnGroup = document.querySelector(".container > .btns"); // 按钮组
  25. const skip = document.querySelector(".container > .skip"); // 翻页按钮
  26. function autoCreateBtns(ele, imgLength) { // 创建出一组与图片数量对应的小按钮
  27. const frag = document.createDocumentFragment();
  28. for (let i = 0; i < imgLength; i++) {
  29. const a = document.createElement("a");
  30. a.href = "#"; // #: 防止默认行为,更加规范用 ev.preventDefault();
  31. a.dataset.index = i + 1;
  32. if (i === 0) a.classList.add("active");
  33. frag.appendChild(a);
  34. }
  35. ele.appendChild(frag);
  36. }
  37. autoCreateBtns(btnGroup, imgs.length); // 调用创建小按钮的函数
  38. const btns =document.querySelectorAll(".container > .btns > *"); // 为刚刚生成的小按钮添加点击事件
  39. function getActiveEle(eles) { // 1. 获取激活的元素
  40. let activities = [...eles].filter((img) =>
  41. img.classList.contains("active")
  42. );
  43. return activities.shift();
  44. }
  45. function setActiveEle(btnIndex) { // getActiveEle(imgs);
  46. [imgs, btns].forEach((arr) => { // 2. 设置激活的元素
  47. // 将之前的状态全部重置到初始化(清空)
  48. getActiveEle(arr).classList.remove("active");
  49. arr.forEach((item) => {
  50. if (item.dataset.index === btnIndex) {
  51. item.classList.add("active");
  52. }
  53. });
  54. });
  55. }
  56. btns.forEach((btn) => // 为每一个小按钮添加事件
  57. btn.addEventListener(
  58. "click",
  59. (ev) => setActiveEle(ev.target.dataset.index),
  60. false
  61. )
  62. );
  63. //为每个翻页按钮添加事件完成图片翻页(兄弟节点的处理)
  64. skip.addEventListener("click", skipImg, false);
  65. // 单独写一个事件监听器,为后面的事件自动派发做准备
  66. skip.children[0].addEventListener("click", skipImg, false);
  67. // 将前后翻页,使用一个回调统一处理
  68. function skipImg(ev) {
  69. // 当前激活的图片,实际上这里用不到它,而应该用它的父级<a>来判断是否存在兄弟节点
  70. let currentImg = getActiveEle(imgs);
  71. // 当前图片组父元素,注意<img>父级是<a>,<a>的父级才是需要的父节点
  72. let parentEle = currentImg.parentElement.parentElement;
  73. // 当前元素的前一个兄弟节点:previousElementSibling;
  74. let prevEle = currentImg.parentElement.previousElementSibling;
  75. // 当前元素的下一个兄弟节点:nextElementSibling;
  76. let nextEle = currentImg.parentElement.nextElementSibling;
  77. // 第一张图片, firstElementChild第一个子元素
  78. let firstImg = parentEle.firstElementChild.firstElementChild;
  79. // 最后一张图片, firstElementChild, 最后一个子元素
  80. let lastImg = parentEle.lastElementChild.firstElementChild;
  81. let activeImg = currentImg;
  82. // 向前翻页
  83. if (ev.target.classList.contains("prev")) {
  84. // 如果存在前一张图片,就使用它,否则就使用最后一张图片来更新它,形成循环显示的效果
  85. let activeImg =
  86. prevEle !== null ? prevEle.firstElementChild : lastImg;
  87. // 使用激活元素来同步更新图片与按钮
  88. setActiveEle(activeImg.dataset.index);
  89. }
  90. // 向后翻页
  91. if (ev.target.classList.contains("next")) {
  92. // 如果不存在下一张图片,就用第一张图片更新它
  93. let activeImg =
  94. nextEle !== null ? nextEle.firstElementChild : firstImg;
  95. setActiveEle(activeImg.dataset.index);
  96. }
  97. }
  98. //图片每隔2秒自动播放(定时器,事件自动派发)
  99. let timer = null;
  100. const slider = document.querySelector(".container");
  101. slider.addEventListener("mouseout", startTimer, false);
  102. slider.addEventListener("mouseover", clearTimer, false);
  103. //启动定时器
  104. function startTimer() {
  105. //创建自定义事件对象
  106. const clickEvent = new Event("click");
  107. timer = setInterval(
  108. () => skip.children[0].dispatchEvent(clickEvent),
  109. 4000
  110. );
  111. }
  112. //清除定时器
  113. function clearTimer() {
  114. clearInterval(timer);
  115. }
  116. </script>
  117. </body>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议