轮播图的五种写法(原生、vue2、vue3、react类组件,react函数组件)

轮播图效果是一种在网页或应用程序中展示多张图片或内容的方式,通常以水平或垂直的方式循环播放。本文使用原生、vue2、vue3、react类组件,react函数组件五种写法实现了简单的轮播图效果,需要更多轮播效果需要再增加样式或者动画。

  1. 淡入淡出效果:每张图片渐渐淡入显示,然后渐渐淡出消失,过渡效果平滑。(使用CSS的@keyframesanimation属性)

    创建一个@keyframes,定义两个关键帧,一个是初始状态,一个是结束状态,其中透明度从0到1,将该动画应用到需要淡入淡出的元素上,使用animation属性指定动画名称、持续时间、动画效果等。

  2. 平移效果:每张图片从一侧平滑地移动到另一侧,形成连续的平移效果。(使用CSS的transformtransition属性)

    使用transform: translate(x, y);来实现平移效果,其中xy是水平和垂直方向上的平移距离。可以使用负值来实现反方向的平移。添加过渡效果来使平移更加平滑。使用transition: transform duration;来设置过渡效果的持续时间

  3. 缩放效果:每张图片从小到大或从大到小进行缩放,给人一种逐渐放大或缩小的感觉。(使用CSS的transform属性和scale()

  4. 旋转效果:每张图片围绕中心点进行旋转,形成连续的旋转效果。(使用CSS的transform属性和rotate()

实现轮播图的基本步骤:

  1. 创建一个包含轮播图图片的HTML结构,可以使用<ul><li>标签来创建一个图片列表。

  2. 使用CSS样式设置轮播图容器的宽度和高度,以及图片列表的宽度和高度,并设置overflow: hidden来隐藏超出容器范围的图片。

  3. 使用JavaScript获取轮播图容器和图片列表,并设置初始的索引值为0。

  4. 创建一个函数来切换图片,可以通过改变图片列表的left属性值来实现。可以使用transform属性或marginLeft属性来实现图片的平滑过渡。

  5. 创建一个定时器来自动切换图片,可以使用setInterval函数来设置定时器,每隔一段时间调用切换图片的函数。

  6. 监听轮播图容器的鼠标移入和移出事件,当鼠标移入时清除定时器,当鼠标移出时重新设置定时器。

  7. 监听轮播图容器的左右箭头点击事件,分别调用切换图片的函数来切换到上一张或下一张图片。

  8. 可以根据需要添加其他功能,比如添加指示器来显示当前图片的索引,点击指示器可以切换到对应的图片。

1. 使用原生js实现轮播图

HTML:

<div class="carousel"><div class="slides"><img src="image1.jpg" alt="Image 1"><img src="image2.jpg" alt="Image 2"><img src="image3.jpg" alt="Image 3"></div><button class="prev">Previous</button><button class="next">Next</button>
</div>

CSS:

.carousel {position: relative;width: 500px;height: 300px;overflow: hidden;
}.slides {display: flex;transition: transform 0.5s ease-in-out;
}.slides img {width: 100%;height: 100%;object-fit: cover;
}.prev,
.next {position: absolute;top: 50%;transform: translateY(-50%);padding: 10px;background-color: lightgray;border: none;cursor: pointer;
}.prev {left: 10px;
}.next {right: 10px;
}

JavaScript:

const carousel = document.querySelector('.carousel');
const slides = carousel.querySelector('.slides');
const prevButton = carousel.querySelector('.prev');
const nextButton = carousel.querySelector('.next');
const slideWidth = carousel.offsetWidth;let slideIndex = 0;prevButton.addEventListener('click', () => {slideIndex--;if (slideIndex < 0) {slideIndex = slides.childElementCount - 1;}updateSlidePosition();
});nextButton.addEventListener('click', () => {slideIndex++;if (slideIndex >= slides.childElementCount) {slideIndex = 0;}updateSlidePosition();
});function updateSlidePosition() {slides.style.transform = `translateX(${-slideIndex * slideWidth}px)`;
}

2. 使用vue2实现轮播图

<template><div class="carousel"><div class="slide" :style="{ transform: `translateX(-${currentIndex * 100}%)` }"><div v-for="(item, index) in items" :key="index" class="item"><img :src="item.image" alt="carousel image"></div></div><div class="dots"><span v-for="(item, index) in items" :key="index" :class="{ active: index === currentIndex }" @click="goToSlide(index)"></span></div></div>
</template><script>
export default {data() {return {currentIndex: 0,items: [{ image: 'image1.jpg' },{ image: 'image2.jpg' },{ image: 'image3.jpg' },],};},methods: {goToSlide(index) {this.currentIndex = index;},},
};
</script><style scoped>
.carousel {width: 100%;overflow: hidden;
}.slide {display: flex;transition: transform 0.5s ease-in-out;
}.item {flex: 0 0 100%;
}.dots {display: flex;justify-content: center;margin-top: 10px;
}.dots span {width: 10px;height: 10px;border-radius: 50%;background-color: gray;margin: 0 5px;cursor: pointer;
}.dots span.active {background-color: black;
}
</style>

3. 使用vue3实现轮播图

在Vue3中实现轮播图可以使用<transition>组件和ref来实现。

  1. 在组件中引入所需的图片和样式:
<template><div class="carousel"><transition name="slide"><img :src="currentImage" :key="currentImage" class="image" /></transition><button @click="prevImage" class="prev">上一张</button><button @click="nextImage" class="next">下一张</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const images = ['image1.jpg','image2.jpg','image3.jpg','image4.jpg'];const currentIndex = ref(0);const prevImage = () => {currentIndex.value = (currentIndex.value - 1 + images.length) % images.length;};const nextImage = () => {currentIndex.value = (currentIndex.value + 1) % images.length;};const currentImage = computed(() => {return images[currentIndex.value];});return {currentImage,prevImage,nextImage};}
};
</script><style>
.carousel {position: relative;
}.image {width: 100%;height: auto;
}.slide-enter-active,
.slide-leave-active {transition: transform 0.5s;
}.slide-enter,
.slide-leave-to {transform: translateX(100%);
}.prev,
.next {position: absolute;top: 50%;transform: translateY(-50%);padding: 10px;background-color: #333;color: #fff;border: none;cursor: pointer;
}.prev {left: 10px;
}.next {right: 10px;
}
</style>

使用ref创建了一个currentIndex变量来追踪当前显示的图片索引。然后,在prevImagenextImage方法中更新currentIndex来切换图片。最后,使用<transition>组件来给图片添加过渡效果,并使用computed属性来获取当前显示的图片路径。

4. 使用react类组件实现轮播图

import React, { Component } from "react";class Carousel extends Component {constructor(props) {super(props);this.state = {images: ["image1.jpg","image2.jpg","image3.jpg","image4.jpg"],currentIndex: 0};}componentDidMount() {this.startCarousel();}componentWillUnmount() {this.stopCarousel();}startCarousel = () => {this.carouselInterval = setInterval(() => {this.setState(prevState => ({currentIndex: (prevState.currentIndex + 1) % prevState.images.length}));}, 2000);};stopCarousel = () => {clearInterval(this.carouselInterval);};render() {const { images, currentIndex } = this.state;return (<div className="carousel"><img src={images[currentIndex]} alt="carousel" /></div>);}
}export default Carousel;

使用constructor初始化了images数组和currentIndex状态。componentDidMount生命周期方法用于在组件挂载后启动轮播。startCarousel方法使用setInterval来每隔2秒更新currentIndex状态,实现轮播的效果。componentWillUnmount生命周期方法用于在组件卸载前停止轮播。最后,render方法根据currentIndex状态来渲染当前轮播图的图片。

5.使用react函数组件实现轮播图

import React, { useState } from 'react';const Carousel = ({ images }) => {const [currentIndex, setCurrentIndex] = useState(0);const goToPrevSlide = () => {setCurrentIndex((prevIndex) => (prevIndex === 0 ? images.length - 1 : prevIndex - 1));};const goToNextSlide = () => {setCurrentIndex((prevIndex) => (prevIndex === images.length - 1 ? 0 : prevIndex + 1));};return (<div className="carousel"><button onClick={goToPrevSlide}>Prev</button><img src={images[currentIndex]} alt="carousel-slide" /><button onClick={goToNextSlide}>Next</button></div>);
};export default Carousel;

使用useState钩子来管理当前轮播图的索引。通过goToPrevSlide和goToNextSlide函数,可以更新当前索引以显示前一个或下一个轮播图。

在父组件中,传递一个包含所有轮播图图片URL的数组作为images属性,通过将images数组传递给Carousel组件,可以在轮播图中显示这些图片。

import React from 'react';
import Carousel from './Carousel';const App = () => {const images = ['https://example.com/image1.jpg','https://example.com/image2.jpg','https://example.com/image3.jpg',];return (<div><h1>Carousel Example</h1><Carousel images={images} /></div>);
};export default App;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏服务器租用价格表_TOP3费用对比

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;游戏专业服务器公网带宽10M、12M、15M…

代码随想录算法训练营29期Day44|LeetCode 518,377

文档讲解&#xff1a;完全背包理论基础 零钱兑换II 组合总和IV 518.零钱兑换II 题目链接&#xff1a;https://leetcode.cn/problems/coin-change-ii/description/ 思路&#xff1a; 这是一道典型的背包问题&#xff0c;一看到钱币数量不限&#xff0c;就知道这是一个完全背…

大模型训练所需的硬件配置

1. 引入 训练一个大模型&#xff0c;到底需要投入多少块GPU&#xff0c;需要多少数据&#xff0c;训练多长时间能达到一个不错的效果&#xff1f; 本文引用靠谱的数据&#xff0c;来回答这些问题。 2. 全流程训练 大模型的训练&#xff0c;简单来说&#xff0c;分为Pretrain…

C#,普洛尼克数(Pronic Number)的算法与源代码

1 普洛尼克数(pronic number) 普洛尼克数(pronic number)&#xff0c;也叫矩形数、欧波朗数(oblong number)&#xff0c;是两个连续非负整数的积&#xff0c;即mn*(n1)。第n个普洛尼克数侪是n个三角形数个两倍。 2 计算结果 3 源程序 using System; namespace Legalsoft.Tru…

02 数据库管理 数据表管理

文章目录 数据库管理数据表管理基础数据类型表的基本操作 数据库管理 查看已有库 show databases; 创建库 create database 库名 [character set utf8]; e.g. 创建stu数据库&#xff0c;编码为utf8 create database stu character set utf8; create database stu charsetutf8;…

禁止文件外发,文件禁止外发的方法

在当今的企业环境中&#xff0c;数据安全至关重要。 什么是企业文件外发&#xff1f; 企业文件外发指的是将企业内部的电子文件发送给组织外部的人员使用。 这种行为可能带来数据安全风险&#xff0c;因为电子文件自身具有易拷贝、易扩散、易传播的特性。 如果带有核心资产或…

LLMs之Llama2 70B:《Self-Rewarding Language Models自我奖励语言模型》翻译与解读

LLMs之Llama2 70B&#xff1a;《Self-Rewarding Language Models自我奖励语言模型》翻译与解读 目录 《Self-Rewarding Language Models》翻译与解读 Abstract 5 Conclusion结论 6 Limitations限制 《Self-Rewarding Language Models》翻译与解读 地址 文章地址&#xff1…

疑似针对安全研究人员的窃密与勒索

前言 笔者在某国外开源样本沙箱平台闲逛的时候&#xff0c;发现了一个有趣的样本&#xff0c;该样本伪装成安全研究人员经常使用的某个渗透测试工具的破解版压缩包&#xff0c;对安全研究人员进行窃密与勒索双重攻击&#xff0c;这种双重攻击的方式也是勒索病毒黑客组织常用的…

Scrum敏捷开发管理全流程-敏捷管理工具

Leangoo领歌是款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新。…

娱乐直播APP开发:引领潮流,创新无界

随着互联网技术的飞速发展&#xff0c;娱乐直播APP已经成为现代人生活的重要组成部分。它以其独特的互动性、即时性和个性化&#xff0c;吸引了大量用户。本文将深入探讨娱乐直播APP开发的关键要素&#xff0c;以及如何在这个竞争激烈的市场中脱颖而出。 一、娱乐直播APP的核心…

第4章 表单与类视图

学习目标 熟悉Flask处理表单的方式&#xff0c;能够归纳在Flask程序中如何处理表单 掌握Flask-WTF扩展包的安装&#xff0c;能够借助pip工具安装Flask-WTF扩展包 掌握使用Flask-WTF创建表单的方式&#xff0c;能够独立使用Flask-WTF创建表单 掌握在模板中渲染表单的方式&…

基于vue+node.js的校园跳蚤市场系统多商家

校园跳蚤市场系统可以在短时间内完成大量的数据处理、帮助用户快速的查找校园跳蚤市场相关信息&#xff0c;实现的效益更加直观。校园跳蚤市场系统中采用nodejs技术和mysql数据库。主要包括管理员、发布者和用户三大部分&#xff0c;主要功能是实现对个人中心、用户管理、发布者…

CSS3弹性布局

传统的布局,基于盒状模型&#xff0c;依赖 display 属性 position属性 float属性。它对于那些特殊布局实现起来比较麻烦&#xff0c;就比如垂直居中&#xff0c;伸缩等。实现起来就不是很容易。 弹性布局是CSS3一种新的布局模式&#xff0c;是一种当页面需要适应不同的屏幕大…

uv机器电机方向极性

爱普生主板设置X、Y 电机方向极性&#xff1a;请根据实际情况设置&#xff0c;开机初始化时如果电机运动方向反了则修改此极性。 理光主板设置X、Y 电机方向极性

网课:[NOIP2017]奶酪——牛客(疑问)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 现有一块大奶酪&#xff0c;它的高度为 h&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系&a…

Leecode之反转链表

一.题目及剖析 https://leetcode.cn/problems/reverse-linked-list/description/ 二.思路引入 设定三个指针,n1指向空, n2指向head,n3指向下一个元素,将n2->next指向n1,然后三个指针向后遍历重复即可 三.代码引入 /*** Definition for singly-linked list.* struct List…

[论文总结] 深度学习在农业领域应用论文笔记12

文章目录 1. 3D-ZeF: A 3D Zebrafish Tracking Benchmark Dataset (CVPR, 2020)摘要背景相关研究所提出的数据集方法和结果个人总结 2. Automated flower classification over a large number of classes (Computer Vision, Graphics & Image Processing, 2008)摘要背景分割…

华为Eth-Trunk级联堆叠接入IPTV网络部署案例

Eth-Trunk级联堆叠接入IPTV网络部署案例 组网图形 图2 Eth-Trunk级联堆叠IPTV基本组网图 方案简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 方案简介 随着IPTV业务的迅速发展&#xff0c;IPTV平台承载的用户也越来越多&#xff0c;用户对IPTV直播业务的可靠性…

开源版发卡小程序源码,云盘发卡微信小程序源码带PC端

一款发卡小程序。带PC端 系统微信小程序前端采用nuiapp 后端采用think PHP6 PC前端采用vue开发 使用HBuilderX工具打开&#xff0c;运行到微信小程序工具&#xff0c;系统会自动打包微信小程序代码 修改文件common/request/request.js 改成你的后端网址 微信小程序端完全…

python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…