全功能轮播组件封装(详细注释)

本文介绍了一个具有翻页器、页面指示器及自动播放功能的轮播图组件实现方法。通过自定义HTML、CSS和JavaScript代码,实现了图片的平滑过渡效果及用户交互功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在线演示:http://js.jirengu.com/ferojuvonu/2/edit?html,js,output

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      .slider {
        overflow: hidden;
        position: relative;
      }
      .slider .slider-pager {
        position: absolute;
        bottom: 5px;
        left: 50%;
        transform: translateX(-50%);
      }
      .slider .slider-pager .active {
        padding-top: 5px;
      }
      .slider .slider-pre {
        position: absolute;
        top: 50%;
        left: 5px;
        transform: translateY(-50%);
      }
      .slider .slider-next {
        position: absolute;
        top: 50%;
        right: 5px;
        transform: translateY(-50%);
      }
      .slider ul {
        display: flex;
        list-style: none;
        margin: 0;
        padding: 0;
        transition: transform 0.5s;
      }
      ul img {
        vertical-align: top;
      }
    </style>
  </head>
  <body>
    <div class="slider">
      <ul>
        <li><img src="https://i.loli.net/2018/01/03/5a4c93e92b0e1.png" /></li>
        <li>
          <img src="https://i.loli.net/2018/01/03/5a4c93e931f93.png" />
        </li>
        <li>
          <img src="https://i.loli.net/2018/01/03/5a4c93e938b6b.png" />
        </li>
      </ul>
    </div>
  </body>
  <script src="./SliderController.js"></script>
</html>

/**
 * 具有翻页器,页面指示器,自动播放功能的轮播图
 */
class Slider {
  constructor(options) {
    this.options = options;
    this.element = document.querySelector(this.options.selector);
    this.init();
  }

  //初始化轮播图
  init() {
    //根据单个内容宽度设定容器宽度
    this.width = this.element.querySelector("li").clientWidth;
    this.length = this.element.querySelectorAll("li").length;
    this.element.style.width = this.width + "px";
    this.currentIndex = 0;
    if (this.options.controls) {
      this.renderControls();
    }
    if (this.options.pager) {
      this.renderPager();
    }
    if (this.options.autoPlay) {
      this.autoPlay();
    }
  }

  //渲染轮播页指示器
  renderPager() {
    //渲染单个指示点,并绑定事件
    const renderItem = index => {
      const item = document.createElement("li");
      item.style.margin = "0 2px";
      item.innerText = "_";
      item.onclick = () => {
        this.go(index);
      };
      return item;
    };
    const pager = document.createElement("ul");
    pager.setAttribute("class", "slider-pager");
    for (let i = 0; i < this.length; i++) {
      pager.appendChild(renderItem(i));
    }
    this.element.appendChild(pager);
    this.pagerRefresh(); //首次渲染时激活active样式
  }

  //根据currentIndex渲染被激活的指示点
  pagerRefresh() {
    if (!this.options.pager) return;
    const items = this.element.querySelector(".slider-pager").children;
    Array.prototype.forEach.call(items, i => {
      i.classList.remove("active");
    });
    items[this.currentIndex].classList.add("active");
  }

  //渲染左右翻页器,默认按钮为“<>”
  renderControls(preDiv, nextDiv) {
    const preBtn = document.createElement("span");
    preBtn.setAttribute("class", "slider-pre");
    preBtn.innerText = preDiv || "<";
    preBtn.onclick = () => this.go(this.currentIndex - 1);
    const nextBtn = document.createElement("span");
    nextBtn.setAttribute("class", "slider-next");
    nextBtn.innerText = nextDiv || ">";
    nextBtn.onclick = () => this.go(this.currentIndex + 1);
    this.element.appendChild(preBtn);
    this.element.appendChild(nextBtn);
  }

  //使用定时器自动播放
  play() {
    console.log("play");
    this.timerID = setInterval(() => {
      this.go(this.currentIndex + 1);
    }, 2000);
  }

  //清除定时器,止自动播放
  stop() {
    console.log("stop");
    clearInterval(this.timerID);
  }

  //自动播放
  autoPlay() {
    this.play();
    this.element.addEventListener("mouseenter", () => this.stop());
    this.element.addEventListener("mouseleave", () => this.play());
  }

  //核心方法,跳转至指定页数
  go(index) {
    length = this.length;
    index = index >= length ? 0 : index < 0 ? length - 1 : index; //判断跳转的位置是否超出范围(边缘处理)
    console.log(index);
    this.element.querySelector(
      "ul"
    ).style.cssText = `transform:translateX(-${index * this.width}px)`;
    this.currentIndex = index;
    this.pagerRefresh();
  }
}

new Slider({
  selector: ".slider", //轮播组件的位置
  autoPlay: true, //自动播放
  pager: true, //是否显示页面跳转指示器
  controls: true //是否显示上一页下一页控制器
});

转载于:https://www.cnblogs.com/YooHoeh/p/10659692.html

HTML5编程技术课堂作业一 一、作业要求 实现一个包含以下功能的轮播组件(7张图): 1.定时自动轮播:默认2秒切换一张图片 2.左右按钮控制:点击左右箭头实现手动切换 3.圆点导航控制:点击底部圆点指示器跳转对应图片 4.滑动动画效果:切换时需有平滑过渡动画 5.交互状态反馈:当前激活的导航按钮需高亮显示 三、作业提交要求 1.功能完整性: 实现自动播放与手动控制的协调(例如:手动操作后重置定时器) 处理边界情况(如:第一张图片点击上一张应跳到最后一张) 添加鼠标悬停暂停功能 2.代码规范: 使用ES6+语法 添加必要注释 模块化代码结构 四、参考网址:https://www.iqiyi.com/dianying/?vfrm=pcw_home&vfrmblk=712211_topNav&vfrmrst=712211_channel_dianying。 五、技术要点: a)图片布局设计可叠加亦可横向排列。 b)叠加布局设计display:block或display:none可让图片显示或隐藏。 c)横向布局注意只显示一张图片,不可全部显示。 d)叠加布局注意改变index值。 e)横向布局图片滚动用scrollLeft来判断图片左滚距离。 f)间隔执行命令: timer = setInterval(function() {}, 1000) g)取消间隔执行命令: clearInterval(timer); h)延迟执行命令:timer = setTimeout(run, 1000); i)取消延迟执行命令:clearTimeout(timer); j)轮播图片设置object.scrollLeft += 图片object.width; k)注意临界值的判断 轮播到最后一张图片时,图片object.scrollLeft 的值为图片object.width*4; 轮播到第一张图片时,图片object.scrollLeft = 0;
最新发布
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值