用多了各种组件库的你还会用原生JS写轮播图吗?
suiw9 2024-11-04 15:26 44 浏览 0 评论
最近工作学习时间很忙,好久没有更新头条文章了,利用今天周日,使用原生的JavaScript写了一个渐隐渐现的轮播,算是对最近的前端学习的一个小总结吧。下面我来分享一下我写这个功能的步骤以及经验总结。
一、功能说明
1.1 功能介绍
- 实现一个渐隐渐现的轮播图;
- 可以自动切换,也可以鼠标点击翻页按钮或者小圆点进行切换;
- 同时鼠标移动到图片上停止自动切换,鼠标移出图片恢复自动切换。
1.2 效果图如下
二、HTML和CSS结构
- 图片容器:这里我放了4张美女图,为啥用这个,因为养眼。(手动滑稽)
- 分页容器:就是那几个小圆点,可以切换每一张图片。
- 翻页按钮:轮播图左右两边的按钮,也可以切换图片。
- HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>原生JS写一个渐隐渐现轮播图</title>
<link rel="stylesheet" href="slider.css">
</head>
<body>
<div class="container">
<!-- 1. 轮播图片组 -->
<div class="imgs">
<a href="" class="slider"><img src="./images/1.jpg" class="active" /></a>
<a href="" class="slider"><img src="./images/2.jpg" /></a>
<a href="" class="slider"><img src="./images/3.jpg" /></a>
<a href="" class="slider"><img src="./images/4.jpg" /></a>
</div>
<!-- 2. 小圆点按钮 -->
<div class="paginations"></div>
<!-- 3. 翻页按钮 -->
<div class="skip">
<a href="#" class="prev"><</a>
<a href="#" class="next">></a>
</div>
</div>
<script src="slider.js"></script>
</body>
</html>
- CSS代码
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: 10px;
}
a {
text-decoration: none;
}
/* 轮播图的容器 */
.container {
width: 75em;
height: 42rem;
margin: 1em auto;
position: relative;
overflow: hidden;
}
/* 轮播图片组 */
.container .imgs {
width: 75rem;
height: 42rem;
overflow: hidden;
}
.container .imgs a {
width: 100%;
height: 100%;
display: block;
position: absolute;
left: 0;
top: 0;
opacity: 0;
z-index: 0;
transition: all .6s;
}
.container .imgs a img {
width: 100%;
height: 100%;
}
/* 设置默认显示的图片(第一张) */
.container>.imgs a:nth-of-type(1) {
opacity: 1;
z-index: 1;
}
.container>.paginations {
position: absolute;
left: 0;
right: 0;
bottom: 1rem;
/* 水平居中 */
text-align: center;
z-index: 99;
}
.container>.paginations a {
/* 转成行内块元素: 即能水平排列,双支持宽度设置 */
display: inline-block;
padding: .8rem;
margin: 0 0.5em;
background-color: #fff;
border-radius: 50%;
transition: all .5s;
}
.container>.paginations a.active {
background-color: #000;
}
/* 翻页按钮 */
.container .skip a {
position: absolute;
z-index: 99;
width: 2.5rem;
height: 5rem;
line-height: 5rem;
text-align: center;
opacity: 0.5;
top: 50%;
margin-top: -2.5rem;
font-size: 2rem;
background-color: #ccc;
transition: all .6s;
}
.container .skip .prev {
left: 0;
}
.container .skip .next {
right: 0;
}
.container .skip *:hover {
opacity: 0.9;
color: #666;
}
目前页面的基础效果都已经完成了,效果是这样的:
三、JavaScript代码
首先,在做我们的轮播效果之前,我们需要先拿到相关的元素。
// 获取相关容器元素
// 轮播图容器
const container = document.querySelector('.container');
// 图片容器
const imgs = document.querySelector('.imgs');
// 每一张图片元素
const sliderLists = document.querySelectorAll('.slider');
// 小圆点容器元素
const paginations = document.querySelector('.paginations');
// 上翻页按钮
const prevBtn = document.querySelector('.prev');
// 下翻页按钮
const nextBtn = document.querySelector('.next');
至于分页小圆点按钮,我个人认为应该根据轮播图片的数量去动态生成它,因此我是这样写的:
// 创建分页小圆点,首先创建文档片段
let frag = document.createDocumentFragment();
for (let i = 0; i < sliderLists.length; i++) {
const a = document.createElement('a');
a.href = 'javascript:;';
a.class = 'btn';
frag.appendChild(a);
}
// 将生成的文档碎片挂载到paginations下
paginations.appendChild(frag);
// 为第一个分页圆点添加默认样式
paginations.firstElementChild.classList.add('active');
分页圆点元素渲染出来之后,先拿到它所有的元素以备后面做点击切换图片的事件使用。
let paginationBtns = document.querySelectorAll('.paginations a');
3.1 实现自动轮播的效果
由于我做的是渐隐渐现的效果,所以需要控制元素的z-index和opacity两个属性的值即可。
实现原理是:哪张图片显示,就把该元素的z-index和opacity值都设置成1,把需要隐藏的元素的z-index和opacity值都设置成0即可。这时,就需要两个值来记录当前图片的位置,和上一张图片的位置。至于自动切换效果,我是利用定时器实现的。
- 代码实现
// prev 上一张图片的位置,curr 当前图片的位置。默认显示第一张图片。
let prev = 0, curr = 0;
// 自动切换图片,由于此方法后面还需要再次使用,这里我就封装成了一个函数。
let autoSwitchImg = function () {
// 记录上一张图片的索引值,默认从0开始,即:第一张图片
prev = curr;
// 上一张图片的索引自增1,就是下一张要显示的图片,即当前图片。
curr++;
// 判断当前的索引值是不是大于图片的总数,大于的话就从0开始,即第一张图片开始轮播,
// 否则继续向下一张图片切换。
curr = curr >= sliderLists.length ? 0 : curr;
switchImg();
};
// 利用定时器设置自动轮播,这里我默认的是3s自动切换。
let interval = setInterval(autoSwitchImg, 3000);
这里有一点需要注意的是:自动切换函数autoSwitchImg()一定在写在定时器之前,否则会报错。
代码写到这里已经完成了自动切换的效果了。但是会发现有个问题,就是分页小圆点不会跟随着图片进行切换,那是因为我还没实现它的逻辑。现在开始实现这个分页按钮跟随对应的图片进行切换的逻辑。
分页小圆点的实现原理是:我们先利用上面拿到的小圆点元素,用forEach()去遍历每一个元素,如果当前图片的位置索引等于小圆点的位置索引(curr === index),那么就给这个圆点添加上一个active类实现切换效果。值得注意的是,我们拿到的小圆点的元素是一个NodeList类数组,需要先转换成数组再使用。具体请看下面的代码实现。
- 代码实现
// 让分页按钮跟图片索引对应
let switchPaginateBtn = function () {
Array.from(paginationBtns).forEach((item, index) => {
curr === index ? item.className = 'active' : item.className = '';
});
};
这样就可以实现图片和圆点切换一致地进行了。
以上是自动切换图片的功能,如果我们想实现鼠标移入轮播海报上停止自动切换,鼠标移除再恢复自动切换应该怎么办呢?可以利用鼠标移入(onmouseenter)、移出(onmouseleave)事件进行操作。
- 代码实现
// 鼠标移入轮播区域取消自动轮播
container.addEventListener('mouseenter', () => {
clearInterval(interval);
interval = null;
});
// 鼠标移出轮播区域开始自动轮播
container.addEventListener('mouseleave', () => {
interval = setInterval(autoSwitchImg, 3000);
});
截止到目前为止,上面的代码已经实现了图片的渐隐渐现效果,以及鼠标滑入滑出暂停和恢复切换的效果。下面需要做的就是实现手动点击切换事件。
3.2 点击翻页按钮实现切换效果
上一页翻页按钮与自动切换图片的逻辑刚好相反,拿到当前图片的索引,减去1就是上一张图片的索引,也就是要切换到当前图片的索引值。
// 上一页
prevBtn.addEventListener('click', () => {
// 保存当前图片的索引
prev = curr;
// 上一张图片就是当前图片的索引值-1
curr--;
curr = curr < 0 ? sliderLists.length - 1 : curr;
switchImg();
});
下一页翻页按钮与自动切换图片的逻辑完全一样,只需要调用一下自动切换的逻辑即可
// 下一页
nextBtn.addEventListener('click', () => {
autoSwitchImg();
});
通过给翻页按钮添加以上两个点击事件,已经完成了点击切换图片的功能了,下面再聊一聊如何通过点击分页小圆点切换图片的功能。
3.3 点击分页小圆点切换图片
实现原理:通过给每个小圆点添加一个点击事件,通过判断当前点击的小圆点的位置索引,切换到对应的图片即可。
- 代码实现
// 点击分页小圆点切换图片
Array.from(paginationBtns).forEach((item, index) => {
item.addEventListener('click', () => {
// 保存当前图片的位置索引
prev = curr;
// 将当前点击的小圆点的位置索引值赋值给的需要显示的图片变量
curr = index;
// 调用切换图片函数,实现切换效果
switchImg();
});
});
以上就是我写这个渐隐渐现轮播图的全部过程,如果有写得不好的地方,请各位大佬批评指正,如果有跟我一样的初学者想看完整代码的同学,可以关注私信我并回复“轮播”获取源码。
相关推荐
- 俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)
-
发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...
- 如何强制所有流量使用 HTTPS一网上用户
-
如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...
- https和http的区别(https和http有何区别)
-
“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...
- 快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别
-
什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...
- 简述HTTPS工作原理(简述https原理,以及与http的区别)
-
https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...
- 21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)
-
HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...
- 一次安全可靠的通信——HTTPS原理
-
为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...
- 为什么有的网站没有使用https(为什么有的网站点不开)
-
有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- 图解HTTPS「转」(图解http 完整版 彩色版 pdf)
-
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...
- HTTP 和 HTTPS 有何不同?一文带你全面了解
-
随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...
- HTTP与HTTPS的区别,详细介绍(http与https有什么区别)
-
HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...
- 一文让你轻松掌握 HTTPS(https详解)
-
一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...
- 如何在Spring Boot应用程序上启用HTTPS?
-
HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...
- 一文彻底搞明白Http以及Https(http0)
-
早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)