利用 CSS3 实现的无缝轮播功能代码

我来详细讲解利用 CSS3 实现的无缝轮播功能代码的完整攻略:

1. 准备工作

1.1 HTML 结构

首先,我们需要准备好需要轮播的图片以及用于显示轮播图片的 HTML 结构。通常情况下,我们会使用 ulli 标签创建图片列表。例如:

<div class="slider">
  <ul>
    <li><img src="image1.jpg" alt="image1"></li>
    <li><img src="image2.jpg" alt="image2"></li>
    <li><img src="image3.jpg" alt="image3"></li>
    <!-- more images -->
  </ul>
</div>

1.2 CSS 样式

接下来,我们需要给图片列表和图片设置样式。例如,我们需要将图片列表设置为横向排列并隐藏溢出部分,为图片设置宽度和高度,以及使图片水平居中等。例如:

.slider {
  width: 100%;
  overflow: hidden;
}
.slider ul {
  list-style: none;
  display: flex;
  width: 300%; /* 将图片总宽度设置为 300% */
  animation: slide 10s linear infinite; /* 添加动画效果 */
}
.slider li {
  width: 33.33%; /* 将每张图片的宽度设置为图片列表总宽度的 1/3 */
  height: 200px;
  text-align: center; /* 让图片水平居中 */
}
.slider li img {
  max-width: 100%;
  max-height: 100%;
}

在上面的代码中,我们定义了一个名为 .slider 的 CSS 类,它用于包装图片列表,让我们可以控制轮播效果。同时,我们还定义了一个名为 slide 的动画效果,将在下一步的内容中进一步讲解。

2. 利用 CSS3 实现的无缝轮播功能

要实现无缝轮播功能,我们需要使用 CSS3 的 animation 属性来定义动画效果,并使用 transform 属性来平滑地移动图片。下面是实现无缝轮播功能的完整 CSS 代码:

.slider ul {
  list-style: none;
  display: flex;
  width: 300%; /* 将图片总宽度设置为 300% */
  animation: slide 10s linear infinite; /* 添加动画效果 */
}

@keyframes slide {
  0% {
    transform: translateX(0%); /* 从 0% 的位置开始移动 */
  }
  33.33% {
    transform: translateX(-100%); /* 移动到第 2 张图片 */
  }
  66.66% {
    transform: translateX(-200%); /* 移动到第 3 张图片 */
  }
  100% {
    transform: translateX(0%); /* 回到第 1 张图片 */
  }
}

在上面的代码中,我们使用了 keyframes 关键字定义了一个名为 slide 的动画效果。在 slide 动画中,我们使用了 transform 属性来平滑地移动图片。其中,translateX 函数用于在水平方向上移动图片, -100% 表示向左移动一个图片的宽度, -200% 表示向左移动两个图片的宽度。

最后,我们将 slide 动画应用到图片列表上,并设置动画的持续时间为 10s,使图片在 10s 的时间内完成一个轮播循环。由于设置了 infinite 参数,所以这个轮播循环将一直持续下去,直到页面被关闭。

3. 示例说明

3.1 示例一

下面是一个简单的无缝轮播示例。我们使用了 4 张图片来进行轮播,并设置了轮播间隔为 3s。同时,我们还添加了左右箭头和圆点指示器来让用户可以手动控制轮播。

<div class="slider">
  <ul>
    <li><img src="image1.jpg" alt="image1"></li>
    <li><img src="image2.jpg" alt="image2"></li>
    <li><img src="image3.jpg" alt="image3"></li>
    <li><img src="image4.jpg" alt="image4"></li>
  </ul>
  <div class="arrows">
    <a href="#" class="prev">&lt;</a>
    <a href="#" class="next">&gt;</a>
  </div>
  <div class="dots">
    <a href="#" class="dot active"></a>
    <a href="#" class="dot"></a>
    <a href="#" class="dot"></a>
    <a href="#" class="dot"></a>
  </div>
</div>

<style>
.slider {
  position: relative;
  width: 100%;
  height: 400px;
  overflow: hidden;
}
.slider ul {
  list-style: none;
  display: flex;
  width: 400%;
  animation: slide 12s linear infinite;
}
.slider li {
  width: 25%;
  height: 100%;
  text-align: center;
}
.slider li img {
  height: 100%;
  max-width: 100%;
}
.arrows {
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
  z-index: 1;
  font-size: 30px;
  color: #fff;
  text-decoration: none;
}
.arrows a {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  padding: 10px;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.5);
  transition: background-color 0.3s ease-in-out;
}
.arrows a:hover {
  background: rgba(0, 0, 0, 0.8);
}
.prev {
  left: 20px;
}
.next {
  right: 20px;
}
.dots {
  position: absolute;
  bottom: 20px;
  left: 0;
  right: 0;
  text-align: center;
  z-index: 1;
}
.dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  margin: 0 5px;
  background: rgba(0, 0, 0, 0.3);
  transition: background-color 0.3s ease-in-out;
}
.dot.active {
  background: rgba(0, 0, 0, 0.8);
}
</style>

<script>
var slider = document.querySelector('.slider');
var prev = slider.querySelector('.prev');
var next = slider.querySelector('.next');
var dots = slider.querySelectorAll('.dot');
var ul = slider.querySelector('ul');
var li = slider.querySelectorAll('li');
var index = 1;
var len = li.length;
var interval = 3000;
var timer;

// 上一张图片
function prevImage() {
  index--;
  if (index < 1) {
    index = len - 2;
    ul.style.transition = 'none';
    ul.style.transform = 'translateX(-' + (len - 1) * 25 + '%)';
  }
  setTimeout(() => {
    ul.style.transition = 'transform 0.5s ease-in-out';
    ul.style.transform = 'translateX(-' + (index - 1) * 25 + '%)';
    setActiveDot();
  }, 0);
}

// 下一张图片
function nextImage() {
  index++;
  if (index >= len - 1) {
    index = 1;
    ul.style.transition = 'none';
    ul.style.transform = 'translateX(0)';
  }
  setTimeout(() => {
    ul.style.transition = 'transform 0.5s ease-in-out';
    ul.style.transform = 'translateX(-' + (index - 1) * 25 + '%)';
    setActiveDot();
  }, 0);
}

// 设置当前激活的圆点
function setActiveDot() {
  for (var i = 0; i < dots.length; i++) {
    dots[i].classList.remove('active');
  }
  dots[index - 1].classList.add('active');
}

// 自动轮播
function autoPlay() {
  timer = setInterval(nextImage, interval);
}

autoPlay();

prev.addEventListener('click', function(e) {
  e.preventDefault();
  clearInterval(timer);
  prevImage();
  autoPlay();
});

next.addEventListener('click', function(e) {
  e.preventDefault();
  clearInterval(timer);
  nextImage();
  autoPlay();
});

for (var i = 0; i < dots.length; i++) {
  dots[i].addEventListener('click', function(e) {
    e.preventDefault();
    clearInterval(timer);
    index = Array.from(dots).indexOf(e.target) + 1;
    ul.style.transition = 'transform 0.5s ease-in-out';
    ul.style.transform = 'translateX(-' + (index - 1) * 25 + '%)';
    setActiveDot();
    autoPlay();
  });
}
</script>

在上面的示例中,我们首先定义了一个包含 4 张图片的图片列表,它的 HTML 结构如下:

<div class="slider">
  <ul>
    <li><img src="image1.jpg" alt="image1"></li>
    <li><img src="image2.jpg" alt="image2"></li>
    <li><img src="image3.jpg" alt="image3"></li>
    <li><img src="image4.jpg" alt="image4"></li>
  </ul>
  <!-- arrows and dots -->
</div>

接着,我们使用 CSS3 的 animation 属性定义了一个名为 slide 的动画效果,并应用到了图片列表上。动画效果使用了 translateX 函数来平滑地移动图片,实现了无缝轮播的效果。

在示例中,我们还添加了左右箭头和圆点指示器来让用户可以手动控制轮播。在 JavaScript 代码中,我们为左右箭头和圆点指示器添加了点击事件处理程序,用于控制图片列表的移动和圆点指示器的激活状态。同时,我们还使用了 setInterval 函数来控制轮播间隔。

在上面的示例中,我们使用了比较简单的逻辑来控制图片的移动。如果达到了列表的边界,我们需要切换到第 1 或最后 1 张图片继续播放。具体来说,如果当前图片是第 1 张,则我们需要将图片列表移动到第 4 张,然后使用 translateX 函数将图片第 1 张移动到可视区域。如果当前图片是最后 1 张,则我们需要将图片列表移动到第 1 张,然后使用 translateX 函数将图片第 2 张移动到可视区域。

3.2 示例二

除了使用左右箭头和圆点指示器来控制轮播,我们还可以利用鼠标悬停事件来暂停轮播。下面是一个带有鼠标悬停暂停轮播功能的无缝轮播示例。

<div class="slider">
  <ul>
    <li><img src="image1.jpg" alt="image1"></li>
    <li><img src="image2.jpg" alt="image2"></li>
    <li><img src="image3.jpg" alt="image3"></li>
    <li><img src="image4.jpg" alt="image4"></li>
  </ul>
</div>

<style>
.slider {
  position: relative;
  width: 100%;
  height: 400px;
  overflow: hidden;
}
.slider ul {
  list-style: none;
  display: flex;
  width: 400%;
  animation: slide 12s linear infinite;
}
.slider li {
  width: 25%;
  height: 100%;
  text-align: center;
}
.slider li img {
  height: 100%;
  max-width: 100%;
}
.slider:hover ul {
  animation-play-state: paused;
}
</style>

在上面的示例中,我们使用了 CSS3 的 animation-play-state 属性来控制动画的播放状态。如果鼠标悬停在图片列表上,则我们将 animation-play-state 设置为 paused,使动画停止播放。如果鼠标移出图片列表,则动画继续播放。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用 CSS3 实现的无缝轮播功能代码 - Python技术站

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

相关文章

  • jQuery实现信息提示框(带有圆角框与动画)效果

    下面是详细讲解“jQuery实现信息提示框(带有圆角框与动画)效果”的完整攻略。 1. 基本思路 信息提示框主要分为两部分:HTML和CSS。HTML负责页面结构,CSS负责页面样式。但是我们还需要使用JavaScript来实现一些动画效果及交互效果。具体实现步骤如下: 1.1 HTML结构 首先,编写提示框所需的HTML结构: <div class=…

    css 2023年6月11日
    00
  • vue前端性能优化之预加载和懒加载示例详解

    Vue前端性能优化之预加载和懒加载示例详解 前言 随着互联网信息的爆炸式增长,用户使用大量的移动设备上网冲浪,对网站的访问速度提出了更高的要求。为了提高网站的性能,我们可以使用预加载和懒加载这两种技术。 预加载 预加载是指在页面加载完成以及用户行为之前,提前加载所需的资源,从而提高页面的响应速度和用户体验。常用的预加载测试方法有以下两种: link标签方式实…

    css 2023年6月10日
    00
  • 详谈DOM简介及节点、属性、查找节点的方法

    DOM(Document Object Model)是一种用于表示和操作HTML、XML文档的API,它将HTML、XML文档表示为一个树形结构,并且提供操作该树形结构的方法。在DOM模型中,文档被表示为节点和对象的组合,节点包括元素节点、文本节点、属性节点等,对象包括document对象、element对象等。 节点 在DOM模型中,所有的HTML元素都是…

    css 2023年6月9日
    00
  • 微信小程序实现动态获取元素宽高的方法分析

    微信小程序实现动态获取元素宽高的方法分析 在开发微信小程序的过程中,我们经常需要获取某个元素的宽高来进行一些动态操作、布局等。下面就来详细讲解如何实现动态获取元素宽高的方法。 方法1:使用wx.createSelectorQuery() wx.createSelectorQuery() 是微信小程序提供的API,它可以获取到页面中某个节点的信息。其使用方法如…

    css 2023年6月10日
    00
  • Bootstrap 布局组件(全)

    让我来详细讲解一下 Bootstrap 布局组件的完整攻略。 什么是 Bootstrap 布局组件? Bootstrap 布局组件是 Bootstrap 框架的一个重要组成部分,它提供了一组适用于各种设备和屏幕大小的基础布局组件和工具,可以帮助我们快速构建响应式网站。 布局容器(Container) Bootstrap 布局容器是一个最基本的布局组件,它负责…

    css 2023年6月10日
    00
  • 分析uniapp入门之nvue爬坑记

    “分析uniapp入门之nvue爬坑记”是一篇介绍如何使用uniapp的nvue模板的文章。文章中详细阐述了nvue模板的基本语法,以及在实际使用过程中可能遇到的一些问题以及解决方法。 以下是该攻略的完整内容: 一、nvue模板介绍 nvue是uniapp框架自带的渲染模板,在使用时需要在.vue文件的template标签中指定type=”nvue”。 nv…

    css 2023年6月9日
    00
  • CSS制作可输入内容的table表格

    下面是CSS制作可输入内容的table表格的完整攻略。 一、准备工作 在开始制作可输入内容的table表格之前,需要先准备好以下工作: HTML文档中已经存在一个table元素; 在table元素中已经为每个单元格创建好了input元素。 二、基本样式设置 首先,我们需要对table表格进行基本的样式设置,包括调整边框、字体大小、行高等等。这里我将以一个示例…

    css 2023年6月10日
    00
  • DIV+CSS 网页TIP的简单作法

    DIV+CSS 网页 TIP 的简单作法的攻略步骤如下: 步骤一:HTML结构 首先我们需要搭建一个基本的 HTML 结构。我们需要一个包含 TIP 内容的触发器和一个隐藏的 TIP 内容框。 HTML 结构示例如下: <div class="tip-trigger"> Trigger <div class="…

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