JS使用tween.js动画库实现轮播图并且有切换功能

yizhihongxing

下面是使用tween.js实现轮播图并且有切换功能的攻略,包含两个示例说明。

1. 引入tween.js库

在HTML文档的标签中添加tween.js库的链接:

<head>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/18.6.4/tween.min.js"></script>
</head>

2. 编写CSS样式和HTML结构

首先,需要给轮播图设置一个固定的宽度和高度,同时需要把轮播图内部的所有元素都设置为绝对定位,以实现轮播图的移动效果。

接下来,编写HTML结构,可以使用ul和li标签,例如:

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

写完HTML后,还需为轮播图编写CSS样式,例如:

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

3. 编写JavaScript代码

在JavaScript中,首先需要获取轮播图的元素和图片的宽度:

var slider = document.getElementById('slider');
var sliderWidth = slider.offsetWidth;

接下来,需要为轮播图的每个li元素创建一个Tween对象,并将其保存在一个数组中。Tween对象可以实现从一个值到另一个值的平滑过渡,例如从一个位置移动到另一个位置。

var tweens = [];
var lis = slider.getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
  tweens.push(new TWEEN.Tween(lis[i].style));
}

接下来,需要编写切换图片的函数。在每次切换时,都需要让轮播图的ul元素向左移动图片宽度的距离,并更新Tween对象的起点和终点。

function switchImage(nextIndex) {
  var currentTween = tweens[currentIndex];
  var nextTween = tweens[nextIndex];

  // 让ul元素向左移动图片宽度的距离
  var targetLeft = -nextIndex * sliderWidth;
  currentTween.to({left: targetLeft}, 1000);
  nextTween.to({left: targetLeft + sliderWidth}, 1000);

  // 开始动画
  currentTween.start();
  nextTween.start();

  // 更新当前图片的索引
  currentIndex = nextIndex;
}

最后,在JavaScript代码的主函数中,可以使用setInterval函数不断调用switchImage函数来切换图片。例如:

var currentIndex = 0;
setInterval(function() {
  var nextIndex = (currentIndex + 1) % lis.length;
  switchImage(nextIndex);
}, 3000);

示例一:左右滑动切换轮播图

下面是一个根据tween.js实现的左右滑动切换轮播图的示例,代码如下:

HTML代码:

<div class="slider-container">
  <ul class="slider-content">
    <li><img src="image1.jpg"></li>
    <li><img src="image2.jpg"></li>
    <li><img src="image3.jpg"></li>
  </ul>
  <div class="slider-control">
    <a class="slider-prev" href="#">Prev</a>
    <a class="slider-next" href="#">Next</a>
  </div>
</div>

CSS代码:

.slider-container {
  position: relative;
  width: 600px;
  height: 400px;
  overflow: hidden;
}
.slider-content {
  position: relative;
  width: 1800px;
  height: 400px;
  margin: 0;
  padding: 0;
  list-style: none;
  white-space: nowrap;
}
.slider-content li {
  position: absolute;
  display: inline-block;
  left: 0;
  top: 0;
  width: 600px;
  height: 400px;
}
.slider-control {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1;
  text-align: center;
}
.slider-control a {
  display: inline-block;
  margin: 0 20px;
  padding: 10px 20px;
  background-color: #333;
  color: #fff;
  text-decoration: none;
  border-radius: 20px;
}

JavaScript代码:

var sliderContainer = document.querySelector('.slider-container');
var sliderContent = sliderContainer.querySelector('.slider-content');
var sliderWidth = sliderContainer.offsetWidth;

var tweens = [];
var lis = sliderContent.getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
  tweens.push(new TWEEN.Tween(lis[i].style));
}

var currentIndex = 0;
function switchImage(nextIndex) {
  var currentTween = tweens[currentIndex];
  var nextTween = tweens[nextIndex];

  var targetLeft = -nextIndex * sliderWidth;
  currentTween.to({left: targetLeft}, 1000);
  nextTween.to({left: targetLeft + sliderWidth}, 1000);

  currentTween.start();
  nextTween.start();

  currentIndex = nextIndex;
}

var prevButton = sliderContainer.querySelector('.slider-prev');
var nextButton = sliderContainer.querySelector('.slider-next');
prevButton.addEventListener('click', function(event) {
  event.preventDefault();
  var nextIndex = (currentIndex - 1 + lis.length) % lis.length;
  switchImage(nextIndex);
});
nextButton.addEventListener('click', function(event) {
  event.preventDefault();
  var nextIndex = (currentIndex + 1) % lis.length;
  switchImage(nextIndex);
});

setInterval(function() {
  var nextIndex = (currentIndex + 1) % lis.length;
  switchImage(nextIndex);
}, 3000);

示例二:淡入淡出切换轮播图

下面是一个根据tween.js实现的淡入淡出切换轮播图的示例,代码如下:

HTML代码:

<div class="slider-container">
  <ul class="slider-content">
    <li><img src="image1.jpg"></li>
    <li><img src="image2.jpg"></li>
    <li><img src="image3.jpg"></li>
  </ul>
  <div class="slider-control">
    <a class="slider-prev" href="#">Prev</a>
    <a class="slider-next" href="#">Next</a>
  </div>
</div>

CSS代码:

.slider-container {
  position: relative;
  width: 600px;
  height: 400px;
  overflow: hidden;
}
.slider-content {
  position: relative;
  width: 600px;
  height: 400px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.slider-content li {
  position: absolute;
  left: 0;
  top: 0;
  opacity: 0;
  transition: opacity 1s ease;
}
.slider-content li.active {
  opacity: 1;
}
.slider-control {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1;
  text-align: center;
}
.slider-control a {
  display: inline-block;
  margin: 0 20px;
  padding: 10px 20px;
  background-color: #333;
  color: #fff;
  text-decoration: none;
  border-radius: 20px;
}

JavaScript代码:

var sliderContainer = document.querySelector('.slider-container');
var sliderContent = sliderContainer.querySelector('.slider-content');
var sliderWidth = sliderContainer.offsetWidth;

var tweens = [];
var lis = sliderContent.getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
  tweens.push(new TWEEN.Tween(lis[i].style));
}

var currentIndex = 0;
function switchImage(nextIndex) {
  var currentTween = tweens[currentIndex];
  var nextTween = tweens[nextIndex];

  currentTween.to({opacity: 0}, 1000);
  nextTween.to({opacity: 1}, 1000);

  currentTween.onComplete(function() {
    lis[currentIndex].classList.remove('active');
    lis[nextIndex].classList.add('active');
  });

  currentTween.start();
  nextTween.start();

  currentIndex = nextIndex;
}

var prevButton = sliderContainer.querySelector('.slider-prev');
var nextButton = sliderContainer.querySelector('.slider-next');
prevButton.addEventListener('click', function(event) {
  event.preventDefault();
  var nextIndex = (currentIndex - 1 + lis.length) % lis.length;
  switchImage(nextIndex);
});
nextButton.addEventListener('click', function(event) {
  event.preventDefault();
  var nextIndex = (currentIndex + 1) % lis.length;
  switchImage(nextIndex);
});

lis[currentIndex].classList.add('active');
setInterval(function() {
  var nextIndex = (currentIndex + 1) % lis.length;
  switchImage(nextIndex);
}, 3000);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS使用tween.js动画库实现轮播图并且有切换功能 - Python技术站

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

相关文章

  • 分享我通过 API 赚钱的思路

    写在最前 我们经常看到非常多的 API 推荐,但又经常收藏到收藏夹里吃灰,仿佛收藏了就是用了。 很多时候没有用起来,可能是因为想不到某类 API 可以用来做什么或者能应用在哪里。 下面我将我思考的一些方向给到大家,希望我们都能共同致富。 天气类 API 天气预报查询:获取城市的天气实况数据;更新频率分钟级别。 空气质量查询:获取指定城市的整点观测空气质量等。…

    JavaScript 2023年4月18日
    00
  • iOS瀑布流的简单实现(Swift)

    这里是“iOS瀑布流的简单实现(Swift)”的完整攻略。 一、前言 瀑布流是一种非常常见的UI布局方式,在iOS开发中也有很多应用。本文将介绍如何在Swift中实现一个简单的瀑布流布局。 二、实现思路 我们可以采用UICollectionView实现这个瀑布流布局,具体思路如下: 继承UICollectionViewFlowLayout,重写prepare…

    JavaScript 2023年6月11日
    00
  • JS防抖和节流实例解析

    JS防抖和节流实例解析 什么是防抖和节流? 在介绍防抖和节流实例前,我们先了解一下这两个概念。防抖和节流都是为了解决高频触发某个函数而导致资源占用过多的问题。 防抖:指触发事件后在n秒内函数只执行一次,如果n秒内再次触发事件,则会重新计算函数的执行时间。 节流:指连续触发事件但是在n秒内只执行一次函数,所以节流会稀释函数的执行频率。 防抖的例子 搜索框实时搜…

    JavaScript 2023年6月11日
    00
  • 通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法

    获取上传的图片信息并通过ajax传递给后端,可以分为以下几个步骤: 添加文件选择控件 在HTML页面中,添加一个文件选择控件,让用户可以选择要上传的图片文件。示例代码如下: <input type="file" id="file-input"> 监听文件选择事件 使用JavaScript监听文件选择控件的c…

    JavaScript 2023年6月11日
    00
  • JavaScript常用工具函数汇总(浏览器环境)

    JavaScript常用工具函数汇总(浏览器环境) 摘要 在JavaScript开发中,为了节省开发时间、提高效率、降低代码复杂度,我们经常使用JavaScript工具函数。本文对JavaScript常用工具函数进行了汇总,主要包括数组、字符串、日期、数字、DOM、事件、Ajax等方面的常用工具函数。 目录 数组工具函数 字符串工具函数 日期工具函数 数字工…

    JavaScript 2023年5月18日
    00
  • js之事件冒泡和事件捕获详细介绍

    下面我将给出关于”js之事件冒泡和事件捕获详细介绍”的完整攻略。 什么是事件冒泡和事件捕获 在JavaScript中,事件处理程序可以直接绑定在DOM元素上。当事件被触发时,事件会从目标元素开始向外传播,这就是事件的冒泡和捕获。 事件冒泡是指事件从子元素传递到父元素,直到传递到最外层的元素(也就是window对象)。例如,当单击一个button元素时,单击事…

    JavaScript 2023年5月28日
    00
  • 在js文件中引入(调用)另一个js文件的三种方法

    在 JavaScript 中引入(调用)其他 JavaScript 文件的方式主要有以下三种: 1. 使用<script>标签引入(调用)其他 JavaScript 文件 使用<script>标签可以在 HTML 文件中引入(调用)其他 JavaScript 文件,该文件可以被浏览器直接加载。 <script>标签通常放在…

    JavaScript 2023年5月27日
    00
  • 浅谈javascript的call()、apply()、bind()的用法

    我会尽可能详细地讲解“浅谈javascript的call()、apply()、bind()的用法”的完整攻略。 什么是call()、apply()、bind() 在javascript中,call()、apply()、bind()都是用于修改函数执行时的上下文(即函数运行时的this指向)。 call()和apply()都可以在函数调用时改变函数体内的thi…

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