Bootstrap 4:实现占剩余高度、可按钮滚动的无滚动条行
嘿,我来帮你搞定这个Bootstrap 4的布局问题!刚好之前做过类似需求,用Bootstrap本身的flex布局体系加上一点CSS和JS就能完美实现,来看看具体怎么做:
实现Bootstrap 4填充剩余高度的可滚动Row
核心布局实现
首先得利用Bootstrap 4的flex特性来让目标row占满页面剩余高度,层级设置很关键:
- 给最外层容器(比如
<body>或者包裹的父div)加上h-100 d-flex flex-column,确保它占满整个视口高度,且子元素按垂直方向排列。 - 页面上方的固定内容(比如导航、标题)保持默认,它们会自动占据自身高度。
- 包裹目标row的容器添加
flex-grow-1 overflow-hidden——flex-grow-1会让这个容器“吃掉”页面剩下的所有高度,overflow-hidden则能防止内容溢出到页面外。 - 在row内部的内容区,设置
overflow-y-auto让内容超出时自动出现垂直滚动,之后再用CSS隐藏滚动条。
隐藏滚动条的兼容CSS
不同浏览器的滚动条样式需要单独处理,这段代码能覆盖主流浏览器:
.scroll-content { overflow-y: auto; /* IE 和 Edge */ -ms-overflow-style: none; /* Firefox */ scrollbar-width: none; } /* Chrome、Safari、Opera */ .scroll-content::-webkit-scrollbar { display: none; }
按钮控制滚动的JS逻辑
给上下滚动按钮绑定点击事件,控制内容容器的滚动位置,还能加上平滑滚动的动画效果:
const scrollContent = document.querySelector('.scroll-content'); const scrollUpBtn = document.querySelector('#scroll-up'); const scrollDownBtn = document.querySelector('#scroll-down'); scrollUpBtn.addEventListener('click', () => { // 每次向上滚动50px,带平滑动画 scrollContent.scrollTo({ top: scrollContent.scrollTop - 50, behavior: 'smooth' }); }); scrollDownBtn.addEventListener('click', () => { scrollContent.scrollTo({ top: scrollContent.scrollTop + 50, behavior: 'smooth' }); });
完整可运行代码示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Bootstrap 4 Full Height Scroll Row</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"> <style> html, body { height: 100%; margin: 0; } .scroll-content { overflow-y: auto; -ms-overflow-style: none; scrollbar-width: none; } .scroll-content::-webkit-scrollbar { display: none; } </style> </head> <body class="h-100 d-flex flex-column"> <!-- 顶部固定内容 --> <header class="bg-primary text-white p-3"> <h2>顶部标题栏</h2> </header> <!-- 占满剩余高度的容器 --> <div class="flex-grow-1 overflow-hidden"> <div class="container-fluid h-100"> <div class="row h-100"> <!-- 左侧控制栏 --> <div class="col-3 bg-secondary text-white p-3"> <button id="scroll-up" class="btn btn-block btn-light mb-3">向上滚动</button> <button id="scroll-down" class="btn btn-block btn-light">向下滚动</button> </div> <!-- 右侧内容滚动区 --> <div class="col-9 bg-light"> <div class="scroll-content h-100 p-4"> <!-- 测试用的大量内容 --> <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> <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> <p>测试内容行</p> <p>测试内容行</p> </div> </div> </div> </div> </div> <script> const scrollContent = document.querySelector('.scroll-content'); const scrollUpBtn = document.querySelector('#scroll-up'); const scrollDownBtn = document.querySelector('#scroll-down'); scrollUpBtn.addEventListener('click', () => { scrollContent.scrollTo({ top: scrollContent.scrollTop - 50, behavior: 'smooth' }); }); scrollDownBtn.addEventListener('click', () => { scrollContent.scrollTo({ top: scrollContent.scrollTop + 50, behavior: 'smooth' }); }); </script> </body> </html>
关键细节提醒
- flex层级要连贯:从最外层的html/body到内容容器,每个层级的高度和flex属性都要设置正确,不然剩余高度的计算会出错。
- overflow的组合使用:父容器的
overflow-hidden是为了避免内容溢出导致页面出现全局滚动条,子容器的overflow-y-auto则让内部内容独立滚动。 - 滚动条隐藏的兼容性:不要只写webkit的样式,要兼顾Firefox和IE/Edge,不然在某些浏览器还是会看到滚动条。
这样调整后,你的row就能完美填充页面剩余高度,内容不会超出分配空间,点击按钮还能平滑滚动,滚动条也会被隐藏起来~
内容的提问来源于stack exchange,提问作者Phantom
相关产品推荐
相关产品推荐

