前端:HTML+CSS+JavaScript实现轮播图2

前端:HTML+CSS+JavaScript实现轮播图2

        • 1. 和之前版本的区别
        • 2. 实现原理
        • 3. 针对上述的改进
        • 3. 参考代码

1. 和之前版本的区别

之前发布的那篇关于轮播图的文章在这:前端:HTML+CSS+JavaScript实现轮播图,只能说存在问题吧!比如2、3实现效果是用了两个定时器实现的,虽然也达到了那种效果,但是从一些方面来说总有点繁琐吧!比如,在一定时间内图片移动像素的计算等。现在这个不需要计算,直接用一个定时器即可实现,我想说现在这个版本和各位在浏览器上看到那种效果实现原理应该差不多。

请添加图片描述
虽然没有给出相应的点击事件哈!

2. 实现原理

利用相对定位relative绝对定位absolute定时器transition
结合relative、absolute来进行图片布局,用定时器来实现图片轮播间隔效果,用transition来实现每张图片移动过渡效果。
在这里插入图片描述
初始实现效果如上,这不符合我们想要的那种效果,这种是通过定时器每隔几秒变化每张图片的left的值的效果。这并不怎么美观,因为图片过渡效果并不符合我们的要求,但是如果显示的有多张图片,那么倒还不错,如下:
在这里插入图片描述

3. 针对上述的改进

在这里插入图片描述
就是把所有图片从左到右进行排列,外层用一个标签元素包裹,每隔一段时间变换外层的标签元素的left属性值。

3. 参考代码

这个是需要改进的代码哈!
main.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="./main.css">
</head>
<body>
	<div class="main">
	</div>
</body>
<script type="text/javascript" src="main.js"></script>
</html>

main.css

*{
	padding: 0;
	margin: 0;
}

ul{
	list-style: none;
}

.main{
	width: 500px;
	height: 300px;
	margin: 0 auto;
	position: relative;
}

.dot{
	height: 10px;
	position: absolute;
	bottom: 20px;
	left: 50%;
	transform: translateX(-50%);
}

.dot span{
	height: 100%;
	float: left;
	width: 10px;
	border-radius: 50%;
	margin-left: 10px;
	cursor: pointer;
}

.dot span:first-child{
	margin-left: 0;
}

.red{
	background-color: red;
}

.white{
	background-color: white;
}

.main ul{
	position: relative;
	height: 100%;
	width: 100%;
	overflow-x: hidden;
}

.main ul li{
	position: absolute;
	top: 0;
	transition: all 0.3s;
	width: 100%;
	height: 100%;
}

.main ul li img{
	width: 100%;
}

main.js



// 输入图片链接数组
const img_arr = [
	'https://i0.hdslb.com/bfs/banner/627984a9617a35c7e4366e0c74baf29ef3aa96ae.png@976w_550h_1c_!web-home-carousel-cover.avif',
	'https://i0.hdslb.com/bfs/banner/3464f3b055107b2b54b9443e02c43448c0915866.png@976w_550h_1c_!web-home-carousel-cover.avif',
	'https://i0.hdslb.com/bfs/banner/ff7d11c786ddd45c218696c3c6b19c69a71883d7.jpg@976w_550h_1c_!web-home-carousel-cover.avif',
	'https://i0.hdslb.com/bfs/sycp/creative_img/202311/74214ce12c94ba104322e2be463ec6f7.jpg@976w_550h_1c_!web-home-carousel-cover.avif'
];

const mainEle = document.querySelector('.main');
var _htmlStr = '';
img_arr.forEach(function(ele){
	_htmlStr += `<li>
		<img src="${ele}">
	</li>`
})

var _htmlStr2 = '';
for(let i=0;i<img_arr.length;i++){
	_htmlStr2 += '<span></span>'
}

var _htmlStr2 = `<div class="dot">${_htmlStr2}</div>`;
_htmlStr = `<ul>${_htmlStr}</ul>${_htmlStr2}`;

mainEle.innerHTML = _htmlStr;

const img_width = 500;

const elements = document.querySelectorAll('.main ul li');
const elements2 = document.querySelectorAll('.dot span');
elements.forEach(function(ele,index){
	ele.style.left = index * img_width + 'px';
})

elements2.forEach(function(ele,index){
	if(index == 0){
		ele.className = 'red';
	}else{
		ele.className =  'white';
	}
})

function left(){
	elements.forEach(function(ele,index){
		let left_v = parseFloat(ele.style.left);
		if(left_v - img_width < 0){
			ele.style.left = (elements.length - 1) * img_width + 'px';
		}else{
			ele.style.left = left_v - img_width + 'px';
		}

		if(left_v - img_width == 0){
			elements2[index].className = 'red';
		}else{
			elements2[index].className = 'white';
		}
	})
}

var timer = setInterval(left,2000);

这个是改进版本
main.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="./main.css">
</head>
<body>
	<div class="main">
		<div class="pre_ul" id="main">
			<ul>
				<li><img src="https://i1.hdslb.com/bfs/archive/da52b26129a84aa316383d53e596d3f89c708294.jpg@672w_378h_1c_!web-home-common-cover.avif" alt=""></li>
				<li><img src="https://i0.hdslb.com/bfs/archive/6df10d7e0834f8511ea620dbfe6bfc7b1eabdab2.jpg@672w_378h_1c_!web-home-common-cover.avif" alt=""></li>
				<li><img src="https://i0.hdslb.com/bfs/archive/47338bc6056b6bbc906155590c6e201ae5dffee8.jpg@672w_378h_1c_!web-home-common-cover.avif" alt=""></li>
			</ul>
		</div>
		<div class="dot" id="main">
			<span class="red"></span>
			<span class="white"></span>
			<span class="white"></span>
		</div>
	</div>
</body>
<script type="text/javascript" src="main.js"></script>
</html>

main.css

*{
	margin: 0;
	padding: 0;
}

ul{
	list-style: none;
}

.main{
	width: 500px;
	height: 300px;
	position: relative;
	margin: 0 auto;

	overflow-x: hidden;
}

.main .dot{
	position: absolute;
	bottom: 8%;
	left: 50%;
	transform: translateX(-50%);
	height: 12px;
	z-index: 2;
}

.dot span{
	float: left;
	height: 100%;
	width: 12px;
	border-radius: 50%;
	cursor: pointer;
	margin-left: 8px;
}

.dot span:first-child{
	margin-left: 0;
}


.white{
	background-color: white;
}

.red{
	background-color: red;
}

.main .pre_ul{
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	transition: all 0.5s;
	z-index: 1;
}

.main .pre_ul ul{
	width: 100%;
	height: 100%;
	position: relative;
	overflow-x: hidden;
}

.main .pre_ul ul li{
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
}


.main .pre_ul ul li img{
	width: 100%;
}

main.js



const img_width = 500;
// 图片最大宽度
const eles = document.querySelectorAll('.pre_ul ul li');
const pre_ul_ele = document.querySelector('.pre_ul');
const dots = document.querySelectorAll('.dot span');
const n = eles.length;
pre_ul_ele.style.left = 0;
pre_ul_ele.style.width = n * img_width + 'px';
eles.forEach(function(ele,index){
	ele.style.width = img_width + 'px';
	ele.style.left = index * img_width + 'px';
})


function clear_red(){
	dots.forEach(function(ele,index){
		ele.className = 'white';
	})
}

var start_index = 0;

function left(){
	pre_ul_ele.style.transition = 'all 0.5s';
	let left_v = parseInt(pre_ul_ele.style.left);
	pre_ul_ele.style.left = left_v - 500 + 'px';
	
	clear_red();
	start_index = (start_index+1)%n;
	dots[start_index].className = 'red';

	if(left_v - 500 == -n*img_width){
		pre_ul_ele.style.left = 0;
	}
}


var timer1 = setInterval(left,2000);

注:上述代码没有给出点击按钮变化图片特效,想实现的读者可以去看看上述第一个关于实现轮播图的版本哈!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis KEY*模糊查询导致速度慢、阻塞其他 Redis 操作

Redis KEY*模糊查询导致交互速度慢、阻塞其他 Redis 操作 查询速度慢的原因 在Redis中&#xff0c;使用通配符 KEYS 命令进行键的模糊匹配&#xff08;比如 KEYS key*&#xff09;可能会导致性能问题&#xff0c;尤其是在数据集较大时。这是因为 KEYS 命令的实现需要遍历所有…

输入/输出控制详解(块、字符设备?程序控制?中断、DMA又是啥?)

输入/输出&#xff08;I/O&#xff09; 输入/输出&#xff08;I/O&#xff09;控制是计算机系统中的一个关键概念&#xff0c;涉及到计算机与外部设备之间的数据传输。计算机系统通过输入设备接收用户输入&#xff0c;通过输出设备向用户显示结果。输入/输出控制包括管理和协调…

1.查看表的基本结构,表的详细结构和修改表名

查看表的基本结构,表的详细结构和修改表名 1.查看数据表基本结构 有强迫症或健忘症的小伙伴们在建好数据库和表以后&#xff0c;通常会怀疑自己刚才是不是敲错了&#xff0c;怎么办&#xff1f;如果不是使用图形界面是不是就没法查看啦&#xff1f; 不存在的&#xff0c;这就…

PDF控件Spire.PDF for .NET【转换】演示:将 SVG 转换为 PDF

SVG 是一种矢量图形文件格式&#xff0c;用于创建可缩放且不损失质量的图像。然而&#xff0c;PDF由于支持高质量打印、加密、数字签名等功能&#xff0c;更适合共享和打印。将SVG转换为PDF可以保证图像在不同设备和环境下都有良好的显示效果&#xff0c;并更好地保护知识产权。…

【数据结构 — 排序 — 插入排序】

数据结构 — 排序 — 插入排序 一.排序1.1.排序的概念及其运用1.1.1排序的概念1.1.2排序运用1.1.3 常见的排序算法 二.插入排序2.1.直接插入排序2.1.1.算法讲解2.1.2.代码实现2.1.2.1.函数定义2.1.2.2.算法接口实现2.1.2.3.测试代码实现2.1.2.4.测试展示 2.2.希尔排序2.2.1.算法…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上&#xff0c;让我们的web页面看起来像一个本地应用程序一样&#xff0c;通过桌面APP图标一打开&#xff0c;直接全屏展示&#xff0c;就像在APP中效果一样&#xff0c;完全体会不到你是在浏览器中。 1.网站添加样式 在…

Leetcode2477. 到达首都的最少油耗

Every day a Leetcode 题目来源&#xff1a;2477. 到达首都的最少油耗 解法1&#xff1a;贪心 深度优先搜索 题目等价于给出了一棵以节点 0 为根结点的树&#xff0c;并且初始树上的每一个节点上都有一个人&#xff0c;现在所有人都需要通过「车子」向结点 0 移动。 对于…

基于ResNet模型的908种超大规模中草药图像识别系统

中草药药材图像识别相关的实践在前文中已有对应的实践了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《python基于轻量级GhostNet模型开发构建23种常见中草药图像识别系统》 《基于轻量级MnasNet模型开发构建40种常见中草药图像识别系统》 在上一篇文章中&…

操作系统 2-6 课后作业2.3:系统调用

第1关版本1内核执行的完整系统调用序列 任务描述 分析版本1内核&#xff0c;回答下列问题&#xff1a; 从系统开机直到输出第 4 个字符‘1’&#xff0c;系统依次执行了哪些系统调用&#xff1f;分别是在几号进程中执行的&#xff1f;&#xff08;对于一组连续出现的 0 号进程…

进程控制与原语

一、 进程的五种状态 在操作系统中&#xff0c;一个进程可以经历五种基本状态&#xff0c;这被称为进程的五种基本状态模型。这包括&#xff1a; 创建状态&#xff08;Create/New&#xff09;&#xff1a; 进程刚刚被创建&#xff0c;但还未被执行。在这个状态下&#xff0c;操…

JAVA 锁

乐观锁 乐观锁是一种乐观思想&#xff0c;即认为读多写少&#xff0c;遇到并发写的可能性低&#xff0c;每次去拿数据的时候都认为别人不会修改&#xff0c;所以不会上锁&#xff0c;但是在更新的时候会判断一下在此期间别人有没有去更新这个数据&#xff0c;采取在写时先读出…

CGAL的多边形曲面重建

1、介绍 该软件包实现了一种基于假设和选择的方法&#xff0c;用于从点云重建分段平面对象。该方法将从分段平面对象采样的无序点集作为输入。输出是对输入点集进行插值的紧凑且不透水的曲面网格。该方法假设提供了所有必要的主平面&#xff08;或者可以使用在形状检测中描述的…

如何使用玻璃材质制作3D钻石模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

MySQL 8 update语句更新数据表里边的数据

数据重新补充 这里使用alter table Bookbought.bookuser add userage INT after userphone;为用户表bookuser在userphone列后边添加一个类型为INT的新列userage。 使用alter table Bookbought.bookuser add sex varchar(6) after userage ;为用户表bookuser在userage 列后边添…

Hibernate 框架 (2023年架构师下半年案例分析题)

Hibernate 是一种对象和关系之间映射的框架&#xff0c;是 Java 应用和关系数据库之间的桥梁。它可以将数据库资源映射为一个或者多个 POJO。将面向数据库资源的各种业务操作以 POLO 的属性和方法的形式实现&#xff0c;使人们摆脱烦琐的 JDBC 代码&#xff0c;将精力更多地集中…

C/C++,优化算法——双离子推销员问题(Bitonic Travelling Salesman Problem)的计算方法与源代码

1 文本格式 // C program for the above approach #include <bits/stdc.h> using namespace std; // Size of the array a[] const int mxN 1005; // Structure to store the x and // y coordinates of a point struct Coordinates { double x, y; } a[mxN]; //…

【Linux下基本指令 —— 2】

Linux下基本指令 —— 2 十.more 指令语法&#xff1a;功能&#xff1a;常用选项&#xff1a;举例&#xff1a;Xshell7展示十一.less 指令语法&#xff1a;功能&#xff1a;选项&#xff1a;Xshell7展示 十二.head 指令语法&#xff1a;功能&#xff1a;选项&#xff1a;Xshell…

智能优化算法应用:基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…

Unity 自定义窗口

放在Editor文件夹下&#xff1b; #if UNITY_EDITORusing System; using UnityEditor; using UnityEngine;namespace EditorCustumTool {/// <summary>/// 自定义窗口/// </summary>public class CustomWindow : EditorWindow{public enum FlagType{Flag1 101,Fl…