JavaScript - 轮播图
文章目录
- JavaScript - 轮播图
- 基础模版
- 一、刷新页面随机轮播图案例
- 二、轮播图 定时器版
- 三、轮播图完整版
基础模版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>轮播图点击切换</title>
<style>
* {
box-sizing: border-box;
}
.slider {
width: 560px;
height: 400px;
overflow: hidden;
}
.slider-wrapper {
width: 100%;
height: 320px;
}
.slider-wrapper img {
width: 100%;
height: 100%;
display: block;
}
.slider-footer {
height: 80px;
background-color: rgb(100, 67, 68);
padding: 12px 12px 0 12px;
position: relative;
}
.slider-footer .toggle {
position: absolute;
right: 0;
top: 12px;
display: flex;
}
.slider-footer .toggle button {
margin-right: 12px;
width: 28px;
height: 28px;
appearance: none;
border: none;
background: rgba(255, 255, 255, 0.1);
color: #fff;
border-radius: 4px;
cursor: pointer;
}
.slider-footer .toggle button:hover {
background: rgba(255, 255, 255, 0.2);
}
.slider-footer p {
margin: 0;
color: #fff;
font-size: 18px;
margin-bottom: 10px;
}
.slider-indicator {
margin: 0;
padding: 0;
list-style: none;
display: flex;
align-items: center;
}
.slider-indicator li {
width: 8px;
height: 8px;
margin: 4px;
border-radius: 50%;
background: #fff;
opacity: 0.4;
cursor: pointer;
}
.slider-indicator li.active {
width: 12px;
height: 12px;
opacity: 1;
}
</style>
</head>
<body>
<div class="slider">
<div class="slider-wrapper">
<img src="./images/slider01.jpg" alt="" />
</div>
<div class="slider-footer">
<p>对人类来说会不会太超前了?</p>
<ul class="slider-indicator">
<li class="active"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<div class="toggle">
<button class="prev"><</button>
<button class="next">></button>
</div>
</div>
</div>
<script>
// 1. 初始数据
const sliderData = [
{ url: './images/slider01.jpg', title: '对人类来说会不会太超前了?', color: 'rgb(100, 67, 68)' },
{ url: './images/slider02.jpg', title: '开启剑与雪的黑暗传说!', color: 'rgb(43, 35, 26)' },
{ url: './images/slider03.jpg', title: '真正的jo厨出现了!', color: 'rgb(36, 31, 33)' },
{ url: './images/slider04.jpg', title: '李玉刚:让世界通过B站看到东方大国文化', color: 'rgb(139, 98, 66)' },
{ url: './images/slider05.jpg', title: '快来分享你的寒假日常吧~', color: 'rgb(67, 90, 92)' },
{ url: './images/slider06.jpg', title: '哔哩哔哩小年YEAH', color: 'rgb(166, 131, 143)' },
{ url: './images/slider07.jpg', title: '一站式解决你的电脑配置问题!!!', color: 'rgb(53, 29, 25)' },
{ url: './images/slider08.jpg', title: '谁不想和小猫咪贴贴呢!', color: 'rgb(99, 72, 114)' },
]
</script>
</body>
</html>
一、刷新页面随机轮播图案例
需求:当我们刷新页面,页面中的轮播图会显示不同的照片以及样式
模块
- 刷新后图片会随机变换
- 当图片变化后,底部盒子背景颜色和文字内容会变换
- 当图片变化后,小圆点随机一个高亮显示
页面分析
首先使用一个盒子存放图片
其次再使用一个底部模版存放按钮及图片的标题
这里的ul-li,就是里面的底部模块的小点
逻辑分析
-
准备一个数组对象,里面包含详细信息
-
随机选择一个数字,选出数组对应的对象,更换图片,底部盒子背景颜色及文字内容
-
利用随机数字,让小圆点添加高亮的类(addClass),这里利用CSS结构伪类选择器
代码如下所示
目前还不是一个很完整的轮播图,不能点击小圆点、不能前后左右翻页,后面会慢慢的完善
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>轮播图点击切换</title>
<style>
* {
box-sizing: border-box;
}
.slider {
width: 560px;
height: 400px;
overflow: hidden;
}
.slider-wrapper {
width: 100%;
height: 320px;
}
.slider-wrapper img {
width: 100%;
height: 100%;
display: block;
}
.slider-footer {
height: 80px;
background-color: rgb(100, 67, 68);
padding: 12px 12px 0 12px;
position: relative;
}
.slider-footer .toggle {
position: absolute;
right: 0;
top: 12px;
display: flex;
}
.slider-footer .toggle button {
margin-right: 12px;
width: 28px;
height: 28px;
appearance: none;
border: none;
background: rgba(255, 255, 255, 0.1);
color: #fff;
border-radius: 4px;
cursor: pointer;
}
.slider-footer .toggle button:hover {
background: rgba(255, 255, 255, 0.2);
}
.slider-footer p {
margin: 0;
color: #fff;
font-size: 18px;
margin-bottom: 10px;
}
.slider-indicator {
margin: 0;
padding: 0;
list-style: none;
display: flex;
align-items: center;
}
.slider-indicator li {
width: 8px;
height: 8px;
margin: 4px;
border-radius: 50%;
background: #fff;
opacity: 0.4;
cursor: pointer;
}
.slider-indicator li.active {
width: 12px;
height: 12px;
opacity: 1;
}
</style>
</head>
<body>
<div class="slider">
<div class="slider-wrapper">
<img src="./images/slider01.jpg" alt=""/>
</div>
<div class="slider-footer">
<p>对人类来说会不会太超前了?</p>
<ul class="slider-indicator">
<!--active是高亮的样式-->
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<div class="toggle">
<button class="prev"><</button>
<button class="next">></button>
</div>
</div>
</div>
<script>
//1.初始数据
const sliderData = [
{ url: './images/slider01.jpg', title: '对人类来说会不会太超前了?', color: 'rgb(100, 67, 68)' },
{ url: './images/slider02.jpg', title: '开启剑与雪的黑暗传说!', color: 'rgb(43, 35, 26)' },
{ url: './images/slider03.jpg', title: '真正的jo厨出现了!', color: 'rgb(36, 31, 33)' },
{ url: './images/slider04.jpg', title: '李玉刚:让世界通过B站看到东方大国文化', color: 'rgb(139, 98, 66)' },
{ url: './images/slider05.jpg', title: '快来分享你的寒假日常吧~', color: 'rgb(67, 90, 92)' },
{ url: './images/slider06.jpg', title: '哔哩哔哩小年YEAH', color: 'rgb(166, 131, 143)' },
{ url: './images/slider07.jpg', title: '一站式解决你的电脑配置问题!!!', color: 'rgb(53, 29, 25)' },
{ url: './images/slider08.jpg', title: '谁不想和小猫咪贴贴呢!', color: 'rgb(99, 72, 114)' }
]
//2.创建随机数
// function getRandom(N, M) {
// return Math.floor(Math.random() * (M - N + 1)) + N
// }
//const random = getRandom(1,8)
const random = parseInt(Math.random() * sliderData.length) //或者是这么生成随机数也行
//3.把对应的数据渲染到标签里面
// 3.1获取图片
const img = document.querySelector('.slider-wrapper img')//表示slider-wrapper类中的第一个img标签
// 3.2修改图片的路径
img.src = sliderData[random].url
// 3.3获取标签p
const p = document.querySelector('.slider-footer p')//表示slider-footer类中的第一个p标签
p.innerHTML = sliderData[random].title
// 3.4修改slider-footer中背景板的颜色
const sliderFooterDocument = document.querySelector('.slider-footer')
sliderFooterDocument.style.backgroundColor = sliderData[random].color
//4.底部ul-li进行切换,对应的li进行高亮
//这个地方没有用all,因为用all筛选的是一个伪数组
const li = document.querySelector(`.slider-indicator li:nth-child(${random + 1})`)//选中第random+1个li(因为random是0-7 而li是1-8)
//当前选中的li添加active这个类
li.classList.add('active')
</script>
</body>
</html>
二、轮播图 定时器版
承接上面的代码
需求:每隔一秒钟切换一个图片
分析
-
准备一个数组对象,里面包含详情信息(素材包含)
-
获取元素
-
设置定时器函数
设置变量++
找到变量对应的对象
更改图片、文字信息
激活小圆点,移除上一个高亮的类名,当前变量对应的小圆点添加类
-
处理图片自动复原从头播放(放到变量++后面,紧挨)
如果图片播放到最后一张,就是大于等于数组的长度
则把变量重置为0
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>轮播图点击切换</title>
<style>
* {
box-sizing: border-box;
}
.slider {
width: 560px;
height: 400px;
overflow: hidden;
}
.slider-wrapper {
width: 100%;
height: 320px;
}
.slider-wrapper img {
width: 100%;
height: 100%;
display: block;
}
.slider-footer {
height: 80px;
background-color: rgb(100, 67, 68);
padding: 12px 12px 0 12px;
position: relative;
}
.slider-footer .toggle {
position: absolute;
right: 0;
top: 12px;
display: flex;
}
.slider-footer .toggle button {
margin-right: 12px;
width: 28px;
height: 28px;
appearance: none;
border: none;
background: rgba(255, 255, 255, 0.1);
color: #fff;
border-radius: 4px;
cursor: pointer;
}
.slider-footer .toggle button:hover {
background: rgba(255, 255, 255, 0.2);
}
.slider-footer p {
margin: 0;
color: #fff;
font-size: 18px;
margin-bottom: 10px;
}
.slider-indicator {
margin: 0;
padding: 0;
list-style: none;
display: flex;
align-items: center;
}
.slider-indicator li {
width: 8px;
height: 8px;
margin: 4px;
border-radius: 50%;
background: #fff;
opacity: 0.4;
cursor: pointer;
}
.slider-indicator li.active {
width: 12px;
height: 12px;
opacity: 1;
}
</style>
</head>
<body>
<div class="slider">
<div class="slider-wrapper">
<img src="./images/slider01.jpg" alt=""/>
</div>
<div class="slider-footer">
<p>对人类来说会不会太超前了?</p>
<ul class="slider-indicator">
<li class="active"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<div class="toggle">
<button class="prev"><</button>
<button class="next">></button>
</div>
</div>
</div>
<script>
// 1. 初始数据
const sliderData = [
{ url: './images/slider01.jpg', title: '对人类来说会不会太超前了?', color: 'rgb(100, 67, 68)' },
{ url: './images/slider02.jpg', title: '开启剑与雪的黑暗传说!', color: 'rgb(43, 35, 26)' },
{ url: './images/slider03.jpg', title: '真正的jo厨出现了!', color: 'rgb(36, 31, 33)' },
{ url: './images/slider04.jpg', title: '李玉刚:让世界通过B站看到东方大国文化', color: 'rgb(139, 98, 66)' },
{ url: './images/slider05.jpg', title: '快来分享你的寒假日常吧~', color: 'rgb(67, 90, 92)' },
{ url: './images/slider06.jpg', title: '哔哩哔哩小年YEAH', color: 'rgb(166, 131, 143)' },
{ url: './images/slider07.jpg', title: '一站式解决你的电脑配置问题!!!', color: 'rgb(53, 29, 25)' },
{ url: './images/slider08.jpg', title: '谁不想和小猫咪贴贴呢!', color: 'rgb(99, 72, 114)' }
]
//2.获取元素
const img = document.querySelector('.slider-wrapper img') //图片元素
const p = document.querySelector('.slider-footer p') //p标签
let i = 0
//3.开启定时器
//轮播图的第一张可以不用参与变化,1s后直接播放第二章即可
setInterval(function() {
i++
if (i >= sliderData.length) {
// 超过数组长度的话,初始化
i = 0
}
// const obj = sliderData[i]
//更换图片路径
img.src = sliderData[i].url
//字
p.innerHTML = sliderData[i].title
//小圆点 小圆点从1开始数的
//删除之前的active
document.querySelector('.slider-indicator .active').classList.remove('active')
document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')//小圆点高亮显示
}, 1000)
</script>
</body>
</html>
三、轮播图完整版
需求:当点击左右按钮的时候,可以切换轮播图
分析
- 右侧按钮点击,变量++,如果大于等于8,则复原0
- 左侧按钮点击,变量–,如果小于0,则复原最后一张
- 鼠标经过暂停定时器
- 鼠标离开开启定时器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>轮播图点击切换</title>
<style>
* {
box-sizing: border-box;
}
.slider {
width: 560px;
height: 400px;
overflow: hidden;
}
.slider-wrapper {
width: 100%;
height: 320px;
}
.slider-wrapper img {
width: 100%;
height: 100%;
display: block;
}
.slider-footer {
height: 80px;
background-color: rgb(100, 67, 68);
padding: 12px 12px 0 12px;
position: relative;
}
.slider-footer .toggle {
position: absolute;
right: 0;
top: 12px;
display: flex;
}
.slider-footer .toggle button {
margin-right: 12px;
width: 28px;
height: 28px;
appearance: none;
border: none;
background: rgba(255, 255, 255, 0.1);
color: #fff;
border-radius: 4px;
cursor: pointer;
}
.slider-footer .toggle button:hover {
background: rgba(255, 255, 255, 0.2);
}
.slider-footer p {
margin: 0;
color: #fff;
font-size: 18px;
margin-bottom: 10px;
}
.slider-indicator {
margin: 0;
padding: 0;
list-style: none;
display: flex;
align-items: center;
}
.slider-indicator li {
width: 8px;
height: 8px;
margin: 4px;
border-radius: 50%;
background: #fff;
opacity: 0.4;
cursor: pointer;
}
.slider-indicator li.active {
width: 12px;
height: 12px;
opacity: 1;
}
</style>
</head>
<body>
<div class="slider">
<div class="slider-wrapper">
<img src="./images/slider01.jpg" alt=""/>
</div>
<div class="slider-footer">
<p>对人类来说会不会太超前了?</p>
<ul class="slider-indicator">
<li class="active"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<div class="toggle">
<button class="prev"><</button>
<button class="next">></button>
</div>
</div>
</div>
<script>
// 1. 初始数据
const data = [
{ url: './images/slider01.jpg', title: '对人类来说会不会太超前了?', color: 'rgb(100, 67, 68)' },
{ url: './images/slider02.jpg', title: '开启剑与雪的黑暗传说!', color: 'rgb(43, 35, 26)' },
{ url: './images/slider03.jpg', title: '真正的jo厨出现了!', color: 'rgb(36, 31, 33)' },
{ url: './images/slider04.jpg', title: '李玉刚:让世界通过B站看到东方大国文化', color: 'rgb(139, 98, 66)' },
{ url: './images/slider05.jpg', title: '快来分享你的寒假日常吧~', color: 'rgb(67, 90, 92)' },
{ url: './images/slider06.jpg', title: '哔哩哔哩小年YEAH', color: 'rgb(166, 131, 143)' },
{ url: './images/slider07.jpg', title: '一站式解决你的电脑配置问题!!!', color: 'rgb(53, 29, 25)' },
{ url: './images/slider08.jpg', title: '谁不想和小猫咪贴贴呢!', color: 'rgb(99, 72, 114)' }
]
//准备工作,获取元素
const img = document.querySelector('.slider-wrapper img')
const p = document.querySelector('.slider-footer p')
const footer = document.querySelector('.slider-footer')
//1.右按钮业务
//1.1 获取右侧按钮
const next = document.querySelector('.next')
let i = 0 //信号量 控制播放图片张数
//1.2 注册点击事件
next.addEventListener('click', function() {
//播放下一张图片
i++
if (i >= data.length) {
//初始化为第一张
i = 0
}
toggle()
//1.3 得到对应的图片对象
//1.4 渲染对应的对象
// img.src = data[i].url
// p.innerHTML = data[i].title
// footer.style.backgroundColor = data[i].color
// //1.5更换小圆点 先移除原来的类名,当前的li再添加active类名
// document.querySelector('.slider-indicator .active').classList.remove('active')
// document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')
})
//2.左侧按钮业务
//2.1 获取左侧按钮
const prev = document.querySelector('.prev')
//2.2 注册点击事件
prev.addEventListener('click', function() {
//播放下一张图片
i--
if (i < 0) {
//初始化为第一张
i = data.length - 1
}
toggle()
//1.3 得到对应的图片对象
//1.4 渲染对应的对象
// img.src = data[i].url
// p.innerHTML = data[i].title
// footer.style.backgroundColor = data[i].color
// //1.5更换小圆点 先移除原来的类名,当前的li再添加active类名
// document.querySelector('.slider-indicator .active').classList.remove('active')
// document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')
})
//3.声明一个渲染的函数作为复用
function toggle() {
//1.3 得到对应的图片对象
//1.4 渲染对应的对象
img.src = data[i].url
p.innerHTML = data[i].title
footer.style.backgroundColor = data[i].color
//1.5更换小圆点 先移除原来的类名,当前的li再添加active类名
document.querySelector('.slider-indicator .active').classList.remove('active')
document.querySelector(`.slider-indicator li:nth-child(${i + 1})`).classList.add('active')
}
//4.自动播放模块
let timerId = setInterval(function() {
//利用JS,自动调用点击事件
next.click()
}, 1000)
//5.鼠标经过大盒子暂停定时器,鼠标移动过大盒子后,开启定时器
const slider = document.querySelector('.slider')
//注册事件
slider.addEventListener('mouseenter', function() {
clearInterval(timerId)
})
slider.addEventListener('mouseleave', function() {
//这个定时器相当于先开再关的
timerId = setInterval(function() {
//利用JS,自动调用点击事件
next.click()
}, 1000)
})
</script>
</body>
</html>