如何为Bootstrap垂直Nav Pills添加垂直滚动条?
问题描述
我的垂直Nav Pills数量较多,且采用动态加载方式,当Nav Pills超出常规窗口/屏幕范围时,页面会被拉长。请问如何实现Nav Pills的垂直滚动效果?
以下是我的示例代码:
CSS代码
/* * * ========================================== * CUSTOM UTIL CLASSES * ========================================== */ .nav-pills-custom .nav-link { color: #aaa; background: #fff; position: relative; } .nav-pills-custom .nav-link.active { color: #45b649; background: #fff; } /* Add indicator arrow for the active tab */ @media (min-width: 992px) { .nav-pills-custom .nav-link::before { content: ''; display: block; border-top: 8px solid transparent; border-left: 10px solid #fff; border-bottom: 8px solid transparent; position: absolute; top: 50%; right: -10px; transform: translateY(-50%); opacity: 0; } } .nav-pills-custom .nav-link.active::before { opacity: 1; } /* * * ========================================== * FOR DEMO PURPOSE * ========================================== */ body { min-height: 100vh; background: linear-gradient(to left, #dce35b, #45b649); }
HTML代码
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/> <!-- Demo header--> <section class="py-5 header"> <div class="container py-4"> <header class="text-center mb-5 pb-5 text-white"> <h1 class="display-4">Bootstrap vertical tabs</h1> <p class="font-italic mb-1">Making advantage of Bootstrap 4 components, easily build an awesome tabbed interface.</p> <p class="font-italic">Snippet by <a class="text-white" href="https://bootstrapious.com/"> <u>Bootstrapious</u> </a> </p> </header> <div class="row"> <div class="col-md-3"> <!-- Tabs nav --> <div class="nav flex-column nav-pills nav-pills-custom" id="v-pills-tab" role="tablist" aria-orientation="vertical"> <a class="nav-link mb-3 p-3 shadow active" id="v-pills-home-tab" data-toggle="pill" href="#v-pills-home" role="tab" aria-controls="v-pills-home" aria-selected="true"> <i class="fa fa-user-circle-o mr-2"></i> <span class="font-weight-bold small text-uppercase">Personal information</span></a> <a class="nav-link mb-3 p-3 shadow" id="v-pills-profile-tab" data-toggle="pill" href="#v-pills-profile" role="tab" aria-controls="v-pills-profile" aria-selected="false"> <i class="fa fa-calendar-minus-o mr-2"></i> <span class="font-weight-bold small text-uppercase">Bookings</span></a> <a class="nav-link mb-3 p-3 shadow" id="v-pills-messages-tab" data-toggle="pill" href="#v-pills-messages" role="tab" aria-controls="v-pills-messages" aria-selected="false"> <i class="fa fa-star mr-2"></i> <span class="font-weight-bold small text-uppercase">Reviews</span></a> <a class="nav-link mb-3 p-3 shadow" id="v-pills-settings-tab" data-toggle="pill" href="#v-pills-settings" role="tab" aria-controls="v-pills-settings" aria-selected="false"> <i class="fa fa-check mr-2"></i> <span class="font-weight-bold small text-uppercase">Confirm booking</span></a> </div> </div> <div class="col-md-9"> <!-- Tabs content --> <div class="tab-content" id="v-pills-tabContent"> <div class="tab-pane fade shadow rounded bg-white show active p-5" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab"> <h4 class="font-italic mb-4">Personal information</h4> <p class="font-italic text-muted mb-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> <div class="tab-pane fade shadow rounded bg-white p-5" id="v-pills-profile" role="tabpanel" aria-labelledby="v-pills-profile-tab"> <h4 class="font-italic mb-4">Bookings</h4> <p class="font-italic text-muted mb-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> <div class="tab-pane fade shadow rounded bg-white p-5" id="v-pills-messages" role="tabpanel" aria-labelledby="v-pills-messages-tab"> <h4 class="font-italic mb-4">Reviews</h4> <p class="font-italic text-muted mb-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> <div class="tab-pane fade shadow rounded bg-white p-5" id="v-pills-settings" role="tabpanel" aria-labelledby="v-pills-settings-tab"> <h4 class="font-italic mb-4">Confirm booking</h4> <p class="font-italic text-muted mb-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </div> </div> </div> </div> </section>
实现垂直滚动的解决方案
只需给Nav Pills容器添加固定高度和溢出滚动属性,即可实现垂直滚动,具体操作如下:
1. 核心CSS修改
给#v-pills-tab容器添加以下样式,限制高度并启用垂直滚动:
#v-pills-tab { max-height: calc(100vh - 200px); /* 根据页面头部高度调整,确保不超出视口 */ overflow-y: auto; padding-right: 8px; /* 避免滚动条与内容重叠 */ } /* 可选:自定义滚动条样式,优化视觉体验 */ #v-pills-tab::-webkit-scrollbar { width: 6px; } #v-pills-tab::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 3px; } #v-pills-tab::-webkit-scrollbar-thumb { background: #ccc; border-radius: 3px; } #v-pills-tab::-webkit-scrollbar-thumb:hover { background: #aaa; }
2. 响应式适配(可选)
针对移动端调整容器高度,避免滚动区域过大:
@media (max-width: 991px) { #v-pills-tab { max-height: 300px; } }
3. 动态加载后的优化(可选)
如果是动态添加Nav Pills项,可在添加完成后让激活项自动滚动到视野中央:
const activeTab = document.querySelector('.nav-link.active'); if (activeTab) { activeTab.scrollIntoView({ behavior: 'smooth', block: 'center' }); }
修改后的完整CSS代码
/* * * ========================================== * CUSTOM UTIL CLASSES * ========================================== */ .nav-pills-custom .nav-link { color: #aaa; background: #fff; position: relative; } .nav-pills-custom .nav-link.active { color: #45b649; background: #fff; } /* 新增垂直滚动样式 */ #v-pills-tab { max-height: calc(100vh - 200px); overflow-y: auto; padding-right: 8px; } /* 自定义滚动条 */ #v-pills-tab::-webkit-scrollbar { width: 6px; } #v-pills-tab::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 3px; } #v-pills-tab::-webkit-scrollbar-thumb { background: #ccc; border-radius: 3px; } #v-pills-tab::-webkit-scrollbar-thumb:hover { background: #aaa; } /* Add indicator arrow for the active tab */ @media (min-width: 992px) { .nav-pills-custom .nav-link::before { content: ''; display: block; border-top: 8px solid transparent; border-left: 10px solid #fff; border-bottom: 8px solid transparent; position: absolute; top: 50%; right: -10px; transform: translateY(-50%); opacity: 0; } } .nav-pills-custom .nav-link.active::before { opacity: 1; } /* 响应式适配 */ @media (max-width: 991px) { #v-pills-tab { max-height: 300px; } } /* * * ========================================== * FOR DEMO PURPOSE * ========================================== */ body { min-height: 100vh; background: linear-gradient(to left, #dce35b, #45b649); }
内容的提问来源于stack exchange,提问作者Calm Boy
相关产品推荐
相关产品推荐

