javascript - 如何修复javascript代码以识别所有点击的照片
问题描述
我正在使用 Traversy Media 创建的幻灯片,但尝试对其进行更改,以便缩略图位于主图片的顶部和底部。顶部的缩略图工作正常,但单击时无法识别底部的缩略图行。是否可以将这些缩略图分开,或者它们都必须在同一个 div 中?
这仅识别前 4 个图像,而不是后 4 个图像。
这是一个小提琴
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>thumbgallery</title>
<style type=text/css>
.container {
max-width: 760px;
margin: auto;
border: #fff solid 3px;
background: #fff;
}
.main-img img,
.imgs img{
width: 100%;
}
.imgs{
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 5px;
}
.imgs img {
cursor: pointer;
}
/* Fade in animation */
@keyframes fadeIn {
to {
opacity: 1;
}
}
.fade-in {
opacity: 0;
animation: fadeIn var(--fade-time) ease-in 1 forwards;
}
/* Media Queries */
@media(max-width: 600px) {
.imgs {
grid-template-columns: repeat(2, 1fr);
}
}
<style>
</head>
<body>
<div class="container">
<div class="imgs">
<img src="https://preview.ibb.co/gxVppG/img1.jpg">
<img src="https://preview.ibb.co/iZ3Lww/img2.jpg">
<img src="https://preview.ibb.co/iQsPOb/img3.jpg">
<img src="https://preview.ibb.co/gFFdib/img4.jpg">
</div>
<div class="main-img">
<img src="https://preview.ibb.co/gxVppG/img1.jpg" id="current">
</div>
<div class="imgs">
<img src="https://preview.ibb.co/hS5ppG/img5.jpg">
<img src="https://preview.ibb.co/goKtGw/img6.jpg">
<img src="https://preview.ibb.co/bSWjOb/img7.jpg">
<img src="https://preview.ibb.co/i2o9pG/img8.jpg">
</div>
</div>
<script>
const current = document.querySelector('#current');
const imgs = document.querySelector('.imgs');
const img = document.querySelectorAll('.imgs img');
const opacity = 0.6;
// Set first img opacity
img[0].style.opacity = opacity;
imgs.addEventListener('click', imgClick);
function imgClick(e) {
// Reset the opacity
img.forEach(img => (img.style.opacity = 1));
// Change current image to src of clicked image
current.src = e.target.src;
// Add fade in class
current.classList.add('fade-in');
// Remove fade-in class after .5 seconds
setTimeout(() => current.classList.remove('fade-in'), 500);
// Change the opacity to opacity var
e.target.style.opacity = opacity;
}
</script>
</body>
</html>
解决方案
问题是document.querySelector('.imgs');
只返回该类的第一个匹配项,以修复.querySelectorAll()
可以使用的问题,但返回将是一个 NodeList 应该迭代以将事件添加到所有元素。
但这会留下我看到的不良行为,当在图像之间单击将触发事件并“破坏”图库时。
所以为了避免这种情况,我只将 eventListener 添加到<img>
s.
Snipet 与下面的解决方案。
const current = document.querySelector('#current');
const img = document.querySelectorAll('.imgs img');
const opacity = 0.6;
// Set first img opacity
img[0].style.opacity = opacity;
// Iterating over result to add the eventListeners
img.forEach(i => i.addEventListener('click', imgClick));
function imgClick(e) {
// Reset the opacity
img.forEach(img => (img.style.opacity = 1));
// Change current image to src of clicked image
current.src = e.target.src;
// Add fade in class
current.classList.add('fade-in');
// Remove fade-in class after .5 seconds
setTimeout(() => current.classList.remove('fade-in'), 500);
// Change the opacity to opacity var
e.target.style.opacity = opacity;
}
.container {
max-width: 760px;
margin: auto;
border: #fff solid 3px;
background: #fff;
}
.main-img img,
.imgs img{
width: 100%;
}
.imgs{
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 5px;
}
.imgs img {
cursor: pointer;
}
/* Fade in animation */
@keyframes fadeIn {
to {
opacity: 1;
}
}
.fade-in {
opacity: 0;
animation: fadeIn var(--fade-time) ease-in 1 forwards;
}
/* Media Queries */
@media(max-width: 600px) {
.imgs {
grid-template-columns: repeat(2, 1fr);
}
}
<div class="container">
<div class="imgs">
<img src="https://preview.ibb.co/gxVppG/img1.jpg">
<img src="https://preview.ibb.co/iZ3Lww/img2.jpg">
<img src="https://preview.ibb.co/iQsPOb/img3.jpg">
<img src="https://preview.ibb.co/gFFdib/img4.jpg">
</div>
<div class="main-img">
<img src="https://preview.ibb.co/gxVppG/img1.jpg" id="current">
</div>
<div class="imgs">
<img src="https://preview.ibb.co/hS5ppG/img5.jpg">
<img src="https://preview.ibb.co/goKtGw/img6.jpg">
<img src="https://preview.ibb.co/bSWjOb/img7.jpg">
<img src="https://preview.ibb.co/i2o9pG/img8.jpg">
</div>
</div>
推荐阅读
- sql-server - 如何选择同一行中的父级和所有子级
- scala - 如何更新火花数据框中的列值
- sql - 使用 Azure Eventhub + Logic 应用的 SQL Server 并行插入
- insert - 插入包含集合导航属性的实体
- git - 创建 git 合并报告以显示发布中待处理的合并的过程
- spring-boot - Spring Batch 除外时的性能和内存不足错误
- python - 如何在采样传感器时使用多处理来绘制数据?
- maven - 使用基本身份验证的存储库身份验证仅在嵌入 URL 时有效
- python - Python - 如何在遍历列表时处理异常?
- flutter - 将 Datawedge 与颤振一起使用