js实现自动播放匀速轮播图

yizhihongxing

JS实现自动播放匀速轮播图攻略

需求分析

我们需要实现一个图片自动播放的功能,并且播放速度匀速,不会因为帧率的问题出现卡顿等问题。我们需要完成以下需求:

  1. 图片从左往右轮播;
  2. 图片循环播放;
  3. 图片播放的速度需要匀速;
  4. 用户可以手动控制图片的播放。

实现过程

1. HTML结构

我们需要先确定HTML结构,以下是一个基本的HTML结构:

<div class="container">
  <ul class="img-box">
    <li><img src="img/img1.jpg"></li>
    <li><img src="img/img2.jpg"></li>
    <li><img src="img/img3.jpg"></li>
    <li><img src="img/img4.jpg"></li>
  </ul>
  <div class="prev-btn"></div>
  <div class="next-btn"></div>
</div>

在这个HTML结构中,我们需要一个包裹整个轮播图的父容器,一个存放图片的<ul>元素以及两个按钮用于控制图片的自动播放。

2. CSS样式

我们需要为轮播图的组件设置CSS样式,这里我们只给出最基本的样式:

/* 外层容器 */
.container {
  width: 500px;
  height: 300px;
  position: relative;
  overflow: hidden;
}

/* 图片列表 */
.img-box {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 400%;
  list-style: none;
}

/* 图片项 */
.img-box li {
  float: left;
  height: 100%;
  width: 25%;
}

/* 图片 */
.img-box li img {
  max-width: 100%;
  height: auto;
}

/* 控制按钮 */
.prev-btn, .next-btn {
  width: 50px;
  height: 50px;
  line-height: 50px;
  text-align: center;
  color: #fff;
  background-color: #333;
  position: absolute;
  top: 50%;
  margin-top: -25px;
  z-index: 999;
  cursor: pointer;
}

.prev-btn {
  left: 0;
}

.next-btn {
  right: 0;
}

在这里,我们为父容器设置了宽度和高度,并通过overflow: hidden属性隐藏了超出容器范围的内容,为图片列表设置了position:absolute属性,使得图片可以通过改变left属性来实现左右滚动的效果,为了实现循环播放,我们需要将图片列表的宽度设置为总图片宽度的四倍。此外,我们为控制按钮设置了样式。

3. JS实现

3.1 获取元素

我们需要用JS获取我们需要的元素:

const container = document.querySelector('.container');
const imgBox = document.querySelector('.img-box');
const imgList = document.querySelectorAll('.img-box li');
const prevBtn = document.querySelector('.prev-btn');
const nextBtn = document.querySelector('.next-btn');

3.2 自动播放

我们需要编写一个函数用于在一定时间间隔内实现图片的自动播放:

let index = 0;
let interval;

function autoPlay() {
  interval = setInterval(() => {
    index++;
    move(index);
  }, 3000);
}

首先,我们通过index变量来标记当前显示图片的索引,interval变量用于存储我们采用的计时器实例。在autoPlay函数中,我们使用了setInterval函数来实现轮播图的主要功能:每隔3秒更新一次index并调用move函数切换图片。

3.3 切换图片

在此之前,我们需要编写一个函数用于计算切换后的left值:

function calcLeft(index) {
  return -index * (100 / imgList.length);
}

calcLeft函数中,我们根据当前图片索引和图片总数计算出了应该显示的left值。

接下来,我们需要编写move函数,并调用calcLeft函数来计算left值并通过transform样式属性实现动画效果:

function move(index) {
  let left = calcLeft(index);
  imgBox.style.transform = `translate3d(${left}%, 0, 0)`;
}

3.4 控制按钮

接下来,我们需要编写点击按钮切换图片的函数:

prevBtn.addEventListener('click', () => {
  index--;
  move(index);
});

nextBtn.addEventListener('click', () => {
  index++;
  move(index);
});

在这里,我们通过给上一页和下一页按钮添加点击事件监听器,在点击事件中更新index并调用move函数切换图片。

3.5 完整代码示例

<div class="container">
  <ul class="img-box">
    <li><img src="img/img1.jpg"></li>
    <li><img src="img/img2.jpg"></li>
    <li><img src="img/img3.jpg"></li>
    <li><img src="img/img4.jpg"></li>
  </ul>
  <div class="prev-btn"></div>
  <div class="next-btn"></div>
</div>

<style>
  /* 外层容器 */
  .container {
    width: 500px;
    height: 300px;
    position: relative;
    overflow: hidden;
  }

  /* 图片列表 */
  .img-box {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: 400%;
    list-style: none;
  }

  /* 图片项 */
  .img-box li {
    float: left;
    height: 100%;
    width: 25%;
  }

  /* 图片 */
  .img-box li img {
    max-width: 100%;
    height: auto;
  }

  /* 控制按钮 */
  .prev-btn,
  .next-btn {
    width: 50px;
    height: 50px;
    line-height: 50px;
    text-align: center;
    color: #fff;
    background-color: #333;
    position: absolute;
    top: 50%;
    margin-top: -25px;
    z-index: 999;
    cursor: pointer;
  }

  .prev-btn {
    left: 0;
  }

  .next-btn {
    right: 0;
  }
</style>

<script>
  // 获取元素
  const container = document.querySelector('.container');
  const imgBox = document.querySelector('.img-box');
  const imgList = document.querySelectorAll('.img-box li');
  const prevBtn = document.querySelector('.prev-btn');
  const nextBtn = document.querySelector('.next-btn');

  // 自动播放
  let index = 0;
  let interval;

  function autoPlay() {
    interval = setInterval(() => {
      index++;
      move(index);
    }, 3000);
  }

  // 切换图片
  function calcLeft(index) {
    return -index * (100 / imgList.length);
  }

  function move(index) {
    let left = calcLeft(index);
    imgBox.style.transform = `translate3d(${left}%, 0, 0)`;
  }

  // 控制按钮
  prevBtn.addEventListener('click', () => {
    index--;
    move(index);
  });

  nextBtn.addEventListener('click', () => {
    index++;
    move(index);
  });

  // 启动自动播放
  autoPlay();
</script>

示例说明

示例1

此处我们使用了translate3d属性实现了动画效果。在函数autoPlay中,我们使用了setInterval函数来实现轮播图的主要功能:每隔3秒更新一次index并调用move函数切换图片。在move函数中,我们根据当前图片索引和图片总数计算出了应该显示的left值,并通过transform样式属性实现动画效果。在点击按钮时,我们更新index并调用move函数切换图片。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>示例1</title>
  <style>
    /* 外层容器 */
    .container {
      width: 500px;
      height: 300px;
      position: relative;
      overflow: hidden;
    }

    /* 图片列表 */
    .img-box {
      position: absolute;
      top: 0;
      left: 0;
      height: 100%;
      width: 400%;
      list-style: none;
    }

    /* 图片项 */
    .img-box li {
      float: left;
      height: 100%;
      width: 25%;
    }

    /* 图片 */
    .img-box li img {
      max-width: 100%;
      height: auto;
    }

    /* 控制按钮 */
    .prev-btn,
    .next-btn {
      width: 50px;
      height: 50px;
      line-height: 50px;
      text-align: center;
      color: #fff;
      background-color: #333;
      position: absolute;
      top: 50%;
      margin-top: -25px;
      z-index: 999;
      cursor: pointer;
    }

    .prev-btn {
      left: 0;
    }

    .next-btn {
      right: 0;
    }
  </style>
</head>
<body>
  <div class="container">
    <ul class="img-box">
      <li><img src="img/img1.jpg"></li>
      <li><img src="img/img2.jpg"></li>
      <li><img src="img/img3.jpg"></li>
      <li><img src="img/img4.jpg"></li>
    </ul>
    <div class="prev-btn"></div>
    <div class="next-btn"></div>
  </div>

  <script>
    const container = document.querySelector('.container');
    const imgBox = document.querySelector('.img-box');
    const imgList = document.querySelectorAll('.img-box li');
    const prevBtn = document.querySelector('.prev-btn');
    const nextBtn = document.querySelector('.next-btn');

    // 自动播放
    let index = 0;
    let interval;

    function autoPlay() {
      interval = setInterval(() => {
        index++;
        move(index);
      }, 3000);
    }

    // 切换图片
    function calcLeft(index) {
      return -index * (100 / imgList.length);
    }

    function move(index) {
      let left = calcLeft(index);
      imgBox.style.transform = `translate3d(${left}%, 0, 0)`;
    }

    // 控制按钮
    prevBtn.addEventListener('click', () => {
      index--;
      move(index);
    });

    nextBtn.addEventListener('click', () => {
      index++;
      move(index);
    });

    // 启动自动播放
    autoPlay();
  </script>
</body>
</html>

示例2

此处我们使用了CSS3的过渡效果实现了动画效果。在函数autoPlay中,我们通过给图片列表设置过渡效果来实现动画效果。在函数move中,我们通过给图片列表设置left值来实现图片的切换。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>示例2</title>
  <style>
    /* 外层容器 */
    .container {
      width: 500px;
      height: 300px;
      position: relative;
      overflow: hidden;
    }

    /* 图片列表 */
    .img-box {
      position: absolute;
      top: 0;
      left: 0;
      height: 100%;
      width: 400%;
      list-style: none;
      transition: all .5s;
    }

    /* 图片项 */
    .img-box li {
      float: left;
      height: 100%;
      width: 25%;
    }

    /* 图片 */
    .img-box li img {
      max-width: 100%;
      height: auto;
    }

    /* 控制按钮 */
    .prev-btn,
    .next-btn {
      width: 50px;
      height: 50px;
      line-height: 50px;
      text-align: center;
      color: #fff;
      background-color: #333;
      position: absolute;
      top: 50%;
      margin-top: -25px;
      z-index: 999;
      cursor: pointer;
    }

    .prev-btn {
      left: 0;
    }

    .next-btn {
      right: 0;
    }
  </style>
</head>
<body>
  <div class="container">
    <ul class="img-box">
      <li><img src="img/img1.jpg"></li>
      <li><img src="img/img2.jpg"></li>
      <li><img src="img/img3.jpg"></li>
      <li><img src="img/img4.jpg"></li>
    </ul>
    <div class="prev-btn"></div>
    <div class="next-btn"></div>
  </div>

  <script>
    const container = document.querySelector('.container');
    const imgBox = document.querySelector('.img-box');
    const imgList = document.querySelectorAll('.img-box li');
    const prevBtn = document.querySelector('.prev-btn');
    const nextBtn = document.querySelector('.next-btn');

    // 自动播放
    let index = 0;
    let interval;

    function autoPlay() {
      interval = setInterval(() => {
        index++;
        move(index);
      }, 3000);
    }

    // 切换图片
    function calcLeft(index) {
      return -index * (100 / imgList.length);
    }

    function move(index) {
      let left = calcLeft(index);
      imgBox.style.left = `${left}%`;
    }

    // 控制按钮
    prevBtn.addEventListener('click', () => {
      index--;
      move(index);
    });

    nextBtn.addEventListener('click', () => {
      index++;
      move(index);
    });

    // 启动自动播放
    autoPlay();
  </script>
</body>
</html>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现自动播放匀速轮播图 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • Java编程之如何通过JSP实现头像自定义上传

    下面是详细讲解关于Java编程如何通过JSP实现头像自定义上传的完整攻略。 简介 在现代社交网络和互联网应用程序中,用户的头像很重要。头像可以为应用程序的用户界面和用户个人信息提供额外的信息。本文将讨论如何利用Java编程语言和JSP技术实现头像自定义上传。本文将具体介绍如何实现头像上传到服务器和生成预览图像。我们还将使用jQuery库向服务器发送Ajax请…

    JavaScript 2023年6月11日
    00
  • JavaScript实现单例模式实例分享

    下面是JavaScript实现单例模式的完整攻略。 一、什么是单例模式 单例模式是一种常见的设计模式,在整个系统中只有一个实例对象,可以节约系统资源,减少不必要的对象创建,同时也有助于控制对象的管理。在 JavaScript 中,单例模式一般有两种实现方式:闭包和 ES6 的 class 语法糖。 二、闭包实现单例模式 最常见的单例模式实现方式是使用闭包,将…

    JavaScript 2023年6月10日
    00
  • JS实现至少包含字母、大小写数字、字符的密码等级的两种方法

    要实现至少包含字母、大小写数字、字符的密码等级,可以采用以下两种方法: 方法一:使用正则表达式判断密码是否符合规范 首先,需要定义一个正则表达式来判断密码是否符合要求,可以使用以下正则表达式: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*]).{8,}$/ 其中: (?=.*\d):表示密码中必须包含至…

    JavaScript 2023年6月10日
    00
  • jQuery表单验证插件formValidator(改进版)

    jQuery表单验证插件formValidator(改进版)攻略 一、简介 jQuery表单验证插件formValidator是一款实用的前端验证插件,可以方便地验证表单输入是否符合指定的规则,从而提高用户输入数据的准确度,避免非法数据被提交。经过改进的formValidator拓展了原版的功能,增加了新的验证规则,如密码强度验证、手机号码验证等,同时去除了…

    JavaScript 2023年6月10日
    00
  • js解析与序列化json数据(三)json的解析探讨

    JS解析与序列化JSON数据 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON是JavaScript原生支持的格式之一,可以通过JavaScript中内置的 JSON 对象直接进行解析和生成。 本文将主要讨论如何解析和序列化 JSON 数据,涉及的主要内容…

    JavaScript 2023年5月27日
    00
  • 解决微信内置浏览器返回上一页强制刷新问题方法

    解决微信内置浏览器返回上一页强制刷新问题方法 问题描述 在微信内置浏览器中,当用户点击返回上一页时,页面会被强制刷新,导致页面中的一些数据丢失或者重新加载,影响用户体验。 引起问题的原因 在微信内置浏览器中,当页面的url发生变化时,微信浏览器会强制刷新页面。这种情况下,页面中所有的数据都会被重新加载,导致我们在实现页面交互时的一些问题。 解决方案 方案一:…

    JavaScript 2023年6月11日
    00
  • vue-router 前端路由之路由传值的方式详解

    关于“vue-router 前端路由之路由传值的方式详解”的攻略,我会详细讲解两种常用的路由传值方式,以及每种方式的优缺点和适用场景。同时也会提供两个示例来讲解如何使用这些传值方式。 1. 通过路由参数传递数据 1.1 传递参数的方式 vue-router允许我们通过在路由定义时添加参数来传递数据。在route对象中我们可以通过$route.params来访…

    JavaScript 2023年6月11日
    00
  • JavaScript 申明函数的三种方法 每个函数就是一个对象(一)

    根据你的要求,我来详细讲解一下“JavaScript 申明函数的三种方法 每个函数就是一个对象(一)”的完整攻略。 什么是函数? 在JavaScript中,函数是一种可重用的代码块,可以接收输入信息并返回输出。我们可以使用函数来封装一些代码,然后在需要的时候调用它。 申明函数的三种方法 在JavaScript中,我们可以使用三种不同的方式来申明一个函数。 1…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部