结构

  1. <body>
  2. <!-- 外层容器 -->
  3. <div id="outer">
  4. <!-- 图片列表 -->
  5. <ul id="img-list">
  6. <li>
  7. <img src="./imgs/1.jpg" alt="">
  8. </li>
  9. <li>
  10. <img src="./imgs/2.jpg" alt="">
  11. </li>
  12. <li>
  13. <img src="./imgs/3.jpg" alt="">
  14. </li>
  15. <li>
  16. <img src="./imgs/4.jpg" alt="">
  17. </li>
  18. <li>
  19. <img src="./imgs/5.jpg" alt="">
  20. </li>
  21. <li>
  22. <img src="./imgs/6.jpg" alt="">
  23. </li>
  24. <!-- 为了保证效果,在最后一张图片后添加 第一张图片 -->
  25. <li>
  26. <img src="./imgs/1.jpg" alt="">
  27. </li>
  28. </ul>
  29. </div>
  30. </body>
  • 依次放入图片即可,需要包一个外层容器 outer
  • 在最后一张图片后,添加第一张图片,保证轮播时平滑。

样式

  1. <style>
  2. /* 样式重置 */
  3. * {
  4. padding: 0;
  5. margin: 0;
  6. }
  7. li {
  8. list-style: none;
  9. }
  10. /*
  11. 外层容器样式
  12. overflow: hidden; 裁剪多余的图片
  13. position: relative; 开启相对定位
  14. */
  15. #outer {
  16. width: 220px;
  17. height: 200px;
  18. margin: 0 auto;
  19. padding: 10px 0;
  20. background-color: wheat;
  21. overflow: hidden;
  22. position: relative;
  23. }
  24. /*
  25. 图片大小为 200 * 200,开启浮动后,显示单张图片
  26. 开启绝对定位,通过修改 left 实现轮播
  27. */
  28. #img-list {
  29. height: 200px;
  30. position: absolute;
  31. left: 0;
  32. }
  33. /* 开启浮动,横向布局 */
  34. #img-list li {
  35. float: left;
  36. margin: 0 10px;
  37. }
  38. /* 图片默认为 baseline 对其,修改使其无间隔 */
  39. #img-list li img {
  40. vertical-align: bottom;
  41. }
  42. </style>
  • 首先进行样式重置
  • 外层容器的大小刚好是一张图片的大小。也可以加上少许padding进行区分
  • overflow: hidden;,设置多余内容进行裁剪,显示第一张图片
  • 给每个img 外层的 li开启浮动,进行横向布局。开启绝对定位(用于修改left的值进行轮播)

    交互

    1. <script>
    2. window.onload = function () {
    3. // 灵活设置 img-list 的宽度(图片数量不固定)
    4. var imgs = document.getElementById("img-list");
    5. var count = imgs.querySelectorAll("li img").length;
    6. imgs.style.width = 220 * count + "px";
    7. // 起始索引
    8. var index = 0;
    9. // 轮播
    10. autoPlay();
    11. // 自动播放:就是一个定时器,其中需要改变 index + 照片移动
    12. function autoPlay() {
    13. setInterval(function () {
    14. index++;
    15. index %= count;
    16. move(imgs, "left", index * -220, 10);
    17. }, 2000)
    18. };
    19. // 要执行动画的对象、要变化的属性、终止条件、变化速度
    20. function move(obj, attr, end, speed) {
    21. // 清除上一个定时器
    22. clearInterval(obj.timer);
    23. // 获取属性当前值
    24. var cur = parseInt(getComputedStyle(obj)[attr]);
    25. // 判断变化的方向。
    26. if (cur > end) {
    27. speed = -speed;
    28. }
    29. // 设置定时器,比如功能从 0 --> -220,每次变化 10
    30. obj.timer = setInterval(() => {
    31. var oldV = getComputedStyle(obj)[attr];
    32. var newV = parseInt(oldV) + speed;
    33. if ((newV > end && speed > 0) || (newV < end && speed < 0)) {
    34. newV = end;
    35. // 防止 end = 190,newV = 180 + 20 > 190 类似情况
    36. }
    37. obj.style[attr] = newV + 'px';
    38. // 结束,关闭定时器
    39. if (newV === end) {
    40. clearInterval(obj.timer);
    41. // 结束后,如果是最后一张。状态重置,重新改变 left
    42. if (index >= count - 1) {
    43. index = 0;
    44. imgs.style.left = 0;
    45. }
    46. }
    47. }, 30)
    48. }
    49. }
    50. </script>
  • ul 的宽度进行动态设置(图片数量不确定)

  • 定义 index 表示图片的下标索引
  • autoPlay定义自动播放,即一个定时器,定时执行的内容包括:改变index 值,改变 left 的值(通过move 函数)
  • move函数:参数列表,需要执行变化的的对象,要变化的属性,终止条件,变化的速度
    • 在此例中,依次为 ulleft-220, -440...(图片对应left为[0,-220,-440…]),10