same::
主从列布局
效果示例
实现
原理
- 容器高度auto,由子元素撑开
- 右边列的内容实用绝对布局脱离文档流,使其不撑开容器
- 并设置四条边贴合右边列容器
代码
指向原始笔记的链接 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Two Column Popup Layout Demo</title> </head> <body style=" font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f0f0; " > <button id="open-popup-btn" style="padding: 10px 20px; font-size: 16px; cursor: pointer" > 打开弹窗 </button> <div id="popup-overlay" style=" position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; z-index: 1000; " > <div id="popup" style=" background-color: white; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); width: 80%; max-width: 800px; max-height: 90vh; display: flex; flex-direction: column; " > <div class="popup-header" style=" display: flex; justify-content: space-between; align-items: center; padding: 10px 20px; border-bottom: 1px solid #ccc; flex-shrink: 0; " > <h2 style="margin: 0">双列布局弹窗</h2> <button id="close-popup-btn" style=" background: none; border: none; font-size: 24px; cursor: pointer; " > × </button> </div> <div class="popup-content" style="flex-grow: 1; min-height: 0; display: flex" > <div class="left-column" style=" width: 50%; padding: 20px; border-right: 1px solid #ccc; box-sizing: border-box; " > <h4>左侧栏</h4> <p>这一列的内容决定了弹窗的整体高度。</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>内容</p> <p>最后一行内容,撑开高度。</p> </div> <div style="position: relative; width: 50%"> <div class="right-column" style=" padding: 20px; position: absolute; top: 0; right: 0; bottom: 0; left: 0; box-sizing: border-box; overflow-y: auto; " > <h4>右侧栏</h4> <p>这一列的内容如果超出左侧的高度,就会出现滚动条。</p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <p> Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p> <p> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> <p> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p> <p> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <p> Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p> <p> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> <p> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p> <p> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <p> Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p> <p> Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> <p> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p> <p>这一行是右侧的最后一行,用来确保内容足够长。</p> </div> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", () => { const openBtn = document.getElementById("open-popup-btn"); const closeBtn = document.getElementById("close-popup-btn"); const popupOverlay = document.getElementById("popup-overlay"); // 默认隐藏弹窗 popupOverlay.style.display = "none"; openBtn.addEventListener("click", () => { popupOverlay.style.display = "flex"; }); closeBtn.addEventListener("click", () => { popupOverlay.style.display = "none"; }); popupOverlay.addEventListener("click", (event) => { if (event.target === popupOverlay) { popupOverlay.style.display = "none"; } }); }); </script> </body> </html>
