Blogger Information
Blog 30
fans 0
comment 0
visits 13895
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
轮播图实例与xhr对象的使用
天宁
Original
382 people have browsed it

轮播图实例

代码

  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. position: relative;
  20. }
  21. .slider .imgs img {
  22. /* 图片完全充满父级空间显示 */
  23. height: 100%;
  24. width: 100%;
  25. /* 图片带有圆角 */
  26. border-radius: 10px;
  27. /* 默认图片全部隐藏,只有有active的图片才显示 */
  28. display: none;
  29. }
  30. .slider .imgs img:hover {
  31. cursor: pointer;
  32. }
  33. /* 默认显示第一张 */
  34. .slider .imgs img.active {
  35. display: block;
  36. }
  37. /* 轮播图按钮组 */
  38. .slider .btns {
  39. /* 按钮水平一排显示,用flex,且水平居中 */
  40. display: flex;
  41. place-content: center;
  42. }
  43. .slider .btns span {
  44. /* 按钮宽高相同,确定显示成一个正圆 */
  45. width: 8px;
  46. height: 8px;
  47. /* 加上红色背景和数字是为了布局时可以看到,一会更去掉 */
  48. background-color: rgba(255, 255, 255, 0.4);
  49. /* 50%可确保显示为正圆 */
  50. border-radius: 50%;
  51. /* 按钮上外边距负值,可将它上移,可移动到图片中下方 */
  52. margin: -12px 3px 5px;
  53. z-index: 99;
  54. }
  55. .slider .btns span.active {
  56. background-color: #fff;
  57. }
  58. /* 导航切换按钮 */
  59. .slider .imgs > span:first-of-type {
  60. width: 20px;
  61. height: 30px;
  62. border-radius: 50px 0 0 50px;
  63. background: rgba(0, 0, 0, 0.1);
  64. color: #f0f8ff;
  65. position: absolute;
  66. top: 60px;
  67. text-align: center;
  68. line-height: 25px;
  69. }
  70. .slider .imgs > span:last-of-type {
  71. width: 20px;
  72. height: 30px;
  73. border-radius: 0 50px 50px 0;
  74. background: rgba(0, 0, 0, 0.1);
  75. color: #f0f8ff;
  76. position: absolute;
  77. top: 60px;
  78. text-align: center;
  79. line-height: 25px;
  80. right: 0;
  81. }
  82. .slider .imgs > span:hover {
  83. background-color: red;
  84. cursor: pointer;
  85. }
  86. </style>
  87. </head>
  88. <body>
  89. <div class="slider">
  90. <!--
  91. 图片容器
  92. 1. 图片组
  93. 2. 按钮组
  94. 注: 按钮数组与图片数量是一样的
  95. -->
  96. <div class="imgs">
  97. <!-- 轮播图默认从第一张开始显示 -->
  98. <span>&lt;</span>
  99. <img src="./images/banner1.jpg" alt="" data-index="1" class="active" />
  100. <img src="./images/banner2.jpg" alt="" data-index="2" />
  101. <img src="./images/banner3.png" alt="" data-index="3" />
  102. <span>&gt;</span>
  103. </div>
  104. <!-- 切换按钮数量与图片数量必须一致 -->
  105. <div class="btns">
  106. <span data-index="1" class="active" onclick="setActive()"></span>
  107. <span data-index="2" onclick="setActive()"></span>
  108. <span data-index="3" onclick="setActive()"></span>
  109. </div>
  110. </div>
  111. <script>
  112. // 1. 获取全部图片和按钮
  113. const imgs = document.querySelectorAll('.slider .imgs img');
  114. const btns = document.querySelectorAll('.slider .btns span');
  115. // 2. 设置激活状态
  116. function setActive() {
  117. // 1. 清空图片和所有按钮的激活状态
  118. imgs.forEach(img => img.classList.remove('active'));
  119. btns.forEach(btn => btn.classList.remove('active'));
  120. // 2. 根据按钮的索引data-index来确定应该将哪一张图片显示出来class=active
  121. event.target.classList.add('active');
  122. imgs.forEach(img => {
  123. if (img.dataset.index === event.target.dataset.index) {
  124. img.classList.add('active');
  125. }
  126. });
  127. }
  128. // 3. 自动播放
  129. // [1,2,3]
  130. // [2,3,1]
  131. // [3,1,2]
  132. // [1,2,3]
  133. // 首尾相连,实现循环播放
  134. // 自动点击: 事件派发器
  135. // 间歇式触发,每隔一段固定时间会自动触发一次事件
  136. // setInterval: 除了回调和时间外,还可传入第三个参数,做为回调的参数
  137. let carousel = setInterval(
  138. arr => {
  139. // 1. 头部删除
  140. let i = arr.shift();
  141. // 2. 尾部追加
  142. arr.push(i);
  143. // 3. 事件派发: 模拟用户点击
  144. btns[i].dispatchEvent(new Event('click'));
  145. },
  146. 2000,
  147. Object.keys(btns)
  148. );
  149. // console.log(Object.keys(btns));
  150. // console.log(Object.keys(imgs));
  151. //停止自动播放;
  152. document.querySelector('.slider .imgs').addEventListener('mouseover', () => {
  153. clearInterval(carousel);
  154. console.log('停止自动播放');
  155. });
  156. //开始自动播放
  157. document.querySelector('.slider .imgs').addEventListener('mouseout', () => {
  158. carousel = setInterval(
  159. arr => {
  160. let i = arr.shift();
  161. arr.push(i);
  162. btns[i].dispatchEvent(new Event('click'));
  163. },
  164. 2000,
  165. Object.keys(btns)
  166. );
  167. console.log('开始自动播放');
  168. });
  169. function name(params) {}
  170. //向左滚动
  171. let arrs = Object.keys(imgs);
  172. console.log(arrs);
  173. document.querySelector('.slider .imgs > span:first-of-type').addEventListener('click', () => {
  174. //尾部删除,头部添加
  175. let i = arrs.pop();
  176. arrs.unshift(i);
  177. console.log('当前索引', i);
  178. console.log(arrs);
  179. imgs.forEach((item, index) => {
  180. item.classList.remove('active');
  181. btns[index].classList.remove('active');
  182. });
  183. console.log('要添加的索引', arrs[0]);
  184. imgs[arrs[0]].classList.add('active');
  185. btns[arrs[0]].classList.add('active');
  186. });
  187. //向右滚动
  188. document.querySelector('.slider .imgs > span:last-of-type').addEventListener('click', () => {
  189. // 头部删除,尾部添加
  190. let i = arrs.shift();
  191. arrs.push(i);
  192. console.log('当前索引', i);
  193. console.log(arrs);
  194. imgs.forEach((item, index) => {
  195. item.classList.remove('active');
  196. btns[index].classList.remove('active');
  197. });
  198. console.log('要添加的索引', arrs[0]);
  199. imgs[arrs[0]].classList.add('active');
  200. btns[arrs[0]].classList.add('active');
  201. });
  202. // 作业1: 实现鼠标悬停时自动停止播放, 离开时又自动播放
  203. // 作业2[可选]: 给这个轮播图加上翻页按按钮,实现向前和向后翻页播放
  204. </script>
  205. </body>
  206. </html>

XHR对象的使用

  1. // 1. 传统 XHR
  2. /**
  3. * 1. 创建对象: new XMLHttpRequest();
  4. * 2. 响应类型: xhr.responseType = "json";
  5. * 3. 配置参数: xhr.open("GET", url, true);
  6. * 4. 请求回调: xhr.onload = () => console.log(xhr.response);
  7. * 5. 失败回调: xhr.onerror = () => console.log("Error");
  8. * 6. 发起请求: xhr.send(null);
  9. *
  10. * xhr 至少监听2个事件: load,error, 调用2个函数: open,send
  11. * post请求,需要设置一下请求头与请求的数据,其它与get请求完全相同
  12. */
  13. function getUser1(btn) {
  14. // 1. 创建xhr对象
  15. const xhr = new XMLHttpRequest;
  16. // 2. 响应类型
  17. xhr.responseType = 'json'
  18. // 3. 配置参数
  19. let url = 'http://xhr411.com/users.php?id=2'
  20. xhr.open('GET', url);
  21. // 4. 请求成功的回调
  22. xhr.onload = () => {
  23. // 返回的值
  24. console.log(xhr.response);
  25. //返回的值可以进行操作以及渲染到界面上
  26. }
  27. // 5. 请求失败的回调
  28. xhr.onerror = () => {
  29. // 返回的值
  30. console.log('请求错误');
  31. }
  32. // 6. 发起xhr请求
  33. xhr.send(null)
  34. }
Correcting teacher:PHPzPHPz

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