You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多图片按钮触发对应弹窗异常问题求助(HTML/CSS/JS)

多图片按钮触发对应弹窗异常问题求助(HTML/CSS/JS)

嘿,我帮你找出问题所在啦!你的代码里有两个关键错误导致第二个弹窗不显示,咱们一步步来解决:

问题原因分析

  • HTML结构嵌套错误:你在写第二个弹窗的时候,忘记闭合第一个弹窗的<div>标签了!id="popup"的modal容器直接把id="popup2"的modal包在了里面,而.modal默认是display: none的,子元素会继承父元素的隐藏状态,所以就算你给popup2设置了display: block,它也会因为父元素popup隐藏而看不到。
  • JS变量未定义:你注释掉了var popup = document.getElementById("popup");这行,但后面的事件监听里直接用了popup变量,这会抛出引用错误,可能干扰后续代码的执行逻辑。

修复后的完整代码

<!DOCTYPE html>
<html>
<head>
<title>HTML CSS JS</title>
<style>
/* CSS styles */
/* The modal (background) */
.modal {
display: none;
opacity: 0;
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgba(0, 0, 0, 0.8); /* Black w/ opacity */
transition: opacity .3s ease-in-out;
}

/* Modal Content/Box */
.modal-content {
background-color: #fefefe;
margin: 10% auto; /* 10% from the top and centered */
padding: 20px;
border: 1px solid #888;
width: 80%; /* Could be more or less, depending on screen size */
}
</style>
</head>
<body>
<div class="imageTextGrid" name="overview">
<a href="#" id="image-link"><img class="btnApeldoorn" src="https://www.webfx.com/wp-content/uploads/2021/10/generic-image-placeholder.png" /></a>
<a href="#2" id="image-link2"><img class="btnApeldoorn" src="https://www.webfx.com/wp-content/uploads/2021/10/generic-image-placeholder.png" /></a>
</div>

<!-- 修复:闭合每个弹窗的div,确保结构正确 -->
<div id="popup" class="modal">
<div class="modal-content">
apeldoorn Popup
</div>
</div> <!-- 补上第一个弹窗的闭合标签 -->

<div id="popup2" class="modal">
<div class="modal-content">
Popup 2
</div>
</div> <!-- 补上第二个弹窗的闭合标签 -->

<script>
// 修复:定义popup变量
const imageLink = document.getElementById("image-link");
const imageLink2 = document.getElementById("image-link2");
const popup = document.getElementById("popup");
const popup2 = document.getElementById("popup2");

// 第一个弹窗的事件监听
imageLink.addEventListener("click", function(event) {
event.preventDefault();
console.log ("1st button pressed");
popup.style.opacity = 1;
popup.style.display = "block";
});

popup.addEventListener("click", function(event) {
if (event.target === popup) {
popup.style.opacity = 0;
// 延迟设置display,让过渡动画完整执行
setTimeout(() => {
popup.style.display = "none";
}, 300);
}
});

// 第二个弹窗的事件监听
imageLink2.addEventListener("click", function(event) {
event.preventDefault();
console.log ("2nd button pressed");
popup2.style.opacity = 1;
popup2.style.display = "block";
});

popup2.addEventListener("click", function(event) {
if (event.target === popup2) {
popup2.style.opacity = 0;
setTimeout(() => {
popup2.style.display = "none";
}, 300);
}
});
</script>
</body>
</html>

额外优化建议

如果以后要加更多弹窗,重复写事件监听会很麻烦,你可以用数据属性来批量处理,比如给每个图片链接加data-modal-id属性指向对应的弹窗ID,然后只写一段通用的事件逻辑:

<!-- 修改HTML里的链接 -->
<a href="#" id="image-link" data-modal-id="popup"><img class="btnApeldoorn" src="https://www.webfx.com/wp-content/uploads/2021/10/generic-image-placeholder.png" /></a>
<a href="#2" id="image-link2" data-modal-id="popup2"><img class="btnApeldoorn" src="https://www.webfx.com/wp-content/uploads/2021/10/generic-image-placeholder.png" /></a>

<!-- JS替换成这段 -->
document.querySelectorAll('[data-modal-id]').forEach(link => {
  link.addEventListener('click', function(e) {
    e.preventDefault();
    const modalId = this.dataset.modalId;
    const modal = document.getElementById(modalId);
    console.log(`${modalId} 弹窗触发`);
    modal.style.opacity = 1;
    modal.style.display = 'block';
  });
});

document.querySelectorAll('.modal').forEach(modal => {
  modal.addEventListener('click', function(e) {
    if (e.target === this) {
      this.style.opacity = 0;
      setTimeout(() => {
        this.style.display = 'none';
      }, 300);
    }
  });
});

这样不管加多少个弹窗,都不用再写新的JS代码啦!

备注:内容来源于stack exchange,提问作者Maarten -Monica for president

火山引擎 最新活动