Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:
添加左右翻页、当鼠标移出每隔2秒自动播放、鼠标移入停止播放
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>轮播图</title>
<link rel="stylesheet" href="banner/style.css">
</head>
<body>
<div class="container">
<!-- 图片组 -->
<nav class="imgs">
<a href=""><img src="banner/banner1.jpg" alt="" data-index="1" class="active"></a>
<a href=""><img src="banner/banner2.jpg" alt="" data-index="2"></a>
<a href=""><img src="banner/banner3.jpg" alt="" data-index="3"></a>
<a href=""><img src="banner/banner4.jpg" alt="" data-index="4"></a>
</nav>
<!-- 小按钮,这里的小按钮应该根据图片数量自动生成 -->
<nav class="btns">
</nav>
<!-- 左右翻页 -->
<nav class="skip">
<a href="#" class="prev"><</a>
<a href="#" class="next">></a>
</nav>
<script>
// 获取所有图片
const imgs = document.querySelectorAll(".container > .imgs img");
// 获取图片下方按钮
const btnGrap = document.querySelector(".container > .btns");
// 获取左右翻页按钮
const skip = document.querySelector(".container > .skip");
// 创建一组与图片数量对应的小按钮
function autoCreateBtns(ele, imgLength) {
const frag = document.createDocumentFragment();
for (let i = 0; i < imgLength; i++) {
const a = document.createElement("a");
a.href = "#";
a.dataset.index = i + 1;
if (i === 0) a.classList.add("active");
frag.appendChild(a);
}
ele.appendChild(frag);
}
// 调用创建小按钮的函数
autoCreateBtns(btnGrap, imgs.length);
// 为生成的小按钮添加点击事件
const btns = document.querySelectorAll(".container > .btns > *");
// 声明二个公共函数
// 1. 获取激活的元素
function getActiveEle(eles) {
let activities = [...eles].filter(img => img.classList.contains("active"));
return activities.shift();
}
// 2.设置激活的元素,根据按钮索引更新正在显示的照片
function setActiveEle(btnIndex) {
[imgs, btns].forEach(arr => {
// 将之前的状态全部重置到初始化
getActiveEle(arr).classList.remove("active");
arr.forEach(item => {
if (item.dataset.index === btnIndex) {
item.classList.add("active");
}
});
});
}
// 为小按钮添加事件
btns.forEach(btn => btn.addEventListener("click", ev => setActiveEle(ev.target.dataset.index)));
// 1.为轮播图添加左右翻页按钮功能
skip.addEventListener("click", skipImg, false);
skip.children[0].addEventListener("click", skipImg, false);
function skipImg(ev) {
// 当前激活的图片
let currentImg = getActiveEle(imgs);
// 当前图片组父元素
let parentEle = currentImg.parentElement.parentElement;
// 当前元素的前一个 兄弟节点:previousElentSibling
let prevEle = currentImg.parentElement.previousElementSibling;
// 当前元素的下一个兄弟节点:nextElementSibling
let nextEle = currentImg.parentElement.nextElementSibling;
// 第一张图片:firstElementChild第一个子元素
let firstImg = parentEle.firstElementChild.firstElementChild;
// 最后一张图片:firstElementChildm最后一个子元素
let lastImg = parentEle.lastElementChild.firstElementChild;
let activeImg = currentImg;
// 向前翻页
if (ev.target.classList.contains("prev")) {
// 如果存在前一张图片,就是用它,否则就使用最后一张图片来更新它。形成循环显示的效果
let activeImg =
prevEle !== null ? prevEle.firstElementChild : lastImg;
// 使用激活元素来同步更新图片与按钮
setActiveEle(activeImg.dataset.index);
}
// 向后翻页
if (ev.target.classList.contains("next")) {
// 如果不存在下一张图片,就用第一张图片更新它
let activeImg =
nextEle !== null ? nextEle.firstElementChild : firstImg;
setActiveEle(activeImg.dataset.index);
}
}
// 2.让轮播图每隔2秒自动播放
let timer = null;
const slider = document.querySelector(".container");
slider.addEventListener("mouseout", startTimer, false);
slider.addEventListener("mouseover", clearTimer, false);
function startTimer() {
// 创建自定义事件对象
const clickEvent = new Event("click");
timer = setInterval(
() => skip.children[0].dispatchEvent(clickEvent),
2000
);
}
// 清除定时器
function clearTimer() {
clearInterval(timer);
}
</script>
</div>
</body>
</html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>选项卡</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
a {
text-decoration: none;
color: #555;
}
a:hover {
text-decoration: underline;
color: red;
}
li {
list-style: none;
line-height: 1.6em;
}
li:hover {
cursor: default;
}
.tabs {
width: 300px;
height: 300px;
margin: 30px;
background-color: #e6e6e6;
display: flex;
flex-direction: column;
border-radius: 10px;
}
.tab {
height: 36px;
display: flex;
}
.tab li {
flex: auto;
text-align: center;
line-height: 36px;
background-color: rgb(0, 248, 153);
border-radius: 10px;
}
.tab li.active {
background-color: lightcyan;
transition: .3s;
}
.tab li:hover {
cursor: pointer;
}
/* 默认所有选项卡只有一个显示,其它隐藏 */
.item {
padding: 20px;
display: none;
}
.item.active {
display: block;
}
</style>
</head>
<body>
<div class="tabs">
<!-- 导航 -->
<ul class="tab">
<li class="active" data-index="1">最新</li>
<li data-index="2">热门</li>
<li data-index="3">近期</li>
</ul>
<!-- 内容 -->
<ul data-index="1" class="item active">
<li><a href="">新加坡外交家:美国的利益已被富豪绑架</a></li>
<li><a href="">外交部:蓬佩奥为散播政治病毒煞费苦心</a></li>
<li><a href="">18岁离家远行,他们的目的地有点特别</a></li>
<li><a href="">了不起的你——三张照片背后的泪目故事</a></li>
</ul>
<ul data-index="2" class="item">
<li><a href="">憋气30秒可以测试肺部健康 这是真的吗?</a></li>
<li><a href="">李子柒做的泡菜,跟韩国有关系么?</a></li>
<li><a href="">疫情时间线或改写?多国在废水中发现新冠病毒痕迹</a></li>
<li><a href="">国药控股董事长李智明因“个人原因”辞职</a></li>
</ul>
<ul data-index="3" class="item">
<li><a href="">旗袍改中华风lo裙 可用作桃源恋歌打歌服</a></li>
<li><a href="">2020腾讯娱乐年度盛典 年度荣誉由你来推</a></li>
<li><a href="">36岁詹皇冲MVP迎三大利好</a></li>
<li><a href="">煤改气改成了电褥子?网友吐槽农村取暖痛点</a></li>
</ul>
<script>
// 事件代理
const tab = document.querySelector(".tab");
// 获取三个列表
const items = document.querySelectorAll(".item");
tab.onclick = ev => {
// 1.清空之前所有处于激活状态的选项,并将当前点击对象激活
[...tab.children].forEach(item => item.classList.remove("active"));
ev.target.classList.add("active");
// 2.根据自定义属性data-index找到对应的列表显示出来
items.forEach(item => item.classList.remove("active"));
[...items].filter(item => item.dataset.index === ev.target.dataset.index)[0].classList.add("active");
};
</script>
</div>
</body>
</html>