博客列表 >JavaScript动态设置类与相关经典案例

JavaScript动态设置类与相关经典案例

残破的蛋蛋
残破的蛋蛋原创
2021年01月14日 12:28:13834浏览

JavaScript动态设置类与相关经典案例

一、JS动态设置类

1.className属性可以用来设置元素的类(class)值或返回元素的class属性值。

  • 语法:

obj.className = classNameValue;

  • 案例:
  1. <style>
  2. .red {
  3. color: red;
  4. }
  5. .bg {
  6. background-color: #ff0;
  7. }
  8. </style>
  9. <p>Hello World!</p>

现在有一个p标签,我想把文字的颜色和背景色替换一下,可以这样操作:

  1. <script>
  2. const p = document.querySelector('p');
  3. p.className = "red bg";
  4. </script>
  • 效果图:

className

如果想要读取p元素的class属性值,也可以使用className属性:

  1. console.log(p.className); // red bg

2.classList属性值可以获取元素的类名,用于为元素添加、移除、切换CSS类名。

  • 属性

length:统计元素类名称的个数。

  • 案例
  1. <p class="red bg">Hello World!</p>
  2. <script>
  3. console.log(p.classList.length); // 2
  4. </script>
  • 常用方法
方法名称 解释说明
add(class1,class2,…) 向元素添加类名,如果添加的类名已经存在,则不添加
remove(class1,class2,…) 移除元素指定的类名,如果该类名不存在,则会报错
toggle(className, boolean) 切换元素的类名,如果要切换的类名不存在,则会自动向元素里添加这个类名。第二个为可选参数,布尔值用于设置元素是否强制添加或移除类,不管该类名是否存在。
contains(class) 判断指定的类名是否存在。存在返回true,不存在返回false
  • 用法
  1. p.classList.add("green");
  2. p.classList.remove("red");
  3. p.classList.toggle('red1');
  4. p.classList.contains('red1'));

二、dataset对象

读取HTML元素上的用户自定义属性,使用dataset属性。

  • 语法

element.dataset.className

  • 案例
  1. <p id="aaa" data-email="admin@admin.com" data-my-age="90" data-index="1">我的资料</p>

以上定义了个p元素,如果需要获取id值,可以直接使用:

  1. console.log(p.id); // aaa

若是想要获取data-eamil的属性值,就不能使用p.data-email了,这个用法是错误的,需要使用dataset属性:

  1. console.log(p.dataset.email); // admin@admin.com

如果需要获取data-my-age属性该怎么办呢?此时,就需要使用驼峰式的方法来获取:

  1. console.log(p.dataset.myAge); // 90
  • 总结:
  1. 自定义属性必须是以“data-”开头的;

  2. 如果要获取自定义的属性,需要去掉前缀“data-”;

  3. 在获取的属性值的时候如果需要带(-)的属性值需要转成驼峰式的写法。

三、实战案例

3.1 选项卡

  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. <link rel="stylesheet" href="./static/css/tabs.css">
  8. </head>
  9. <body>
  10. <div class="box">
  11. <!-- tabs -->
  12. <ul class="tabs">
  13. <li class="tab active" data-index="1">综合新闻</li>
  14. <li class="tab" data-index="2">官方新闻</li>
  15. <li class="tab" data-index="3">赛事新闻</li>
  16. <li class="tab" data-index="4">更新日志</li>
  17. </ul>
  18. <!-- panels -->
  19. <ul class="panels">
  20. <li class="panel active" data-index="1">
  21. <div class="panel-lists">
  22. <a class="recommend" href="#">
  23. <h3>完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战</h3>
  24. <div class="contents">
  25. <div class="item-avatar">
  26. <img src="https://img.dota2.com.cn/dota2/63/c5/63c52fb6846974b76797c433064a23fa1609475659.jpg" alt="完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战">
  27. </div>
  28. <div class="msg">
  29. <p>全球DOTA2玩家期待已久的DPC即将开启,很荣幸地宣布完美世界电竞将主办中国区联赛,全球六大赛区将同步启动。</p>
  30. <span class="date">2021年01月12日</span>
  31. </div>
  32. </div>
  33. </a>
  34. <a class="p_list p_highlight" href="#">
  35. <i class="p_icon p_icon_dot"></i>
  36. <p>DOTA2绝品龙钩,竟能够在嘉年华一键领取?</p>
  37. <span class="p_date">2021-01-11</span>
  38. </a>
  39. <a class="p_list" href="#">
  40. <i class="p_icon p_icon_dot"></i>
  41. <p>DOTA2 1月11日更新日志:7.28b平衡性更新</p>
  42. <span class="p_date">2021-01-11</span>
  43. </a>
  44. <a class="p_list p_highlight" href="#">
  45. <i class="p_icon p_icon_dot"></i>
  46. <p>PC定级赛DAY2赛况:Aster力克RNG,率先杀入S级联赛!</p>
  47. <span class="p_date">2021-01-10</span>
  48. </a>
  49. <a class="p_list" href="#">
  50. <i class="p_icon p_icon_dot"></i>
  51. <p>DOTA2展区谍照曝光:探秘Roshan巢穴,与军团决斗</p>
  52. <span class="p_date">2021-01-08</span>
  53. </a>
  54. <a class="p_list p_highlight" href="#">
  55. <i class="p_icon p_icon_dot"></i>
  56. <p>没有人给你评级,你来为你自己定级!DPC中国联赛定级赛今日开战</p>
  57. <span class="p_date">2021-01-08</span>
  58. </a>
  59. <a class="p_list" href="#">
  60. <i class="p_icon p_icon_dot"></i>
  61. <p>DOTA2 1月8日更新日志:技能征召更新</p>
  62. <span class="p_date">2021-01-08</span>
  63. </a>
  64. <a class="p_list p_highlight" href="#">
  65. <i class="p_icon p_icon_dot"></i>
  66. <p>DPC中国联赛定级赛1月8日11:00开战 谁能进入S级联赛?</p>
  67. <span class="p_date">2021-01-07</span>
  68. </a>
  69. </div>
  70. </li>
  71. <li class="panel" data-index="2">
  72. <div class="panel-lists">
  73. <a class="recommend" href="#">
  74. <h3>完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战</h3>
  75. <div class="contents">
  76. <div class="item-avatar">
  77. <img src="https://img.dota2.com.cn/dota2/63/c5/63c52fb6846974b76797c433064a23fa1609475659.jpg" alt="完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战">
  78. </div>
  79. <div class="msg">
  80. <p>全球DOTA2玩家期待已久的DPC即将开启,很荣幸地宣布完美世界电竞将主办中国区联赛,全球六大赛区将同步启动。</p>
  81. <span class="date">2021年01月12日</span>
  82. </div>
  83. </div>
  84. </a>
  85. <a class="p_list p_highlight" href="#">
  86. <i class="p_icon p_icon_dot"></i>
  87. <p>DOTA2绝品龙钩,竟能够在嘉年华一键领取?</p>
  88. <span class="p_date">2021-01-11</span>
  89. </a>
  90. <a class="p_list" href="#">
  91. <i class="p_icon p_icon_dot"></i>
  92. <p>DOTA2 1月11日更新日志:7.28b平衡性更新</p>
  93. <span class="p_date">2021-01-11</span>
  94. </a>
  95. <a class="p_list p_highlight" href="#">
  96. <i class="p_icon p_icon_dot"></i>
  97. <p>PC定级赛DAY2赛况:Aster力克RNG,率先杀入S级联赛!</p>
  98. <span class="p_date">2021-01-10</span>
  99. </a>
  100. <a class="p_list" href="#">
  101. <i class="p_icon p_icon_dot"></i>
  102. <p>DOTA2展区谍照曝光:探秘Roshan巢穴,与军团决斗</p>
  103. <span class="p_date">2021-01-08</span>
  104. </a>
  105. <a class="p_list p_highlight" href="#">
  106. <i class="p_icon p_icon_dot"></i>
  107. <p>没有人给你评级,你来为你自己定级!DPC中国联赛定级赛今日开战</p>
  108. <span class="p_date">2021-01-08</span>
  109. </a>
  110. <a class="p_list" href="#">
  111. <i class="p_icon p_icon_dot"></i>
  112. <p>DOTA2 1月8日更新日志:技能征召更新</p>
  113. <span class="p_date">2021-01-08</span>
  114. </a>
  115. <a class="p_list p_highlight" href="#">
  116. <i class="p_icon p_icon_dot"></i>
  117. <p>DPC中国联赛定级赛1月8日11:00开战 谁能进入S级联赛?</p>
  118. <span class="p_date">2021-01-07</span>
  119. </a>
  120. </div>
  121. </li>
  122. <li class="panel" data-index="3">
  123. <div class="panel-lists">
  124. <a class="recommend" href="#">
  125. <h3>完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战</h3>
  126. <div class="contents">
  127. <div class="item-avatar">
  128. <img src="https://img.dota2.com.cn/dota2/63/c5/63c52fb6846974b76797c433064a23fa1609475659.jpg" alt="完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战">
  129. </div>
  130. <div class="msg">
  131. <p>全球DOTA2玩家期待已久的DPC即将开启,很荣幸地宣布完美世界电竞将主办中国区联赛,全球六大赛区将同步启动。</p>
  132. <span class="date">2021年01月12日</span>
  133. </div>
  134. </div>
  135. </a>
  136. <a class="p_list p_highlight" href="#">
  137. <i class="p_icon p_icon_dot"></i>
  138. <p>DPC定级赛DAY2赛况:Aster力克RNG,率先杀入S级联赛!</p>
  139. <span class="p_date">2021-01-10</span>
  140. </a>
  141. <a class="p_list" href="#">
  142. <i class="p_icon p_icon_dot"></i>
  143. <p>DOTA2 1月11日更新日志:7.28b平衡性更新</p>
  144. <span class="p_date">2021-01-11</span>
  145. </a>
  146. <a class="p_list p_highlight" href="#">
  147. <i class="p_icon p_icon_dot"></i>
  148. <p>PC定级赛DAY2赛况:Aster力克RNG,率先杀入S级联赛!</p>
  149. <span class="p_date">2021-01-10</span>
  150. </a>
  151. <a class="p_list" href="#">
  152. <i class="p_icon p_icon_dot"></i>
  153. <p>DOTA2展区谍照曝光:探秘Roshan巢穴,与军团决斗</p>
  154. <span class="p_date">2021-01-08</span>
  155. </a>
  156. <a class="p_list p_highlight" href="#">
  157. <i class="p_icon p_icon_dot"></i>
  158. <p>没有人给你评级,你来为你自己定级!DPC中国联赛定级赛今日开战</p>
  159. <span class="p_date">2021-01-08</span>
  160. </a>
  161. <a class="p_list" href="#">
  162. <i class="p_icon p_icon_dot"></i>
  163. <p>DOTA2 1月8日更新日志:技能征召更新</p>
  164. <span class="p_date">2021-01-08</span>
  165. </a>
  166. <a class="p_list p_highlight" href="#">
  167. <i class="p_icon p_icon_dot"></i>
  168. <p>DPC中国联赛定级赛1月8日11:00开战 谁能进入S级联赛?</p>
  169. <span class="p_date">2021-01-07</span>
  170. </a>
  171. </div>
  172. </li>
  173. <li class="panel" data-index="4">
  174. <div class="panel-lists">
  175. <a class="recommend" href="#">
  176. <h3>完美世界电竞将主办DPC中国区比赛 1月18日举行线下开幕式及揭幕战</h3>
  177. <div class="contents">
  178. <div class="item-avatar">
  179. <img src="https://img.dota2.com.cn/dota2/d0/27/d027f043743b5127a9afaf5a2f5730191610354489.jpg" alt="DOTA2 1月11日更新日志:7.28b平衡性更新">
  180. </div>
  181. <div class="msg">
  182. <p>全球DOTA2玩家期待已久的DPC即将开启,很荣幸地宣布完美世界电竞将主办中国区联赛,全球六大赛区将同步启动。</p>
  183. <span class="date">2021年01月12日</span>
  184. </div>
  185. </div>
  186. </a>
  187. <a class="p_list p_highlight" href="#">
  188. <i class="p_icon p_icon_dot"></i>
  189. <p>DOTA2绝品龙钩,竟能够在嘉年华一键领取?</p>
  190. <span class="p_date">2021-01-11</span>
  191. </a>
  192. <a class="p_list" href="#">
  193. <i class="p_icon p_icon_dot"></i>
  194. <p>DOTA2 1月11日更新日志:7.28b平衡性更新</p>
  195. <span class="p_date">2021-01-11</span>
  196. </a>
  197. <a class="p_list p_highlight" href="#">
  198. <i class="p_icon p_icon_dot"></i>
  199. <p>PC定级赛DAY2赛况:Aster力克RNG,率先杀入S级联赛!</p>
  200. <span class="p_date">2021-01-10</span>
  201. </a>
  202. <a class="p_list" href="#">
  203. <i class="p_icon p_icon_dot"></i>
  204. <p>DOTA2展区谍照曝光:探秘Roshan巢穴,与军团决斗</p>
  205. <span class="p_date">2021-01-08</span>
  206. </a>
  207. <a class="p_list p_highlight" href="#">
  208. <i class="p_icon p_icon_dot"></i>
  209. <p>没有人给你评级,你来为你自己定级!DPC中国联赛定级赛今日开战</p>
  210. <span class="p_date">2021-01-08</span>
  211. </a>
  212. <a class="p_list" href="#">
  213. <i class="p_icon p_icon_dot"></i>
  214. <p>DOTA2 1月8日更新日志:技能征召更新</p>
  215. <span class="p_date">2021-01-08</span>
  216. </a>
  217. <a class="p_list p_highlight" href="#">
  218. <i class="p_icon p_icon_dot"></i>
  219. <p>DPC中国联赛定级赛1月8日11:00开战 谁能进入S级联赛?</p>
  220. <span class="p_date">2021-01-07</span>
  221. </a>
  222. </div>
  223. </li>
  224. </ul>
  225. </div>
  226. <script>
  227. console.log(document.documentElement);
  228. const tabs = document.querySelector('.tabs');
  229. // 卡盘导航
  230. const tabsNum = document.querySelectorAll('.tabs > *');
  231. console.log(tabsNum);
  232. // 内容列表
  233. const panels = document.querySelectorAll('.panel');
  234. console.log(panels);
  235. tabs.addEventListener('click', ev => {
  236. // 事件触发对象(事件绑定者)
  237. console.log(ev.currentTarget);
  238. // 事件触发者
  239. console.log(ev.target.classList.item[0]);
  240. // 激活点击的对象只需要两步:
  241. // 1.清空之前所有处于激活状态的选项卡,并将当前点击的对象激活
  242. console.log(tabs.children);
  243. [...tabs.children].forEach(tab => tab.classList.remove('active'));
  244. ev.target.classList.add('active');
  245. // 2.根据自定义的属性data-index找到对应的列表并显示出来
  246. panels.forEach(panels => panels.classList.remove('active'));
  247. // console.log([...panels].filter(item => item.dataset.index === ev.target.dataset.index));
  248. // filter返回的是一个数组,因此需要:
  249. [...panels].filter(item => item.dataset.index === ev.target.dataset.index)[0].classList.add('active');
  250. });
  251. </script>
  252. </body>
  253. </html>
  • 效果图

3.2 一键换肤

  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. .container {
  9. width: 300px;
  10. display: grid;
  11. grid-template-columns: repeat(6, 1fr);
  12. column-gap: 10px;
  13. }
  14. .container > img {
  15. width: 100%;
  16. border: 3px solid #ffffff;
  17. }
  18. body {
  19. width: 100%;
  20. height: 100%;
  21. background: url('./static/images/1.jpg') no-repeat scroll 0 0;
  22. background-size: cover;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div class="container">
  28. <img src="./static/images/1.jpg" alt="">
  29. <img src="./static/images/2.jpg" alt="">
  30. <img src="./static/images/3.jpg" alt="">
  31. <img src="./static/images/4.jpg" alt="">
  32. <img src="./static/images/5.jpg" alt="">
  33. <img src="./static/images/6.jpg" alt="">
  34. </div>
  35. <script>
  36. let clientW = window.screen.width;
  37. let clientH = window.screen.height;
  38. console.log(clientW, clientH);
  39. console.log(document.body);
  40. document.body.style.width = clientW;
  41. document.body.style.height = clientH;
  42. const container = document.querySelector('.container');
  43. container.onclick = ev => {
  44. console.log(ev.currentTarget);
  45. console.log(ev.target);
  46. document.body.style.backgroundImage = `url(${ev.target.src})`;
  47. }
  48. </script>
  49. </body>
  50. </html>

3.3 图片懒加载原理

  • 原理

如果当前图片距离文档顶部的高度(偏移量) < 文档可视区 + 滚动高度,则表示图片进入到可视区,需要将图片加载出来。

1.元素距离文档顶部的偏移量

  1. let offsetTop = ele.offsetTop;

2.文档可视区高度

  1. let clientHeight = document.documentElement.clientHeight;

3.滚动高度

  1. let scrollTop = document.documentElement.scrollTop;
  • 案例
  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. </head>
  8. <body>
  9. <img src="./static/images/1.jpg" width="1000" alt="" data-src="./static/images/2.jpg">
  10. <script>
  11. // 视口高度
  12. let clientHeight = document.documentElement.clientHeight;
  13. // 滚动高度
  14. const img = document.querySelector('img');
  15. console.log(img);
  16. let scrollTop = document.documentElement.scrollTop;
  17. window.onscroll = ev => {
  18. if (img.offsetTop < clientHeight + document.documentElement.scrollTop) {
  19. img.src = img.dataset.src;
  20. }
  21. }
  22. </script>
  23. </body>
  24. </html>

3.4 轮播图片

  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. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. a {
  15. text-decoration: none;
  16. }
  17. /* 轮播图的容器 */
  18. .container {
  19. width: 62.5em;
  20. height: 22em;
  21. margin: 1em auto;
  22. /* 转为定位元素/定位父级 */
  23. position: relative;
  24. }
  25. /* 图片组 */
  26. .container>.imgs img {
  27. width: 100%;
  28. height: 100%;
  29. /* 默认全部隐藏 */
  30. display: none;
  31. /* 将所有的图片进行绝对定位,确保每一次只看到一张,所有图片共享这个容器 */
  32. position: absolute;
  33. left: 0;
  34. top: 0;
  35. }
  36. /* 设置默认显示的图片(第一张) */
  37. .container>.imgs img.active {
  38. display: block;
  39. }
  40. /* 按钮组(独立按钮) */
  41. .container>.btns {
  42. position: absolute;
  43. left: 0;
  44. right: 0;
  45. bottom: 0;
  46. /* 水平居中 */
  47. text-align: center;
  48. }
  49. .container>.btns a {
  50. /* 转成行内块元素: 即能水平排列,双支持宽度设置 */
  51. display: inline-block;
  52. padding: 0.5em;
  53. margin: 0 0.2em;
  54. background-color: #fff;
  55. border-radius: 50%;
  56. }
  57. .container>.btns a.active {
  58. background-color: #000;
  59. }
  60. /* 翻页按钮 */
  61. .container .skip a {
  62. position: absolute;
  63. width: 2.5rem;
  64. height: 5rem;
  65. line-height: 5rem;
  66. text-align: center;
  67. opacity: 0.3;
  68. top: 9rem;
  69. font-weight: lighter;
  70. font-size: 2rem;
  71. background-color: #ccc;
  72. }
  73. .container .skip .prev {
  74. left: 0;
  75. }
  76. .container .skip .next {
  77. right: 0;
  78. }
  79. .container .skip *:hover {
  80. opacity: 0.6;
  81. color: #666;
  82. }
  83. </style>
  84. </head>
  85. <body>
  86. <div class="container">
  87. <!-- 1. 图片组 -->
  88. <nav class="imgs">
  89. <a href=""><img src="./static/images/banner/banner1.jpg" alt="" data-index="1" class="active" /></a>
  90. <a href=""><img src="./static/images/banner/banner2.jpg" alt="" data-index="2" /></a>
  91. <a href=""><img src="./static/images/banner/banner3.jpg" alt="" data-index="3" /></a>
  92. <a href=""><img src="./static/images/banner/banner4.jpg" alt="" data-index="4" /></a>
  93. </nav>
  94. <!-- 2. 图片小按钮 -->
  95. <nav class="btns">
  96. </nav>
  97. <!-- 3. 翻页 -->
  98. <nav class="skip">
  99. <a href="#" class="prev">&lt;</a>
  100. <a href="#" class="next">&gt;</a>
  101. </nav>
  102. </div>
  103. <script src="./static/js/banner.js"></script>
  104. </body>
  105. </html>

JS代码

  1. // 获取所有图片
  2. const imgs = document.querySelectorAll('.container .imgs img');
  3. console.log(imgs);
  4. // 获取所有的按钮
  5. const btnsGroup = document.querySelector('.container > .btns');
  6. // 翻页按钮
  7. const skips = document.querySelectorAll('.container > .skip');
  8. console.log(skips);
  9. // 实际上,轮播图片中的小圆点是根据轮播图片的数量来进行创建的,图片数量 === 圆点数量
  10. // 创建一个文档片段,将生成的小圆点一次性添加到文档中。
  11. const frag = document.createDocumentFragment();
  12. for (let i = 0; i < imgs.length; i++) {
  13. const a = document.createElement('a');
  14. a.href = "#";
  15. a.dataset.index = i + 1;
  16. // 默认激活第一个元素
  17. i === 0 ? a.classList.add('active') : '';
  18. frag.appendChild(a);
  19. }
  20. btnsGroup.appendChild(frag);
  21. /**
  22. * 获取激活的图片
  23. * @param {obj} ele 元素对象
  24. */
  25. function getActiveEle (ele) {
  26. let active = [...ele].filter(img => img.classList.contains('active'))
  27. return active.shift();
  28. }
  29. console.log(getActiveEle(imgs));
  30. // 获取刚刚生成的小按钮
  31. const btns = document.querySelectorAll('.container .btns > *');
  32. console.log(btns);
  33. // 1.获取激活的元素
  34. btns.forEach(btn => {
  35. btn.addEventListener('click', ev => setActiveEle(ev.target));
  36. });
  37. /**
  38. * 设置激活的元素active
  39. * @param {obj} ele 元素
  40. */
  41. function setActiveEle(ele) {
  42. [imgs, btns].forEach(item => {
  43. // 获取激活状态的图片和圆点按钮
  44. let activeEle = [...item].filter(ele => ele.classList.contains('active')).shift();
  45. // 清除所有的active状态的元素
  46. activeEle.classList.remove('active');
  47. console.log(activeEle);
  48. item.forEach(arr => {
  49. console.log(arr);
  50. if (arr.dataset.index === ele.dataset.index) {
  51. arr.classList.add('active');
  52. }
  53. });
  54. });
  55. }
  56. // 获取翻页按钮
  57. const prev = document.querySelector('.prev');
  58. const next = document.querySelector('.next');
  59. prev.addEventListener('click', ev => {
  60. let activeEle = [...imgs].filter(item => item.classList.contains('active'));
  61. console.log(typeof activeEle[0].dataset.index); //
  62. // 获取当前激活元素的索引值
  63. let activeElemIndex = activeEle[0].dataset.index;
  64. console.log("1.当前索引值为:", activeElemIndex);
  65. // 如果当前的激活元素的索引值(index)为1,那么图片就是第一张,再次点击prev按钮,会调到最后一张图
  66. if (activeElemIndex === '1') {
  67. console.log('1111');
  68. setActiveEle(Array.from(imgs)[imgs.length - 1]);
  69. activeElemIndex = [...imgs].filter(item => item.classList.contains('active'))[0].dataset.index;
  70. console.log("2.当前索引值为:", activeElemIndex);
  71. } else {
  72. setActiveEle(Array.from(imgs)[activeElemIndex - 2]);
  73. }
  74. });
  75. // 如果当图片处于最后一张时,点击next按钮应该调到第一张,即:激活第一张图
  76. next.addEventListener('click', ev => {
  77. // 获取当前激活的图片
  78. let activeEle = [...imgs].filter(img => img.classList.contains('active'));
  79. // 获取当前图片的索引值
  80. if (Number(getActiveEleIndex(activeEle)) === imgs.length) {
  81. setActiveEle(Array.from(imgs)[0]);
  82. } else {
  83. setActiveEle(Array.from(imgs)[getActiveEleIndex(activeEle)]);
  84. }
  85. });
  86. /**
  87. * 获取激活状态下的元素的索引值(index)
  88. * @param {obj} ele 处于激活状态下的元素
  89. */
  90. function getActiveEleIndex(ele) {
  91. return ele[0].dataset.index;
  92. }
  • 效果图

carousel

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