打造优雅用户体验:一步步实现纯CSS自适应居中弹窗与滚动条控制

298 阅读3分钟

在Web开发中,创建一个能够自适应屏幕并确保在高度超出时展示滚动条的居中弹窗是提升用户交互体验的关键环节。下面,我们将会通过详尽的步骤和代码示例,介绍如何使用纯CSS构建这样一个功能完善的弹窗组件。

首先,让我们从HTML结构入手。创建一个基本的页面框架,其中包含一个触发弹窗显示的按钮以及定义好的模态框结构:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <!-- 必要的元信息 -->  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>纯CSS弹窗自适应居中及滚动条控制</title>  
  
    <!-- 引入自定义CSS样式 -->  
    <style>  
        <!-- CSS样式具体内容见下文 -->  
    </style>  
</head>  
<body>  
    <!-- 触发弹窗显示的元素 -->  
    <div style="padding-top: 100px; text-align: center; cursor: pointer;">  
        <span class="js-modal__open">点击打开弹窗</span>  
    </div>  
  
    <!-- 定义模态框结构 -->  
    <div class="modal js-modal" style="display: none;">  
        <!-- 背景层 -->  
        <div class="modal__backdrop">  
            <!-- 容器层 -->  
            <div class="modal__container">  
                <!-- 关闭按钮 -->  
                <a href="javascript:;" class="modal__close js-modal__close">X</a>  
                <!-- 内容区域 -->  
                <div class="modal__body">  
                    <div class="modal__demo">  
                        <!-- 弹窗内容... -->  
                    </div>  
                </div>  
            </div>  
        </div>  
    </div>  
  
    <!-- 引入JavaScript逻辑 -->  
    <script>  
        // JavaScript逻辑部分见下文  
    </script>  
</body>  
</html>

接下来是关键的CSS样式部分,为了使弹窗能完美地居中并对内容进行自适应:

/* 隐藏元素不溢出 */  
.hidden {  
    overflow: hidden;  
}  
  
/* 基础模态框样式,固定定位、全屏遮罩 */  
.modal {  
    position: fixed;  
    top0;  
    right0;  
    bottom0;  
    left0;  
    z-index1000;  
    background-colorrgba(0000.7); /* 半透明黑色背景 */  
    overflow-y: auto; /* 允许垂直方向滚动 */  
    display: none; /* 默认隐藏 */  
}  

/* 定义模态框中滚动条的整体宽度和背景颜色,以及圆角样式 */
.modal::-webkit-scrollbar,
.modal::-webkit-scrollbar-track-piece {
    width: 6px; /* 滚动条宽度 */
    background-color: #4a4a4a; /* 滚动条背景颜色 */
    border-radius: 30px; /* 滚动条圆角 */
}

/* 定义模态框中滚动条滑块的背景颜色和圆角样式 */
.modal::-webkit-scrollbar-thumb {
    background-color: #c9d1d7; /* 滚动条滑块背景颜色 */
    border-radius: 30px; /* 滚动条滑块圆角 */
}
  
/* 背景层用于居中对齐模态框内容 */  
.modal__backdrop {  
    min-height100%;  
    padding100px 0/* 上下填充以保持舒适间距 */  
    display: flex;  
    justify-content: center;  
    align-items: center;  
    box-sizing: border-box;  
}  
  
/* 容器层,相对定位,方便内嵌内容绝对定位 */  
.modal__container {  
    margin0 auto;  
    position: relative;  
}  
  
/* 关闭按钮样式 */  
.modal__close {  
    position: absolute;  
    cursor: pointer;  
    top: -40px;  
    right: -40px;  
    width32px;  
    height32px;  
    line-height32px;  
    font-size16px;  
    font-weight: bold;  
    color#fff;  
    text-align: center;  
}  
  
/* 弹窗内容区域 */  
.modal__body {  
    width100%;  
}  
  
/* 演示区域样例,可根据需要自定义宽度和高度 */  
.modal__demo {  
    width800px;  
    height400px;  
    background-color#fff;  
    display: flex;  
    justify-content: center;  
    align-items: center;  
}

最后,借助JavaScript来处理弹窗的打开与关闭逻辑:

// 函数声明部分  
function getElementsBySelector(selector) {  
    return document.querySelectorAll(selector);  
}  
  
function modalOpen(selector) {  
    const modal = getElementsBySelector(selector)[0];  
    if (modal) {  
        modal.style.display = 'block'// 显示模态框  
        document.body.classList.add('hidden'); // 隐藏背景内容  
    }  
}  
  
function modalClose(selector) {  
    const modal = getElementsBySelector(selector)[0];  
    if (modal) {  
        modal.style.display = 'none'// 隐藏模态框  
        if (!hasModalOpen()) {  
            document.body.classList.remove('hidden'); // 当没有其他模态框打开时,恢复背景内容显示  
        }  
    }  
}  
  
function hasModalOpen() {  
    return document.querySelector('.js-modal:not([style*="display: none"])') !== null;  
}  
  
// 事件绑定  
function events() {  
    // 点击触发按钮时打开模态框  
    document.body.addEventListener('click'function(event) {  
        if (event.target.classList.contains('js-modal__open')) {  
            modalOpen('.js-modal');  
        }  
        // 点击关闭按钮时关闭模态框  
        if (event.target.classList.contains('js-modal__close')) {  
            modalClose('.js-modal');  
        }  
    });  
}  
  
// 页面加载后初始化事件监听  
events();

总结起来,上述代码片段不仅实现了弹窗在页面上的自适应居中显示,还确保了当弹窗内容高度超过浏览器视口时会出现滚动条,使得用户可以滚动查看更多内容。整个设计完全依赖于CSS和JavaScript,无需任何额外的第三方库或插件,大大简化了实现过程并提高了网站性能。这一纯CSS弹窗设计将为您的项目带来流畅而专业的用户体验。