You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现点击按钮时弹出带遮罩可关闭的自定义居中弹窗

实现点击按钮弹出居中弹窗并添加遮罩层功能

需求回顾

点击页面中任意按钮,弹窗居中显示,同时屏幕变暗;点击屏幕任意区域(包括遮罩)关闭弹窗。现有弹窗CSS设置为display:none。


步骤1:补充HTML结构

先添加一个全屏遮罩层,用来实现屏幕变暗的效果:

<div id="main">
    <div id="inner-15" class="inner"></div>
</div>

<!-- 遮罩层 -->
<div class="overlay"></div>
<!-- 弹窗 -->
<div class="smallFrame"></div>

步骤2:调整CSS样式

修改现有CSS,添加遮罩层样式,同时让弹窗精准居中:

body {
    display: flex;
    justify-content: center;
    margin: 1.2em;
    /* 弹窗显示时禁止页面滚动 */
    overflow: hidden;
}

button {
    background: rgba(0, 0, 0, 0);
    color: #a5afaa;
    border: 1px solid white;
    border-radius: .6em;
    padding: 3em;
}

button:hover {
    border-color: #fff8cc;
    box-shadow: 0em 0em 1em 0em yellow;
}

#main {
    border: solid 2px #939388;
    border-radius: 10px;
    background-color: #0f0f3de8;
    box-shadow: 0 0.1em 0.3em 0.1em rgba(0, 0, 0, 0.6);
}

.inner {
    display: flex;
    align-items: center;
    flex-direction: column;
    justify-content: center;
    padding: 20px;
}

/* 遮罩层样式 */
.overlay {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.7);
    z-index: 999;
}

/* 弹窗样式调整,实现居中 */
.smallFrame {
    display: none;
    position: fixed;
    top: 50%;
    left: 50%;
    /* 通过平移实现精准居中 */
    transform: translate(-50%, -50%);
    border: solid 2px #939388;
    border-radius: 10px;
    background-color: #0f0f3de8;
    box-shadow: 0 0.1em 0.3em 0.1em rgba(0, 0, 0, 0.6);
    width: 400px;
    height: 250px;
    /* 层级比遮罩高,确保弹窗在最上层 */
    z-index: 1000;
}

步骤3:编写JavaScript交互逻辑

给所有按钮添加点击事件,控制弹窗和遮罩的显示/隐藏;同时添加关闭逻辑:

var containerDiv = document.querySelector("#main");
let tempCounterBtn = 0;
for (let i = 0; i < 2; i++) {
  let newDiv = document.createElement("div");
  newDiv.id = "div-" + (i + 1);
  containerDiv.appendChild(newDiv);
  for (let x = 0; x < 6; x++) {
    let btn = document.createElement("button");
    btn.id = "button-" + (tempCounterBtn + 1);
    tempCounterBtn++;
    newDiv.appendChild(btn);
  }
}

// 获取元素
const buttons = document.querySelectorAll('button');
const modal = document.querySelector('.smallFrame');
const overlay = document.querySelector('.overlay');

// 按钮点击事件:显示弹窗和遮罩
buttons.forEach(btn => {
  btn.addEventListener('click', () => {
    modal.style.display = 'block';
    overlay.style.display = 'block';
  });
});

// 点击遮罩关闭弹窗
function closeModal() {
  modal.style.display = 'none';
  overlay.style.display = 'none';
}

overlay.addEventListener('click', closeModal);

// 可选:避免点击弹窗内部误关闭,阻止事件冒泡
modal.addEventListener('click', (e) => {
  e.stopPropagation();
});

内容的提问来源于stack exchange,提问作者Dylan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:57:14