纯js实现轮播图效果

下面是使用纯JS实现轮播图效果的完整攻略:

确定HTML结构

首先,我们需要确定轮播图的HTML结构。可以使用以下结构:

<div id="slider">
  <ul>
    <li><img src="img/slide1.jpg" alt="Slide 1"></li>
    <li><img src="img/slide2.jpg" alt="Slide 2"></li>
    <li><img src="img/slide3.jpg" alt="Slide 3"></li>
  </ul>
</div>

这里使用了<div>标签包裹整个轮播图,并在其中使用了一个<ul>标签作为轮播图的容器,每张图片使用一个<li>标签包裹。<img>标签用于展示图片,可以设置srcalt属性。

设计CSS样式

接下来,我们需要设计用于显示轮播图的CSS样式,例如:

#slider {
  position: relative;
  overflow: hidden;
  width: 800px;
  height: 400px;
}
#slider ul {
  list-style: none;
  margin: 0;
  padding: 0;
  width: 3200px;
  position: absolute;
  left: 0;
  top: 0;
}
#slider li {
  float: left;
  width: 800px;
  height: 400px;
}

这里使用了position属性设置轮播图为相对定位,并使用overflow属性设置隐藏超出容器的内容。<ul>标签的position属性设置为绝对定位,并在左上角设置了相对于父元素的偏移位置。每张图片的<li>标签使用float属性使其并排,宽高设置为和容器相同。

编写JS代码

最后,我们需要编写实现轮播图效果的JS代码。可以使用以下代码实现轮播图自动播放、左右切换功能:

// 获取轮播图元素和图片列表
var slider = document.getElementById("slider");
var sliderList = document.querySelector("#slider ul");

// 获取轮播图的宽高
var sliderWidth = slider.offsetWidth;
var sliderHeight = slider.offsetHeight;

// 定义当前图片索引
var currentIndex = 0;

// 获取左右箭头元素
var prevBtn = document.getElementById("prev");
var nextBtn = document.getElementById("next");

// 定义轮播图自动播放方法
function autoPlay() {
  // 每隔3秒切换到下一张图片
  setInterval(function() {
    currentIndex++;
    if (currentIndex >= 3) {
      currentIndex = 0;
    }
    moveSlider(-sliderWidth * currentIndex);
  }, 3000);
}

// 定义图片移动方法
function moveSlider(offset) {
  sliderList.style.left = offset + "px";
}

// 绑定左右箭头点击事件
prevBtn.onclick = function() {
  currentIndex--;
  if (currentIndex < 0) {
    currentIndex = 2;
  }
  moveSlider(-sliderWidth * currentIndex);
};
nextBtn.onclick = function() {
  currentIndex++;
  if (currentIndex >= 3) {
    currentIndex = 0;
  }
  moveSlider(-sliderWidth * currentIndex);
};

// 自动播放轮播图
autoPlay();

首先,我们需要获取轮播图相关元素,包括轮播图本身和图片列表等。然后获取轮播图的宽高,并定义当前显示的图片索引。接下来,定义了自动播放和图片移动的方法,并监听左右箭头的点击事件。最后调用自动播放方法,实现轮播图的自动播放。

示例1:
下面是一个完整的示例,包含HTML、CSS和JS部分,可以在此基础上进行二次开发。
https://codepen.io/jeffguo123/pen/XWKBbVE

示例2:
以下是使用requestAnimationFrame方法优化图片移动效果的JS代码:

// 定义动画执行函数
function moveFrame(offset, duration) {
  var startTime = Date.now();
  var startOffset = parseFloat(sliderList.style.left);
  var distance = offset - startOffset;
  var progress, currentOffset;
  function frame() {
    progress = (Date.now() - startTime) / duration;
    if (progress > 1) {
      progress = 1;
    }
    currentOffset = startOffset + distance * progress;
    sliderList.style.left = currentOffset + "px";
    if (progress < 1) {
      requestAnimationFrame(frame);
    }
  }
  requestAnimationFrame(frame);
}

// 定义图片移动方法
function moveSlider(offset) {
  moveFrame(offset, 500);
}

这里使用了requestAnimationFrame方法代替setInterval方法,可以使图片移动效果更加流畅。首先定义了一个动画执行函数moveFrame,接受图片需要移动的偏移量和动画执行的时长。在函数内部,获取开始时间和起始偏移量,并计算出移动距离,然后使用requestAnimationFrame方法进行动画执行,根据当前已经执行的时间、起始偏移量和移动距离计算出当前的偏移量,并设置到图片容器上。如果动画还没有执行完毕,则继续递归调用requestAnimationFrame方法,直到动画执行完毕为止。

参考链接:
https://www.w3cplus.com/javascript/how-to-create-a-responsive-image-slider-in-javascript.html

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

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

相关文章

  • Div + CSS一些特效使div变成圆角、提交按钮的特效等等

    针对“Div + CSS一些特效使div变成圆角、提交按钮的特效等等”的问题,我来给大家详细讲解一下: 1. 圆角效果实现 实现圆角效果可以通过CSS的border-radius属性来设置。具体的方法如下: border-radius: 10px; 其中10px的值可以根据实际需求进行设置。如果要实现四个角都是圆角,则可以这样写: border-radius…

    css 2023年6月10日
    00
  • gif可以当成css的背景图片与普通图片是一样的

    首先,需要明确的是GIF可以作为CSS的背景图片,它与其他格式的图片没有什么本质区别。只是相对于静态的背景图片,GIF可以通过其帧动画特性展现动态效果,感官上更加生动有趣。 要在CSS中使用GIF作为背景图片,可以按照如下步骤操作: 在CSS文件中声明一个样式类,例如:.gif-bg: .gif-bg { background-image: url(‘./y…

    css 2023年6月9日
    00
  • JSON与js对象序列化实例详解

    当我们在前后端进行数据交互(如通过ajax请求获取数据)时,常常需要将数据格式化成JSON格式或js对象格式。在这个过程中,涉及到了JSON与js对象序列化的概念。下文将详细讲解JSON与js对象序列化的相关知识以及实例。 什么是JSON JSON是一种数据格式,它的全称是JavaScript Object Notation。JSON使用键值对的方式描述数据…

    css 2023年6月10日
    00
  • css中有序无序列表项list样式设置方法

    当我们在网页中使用列表时,为了美观和方便阅读,我们通常会为列表样式加上一些CSS样式。其中,有序列表和无序列表可以分别设置不同的样式。 一、无序列表样式设置 无序列表用 标签来表示,其默认的样式为实心点,我们可以通过CSS来修改其样式。 1. 修改默认实心点为其他符号 我们可以使用list-style-type属性来修改无序列表的标志符号。常见的符号有实心点…

    css 2023年6月9日
    00
  • HTML5离线应用与客户端存储的实现

    HTML5离线应用的目的是为了保证用户能在没有网络连接的情况下,也能够访问网站的内容。实现HTML5离线应用需要使用离线缓存机制,离线缓存机制能够将网站的完整内容缓存到用户本地,并且在没有网络连接时展示缓存的内容。 HTML5的客户端存储主要有两种方式:localStorage 和 sessionStorage。localStorage 是一种持久化的本地存…

    css 2023年6月9日
    00
  • vue 巧用过渡效果(小结)

    Vue 巧用过渡效果(小结)攻略 为什么要使用过渡效果? 在 Vue 中,数据驱动渲染界面是一种非常方便的方式,但是如果只是简单地更新 DOM,可能会让用户感觉到突兀。如果加上一些动画效果,这些更新就会更加平滑自然,提升用户体验。 Vue 过渡效果是如何工作的? Vue 过渡效果是通过 transition 组件和 css 实现的。当组件的可见性被改变时,t…

    css 2023年6月10日
    00
  • 解决vue打包css文件中背景图片的路径问题

    针对vue打包css文件中背景图片的路径问题,我为您提供以下完整攻略: 背景 在使用vue开发时,有时我们需要在CSS样式中使用背景图片,而在Webpack打包后,背景图片的路径不正确,导致页面无法正确显示背景图片。 解决方法 我们可以通过配置Webpack的url-loader和file-loader来解决这个问题。 1. 安装依赖 首先需要安装以下依赖:…

    css 2023年6月9日
    00
  • RGBa色彩的浏览器支持分析

    RGBa色彩的浏览器支持分析 RGBa是指Red(红)、Green(绿)、Blue(蓝)和alpha(透明度)的组合。这种颜色已经是一种广泛使用的方式,它可以通过使用CSS来应用到网页上。使用RGBa颜色可以使网站在不同的屏幕上有更好的显示效果。在这里,我们将详细讲解浏览器对RGBa的支持。 浏览器的支持情况 目前,几乎所有的浏览器都支持RGBa颜色,包括S…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部