ASCII码 ASCII码

轮播图实例和xhr对象的使用

发布于:2022-06-08 09:03:43  栏目:技术文档

1.轮播图实例

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>轮播图</title>
  8. <style>
  9. /* ! 3. 轮播图 */
  10. .slider {
  11. max-width: 750px;
  12. min-width: 320px;
  13. margin: auto;
  14. padding: 0 10px;
  15. }
  16. .slider .imgs {
  17. /* 图片容器必须要有高度,否则下面图片不能正常显示 */
  18. height: 150px;
  19. }
  20. .slider .imgs img {
  21. /* 图片完全充满父级空间显示 */
  22. height: 100%;
  23. width: 100%;
  24. /* 图片带有圆角 */
  25. border-radius: 10px;
  26. /* 默认图片全部隐藏,只有有active的图片才显示 */
  27. display: none;
  28. }
  29. .slider .imgs img:hover {
  30. cursor: pointer;
  31. }
  32. /* 默认显示第一张 */
  33. .slider .imgs img.active {
  34. display: block;
  35. }
  36. /* 轮播图按钮组 */
  37. .slider .btns {
  38. /* 按钮水平一排显示,用flex,且水平居中 */
  39. display: flex;
  40. place-content: center;
  41. }
  42. .slider .btns span {
  43. /* 按钮宽高相同,确定显示成一个正圆 */
  44. width: 8px;
  45. height: 8px;
  46. /* 加上红色背景和数字是为了布局时可以看到,一会更去掉 */
  47. background-color: rgba(255, 255, 255, 0.4);
  48. /* 50%可确保显示为正圆 */
  49. border-radius: 50%;
  50. /* 按钮上外边距负值,可将它上移,可移动到图片中下方 */
  51. margin: -12px 3px 5px;
  52. }
  53. .slider .btns span.active {
  54. background-color: #fff;
  55. }
  56. .slider .page {
  57. display: flex;
  58. place-content: space-between;
  59. margin-top: -88px;
  60. opacity: 0.3;
  61. }
  62. .slider .page button {
  63. border: none;
  64. width: 20px;
  65. height: 20px;
  66. background-color: #fff;
  67. }
  68. </style>
  69. </head>
  70. <body>
  71. <div class="slider">
  72. <!--
  73. 图片容器
  74. 1. 图片组
  75. 2. 按钮组
  76. 注: 按钮数组与图片数量是一样的
  77. -->
  78. <div class="imgs">
  79. <!-- 轮播图默认从第一张开始显示 -->
  80. <img src="./images/banner1.jpg" alt="" data-index="1" class="active" />
  81. <img src="./images/banner2.jpg" alt="" data-index="2" />
  82. <img src="./images/banner3.png" alt="" data-index="3" />
  83. </div>
  84. <!-- 切换按钮数量与图片数量必须一致 -->
  85. <div class="btns">
  86. <span data-index="1" class="active" onclick="setActive()"></span>
  87. <span data-index="2" onclick="setActive()"></span>
  88. <span data-index="3" onclick="setActive()"></span>
  89. </div>
  90. <!-- 上下翻页按钮 -->
  91. <div class="page">
  92. <button class="prev" onclick="setPage(1)"></button>
  93. <button class="next" onclick="setPage(2)"></button>
  94. </div>
  95. </div>
  96. <script>
  97. // 1. 获取全部图片和按钮
  98. const imgs = document.querySelectorAll('.slider .imgs img');
  99. const btns = document.querySelectorAll('.slider .btns span');
  100. // 2.清空图片和所有按钮的激活状态
  101. function clearClass() {
  102. imgs.forEach((img) => img.classList.remove('active'));
  103. btns.forEach((btn) => btn.classList.remove('active'));
  104. }
  105. // 2. 设置激活状态
  106. function setActive() {
  107. // 1. 清空图片和所有按钮的激活状态
  108. clearClass();
  109. // 2. 根据按钮的索引data-index来确定应该将哪一张图片显示出来class=active
  110. event.target.classList.add('active');
  111. imgs.forEach((img) => {
  112. if (img.dataset.index === event.target.dataset.index) {
  113. img.classList.add('active');
  114. }
  115. });
  116. }
  117. // 3. 自动播放
  118. // [1,2,3]
  119. // [2,3,1]
  120. // [3,1,2]
  121. // [1,2,3]
  122. // 首尾相连,实现循环播放
  123. // 自动点击: 事件派发器
  124. // 间歇式触发,每隔一段固定时间会自动触发一次事件
  125. // setInterval: 除了回调和时间外,还可传入第三个参数,做为回调的参数
  126. let play = setInterval(
  127. (arr) => {
  128. // 1. 头部删除
  129. let i = arr.shift();
  130. // 2. 尾部追加
  131. arr.push(i);
  132. // 3. 事件派发: 模拟用户点击
  133. btns[i].dispatchEvent(new Event('click'));
  134. },
  135. 2000,
  136. Object.keys(btns)
  137. );
  138. // console.log(Object.keys(btns));
  139. // console.log(Object.keys(imgs));
  140. let arrs = Object.keys(imgs);
  141. // 翻页效果
  142. function setPage(ele) {
  143. clearClass();
  144. // 上一页
  145. if (ele === 1) {
  146. // 尾部删除,头部添加
  147. let i = arrs.pop();
  148. arrs.unshift(i);
  149. btns[i].dispatchEvent(new Event('click'));
  150. }
  151. // 下一页
  152. else {
  153. // 头部删除,尾部添加
  154. let i = arrs.shift();
  155. arrs.push(i);
  156. btns[i].dispatchEvent(new Event('click'));
  157. }
  158. }
  159. //停止自动播放;
  160. document
  161. .querySelector('.slider .imgs')
  162. .addEventListener('mouseover', () => {
  163. clearInterval(play);
  164. console.log('停止自动播放');
  165. });
  166. //开始自动播放
  167. document
  168. .querySelector('.slider .imgs')
  169. .addEventListener('mouseout', () => {
  170. play = setInterval(
  171. (arr) => {
  172. let i = arr.shift();
  173. arr.push(i);
  174. btns[i].dispatchEvent(new Event('click'));
  175. },
  176. 2000,
  177. Object.keys(btns)
  178. );
  179. console.log('开始自动播放');
  180. });
  181. </script>
  182. </body>
  183. </html>

轮播图

2.xhr对象的使用

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Ajax-XHR</title>
  8. </head>
  9. <body>
  10. <button onclick="getUser(this)">用户信息: xhr</button>
  11. <script>
  12. function getUser(btn) {
  13. // 1. 创建xhr对象
  14. const xhr = new XMLHttpRequest;
  15. // 2. 响应类型
  16. xhr.responseType = 'json'
  17. // 3. 配置参数
  18. let url = 'http://127.0.0.21/users.php?id=3'
  19. xhr.open('GET', url);
  20. // 4. 请求成功的回调
  21. xhr.onload = () => {
  22. // 返回的值
  23. console.log(xhr.response);
  24. }
  25. // 5. 请求失败的回调
  26. xhr.onerror = () => {
  27. // 返回的值
  28. console.log('请求错误');
  29. }
  30. // 6. 发起xhr请求
  31. xhr.send(null)
  32. }
  33. </script>
  34. </body>
  35. </html>
相关推荐
阅读 +