点击触发按钮后,弹出一个遮罩层,里面是具体内容。遮罩层采用 fixed
定位,铺满整个窗口。给 body
添加 overflow: hidden
以防止滚动时页面滚动。
<!DOCTYPE html>
<html lang="zh-CN" style="height: 100%">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, shrink-to-fit=no">
<style>
.overlay {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 2000;
height: 100%;
background-color: rgba(0, 0, 0, .5);
overflow: auto;
display: none;
}
.dialog {
position: relative;
margin: 15vh auto 50px;
background: #fff;
border-radius: 2px;
box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
box-sizing: border-box;
width: 50%;
}
.dialog-header {
padding: 20px 20px 10px;
}
.dialog-body {
padding: 0 20px 30px;
color: #606266;
font-size: 14px;
word-break: break-all;
}
</style>
</head>
<body>
<div>
<div>
<h1>1. 标题(H1)</h1>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<h2>二级标题</h2>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<h3>三级标题</h3>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<h4>四级标题</h4>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<h5>五级标题</h5>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<h6>六级标题</h6>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<div>
<button type="button" style="padding: 4px 8px; border-radius: 4px">打开模态框</button>
<div class="overlay">
<div class="dialog">
<div class="dialog-header">提示</div>
<div class="dialog-body">
<p>这里是详细内容。</p>
</div>
</div>
</div>
</div>
<h1>2. 段落</h1>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
<p>这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。这里是很长很长的内容。</p>
</div>
</div>
<script>
var body = document.querySelector("body")
var button = document.querySelector("button")
var overlay = document.querySelector(".overlay")
button.addEventListener("click", function () {
overlay.style.display = "block"
body.style.overflow = "hidden"
})
overlay.addEventListener("click", function (e) {
if (e.target.classList.contains("overlay")) {
overlay.style.display = "none"
body.style.overflow = "auto"
}
})
</script>
</body>
</html>
在 iOS Safari 上,body
元素对于 overflow: hidden
的支持不佳。当模态框内容(很高)滚到顶部或者底部时,如果继续滚动,body
内容将会滚动,和我们预期的 body
不会滚动不相符。