Bird
Raised Fist0
Bootsrapmarkup~8 mins

Nav tabs and pills in Bootsrap - Performance & Optimization

Choose your learning style10 modes available
Performance: Nav tabs and pills
MEDIUM IMPACT
This affects page load speed and interaction responsiveness by how navigation elements are rendered and updated in the browser.
Creating navigation with many tabs or pills that switch content panels
Bootsrap
<ul class="nav nav-tabs" role="tablist">
  <li class="nav-item"><button class="nav-link active" id="tab1-tab" data-bs-toggle="tab" data-bs-target="#tab1" type="button" role="tab" aria-controls="tab1" aria-selected="true">Tab 1</button></li>
  <li class="nav-item"><button class="nav-link" id="tab2-tab" data-bs-toggle="tab" data-bs-target="#tab2" type="button" role="tab" aria-controls="tab2" aria-selected="false">Tab 2</button></li>
</ul>
<div class="tab-content">
  <div class="tab-pane fade show active" id="tab1" role="tabpanel" aria-labelledby="tab1-tab">Lightweight initial content or lazy loaded content</div>
  <div class="tab-pane fade" id="tab2" role="tabpanel" aria-labelledby="tab2-tab" hidden></div>
</div>
Lazy load or defer heavy content until tab is active, use buttons with ARIA roles for accessibility and reduce initial DOM size.
📈 Performance GainReduces initial load blocking by 50%+, single reflow on tab switch, improves INP by reducing main thread work
Creating navigation with many tabs or pills that switch content panels
Bootsrap
<ul class="nav nav-tabs">
  <li class="nav-item"><a class="nav-link active" href="#tab1" data-bs-toggle="tab">Tab 1</a></li>
  <li class="nav-item"><a class="nav-link" href="#tab2" data-bs-toggle="tab">Tab 2</a></li>
  <!-- many more tabs -->
</ul>
<div class="tab-content">
  <div class="tab-pane fade show active" id="tab1">Heavy content with images and scripts</div>
  <div class="tab-pane fade" id="tab2">Heavy content with images and scripts</div>
  <!-- many more tab panes -->
</div>
Rendering all tab content at once causes large DOM size and heavy initial load, plus switching tabs triggers layout recalculations and repaints.
📉 Performance CostBlocks rendering for 200+ ms on load, triggers multiple reflows on tab switch
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
All tabs content rendered at onceHigh (many nodes)Multiple on tab switchHigh due to repaint[X] Bad
Lazy load tab content on demandLow (only active tab nodes)Single on tab switchLow repaint cost[OK] Good
Rendering Pipeline
Nav tabs and pills affect the browser's style calculation, layout, and paint stages especially when switching tabs triggers showing/hiding content panels.
→Style Calculation
→Layout
→Paint
⚠️ BottleneckLayout stage is most expensive due to recalculating sizes and positions of tab content on switch
Core Web Vital Affected
INP
This affects page load speed and interaction responsiveness by how navigation elements are rendered and updated in the browser.
Optimization Tips
1Avoid rendering all tab content at once to reduce initial load time.
2Use lazy loading or defer loading heavy tab content until the tab is active.
3Use semantic buttons with ARIA roles for accessible and performant tab navigation.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a main performance problem when rendering all tab content at once in nav tabs?
ALarge DOM size causing slow initial load and many reflows on tab switch
BTabs do not respond to clicks
CCSS styles do not apply
DJavaScript errors prevent tab switching
DevTools: Performance
How to check: Record a performance profile while switching tabs and observe the Main thread activity and Layout events.
What to look for: Look for long Layout and Paint tasks on tab switch indicating expensive reflows and repaints.

Practice

(1/5)
1. What is the main difference between nav-tabs and nav-pills in Bootstrap navigation?
easy
A. nav-tabs requires JavaScript, nav-pills does not.
B. nav-tabs shows tabs with borders, nav-pills shows rounded pill-shaped links.
C. nav-tabs is for vertical menus, nav-pills is for horizontal menus only.
D. nav-tabs disables links, nav-pills enables links.

Solution

  1. Step 1: Understand Bootstrap navigation styles

    nav-tabs creates a tab-like navigation with rectangular borders around each item.
  2. Step 2: Compare with nav-pills

    nav-pills styles navigation links as rounded pills, giving a softer look.
  3. Final Answer:

    nav-tabs shows tabs with borders, nav-pills shows rounded pill-shaped links. -> Option B
  4. Quick Check:

    Tabs = rectangular, Pills = rounded [OK]
Hint: Tabs have edges, pills are rounded shapes [OK]
Common Mistakes:
  • Thinking nav-tabs are vertical only
  • Believing nav-pills don't need JS
  • Confusing disabled/enabled states
2. Which of the following is the correct Bootstrap class to create a pill-style navigation list?
easy
A. <ul class='nav-tabs'>
B. <ul class='nav nav-tabs-pills'>
C. <ul class='nav nav-pills'>
D. <ul class='nav pills'>

Solution

  1. Step 1: Recall Bootstrap classes for pills

    The correct class for pill navigation is nav-pills combined with nav.
  2. Step 2: Check each option

    <ul class='nav nav-pills'> uses nav nav-pills, which is correct. Others have incorrect or non-existent classes.
  3. Final Answer:

    <ul class='nav nav-pills'> -> Option C
  4. Quick Check:

    Use nav nav-pills for pills [OK]
Hint: Use both 'nav' and 'nav-pills' classes together [OK]
Common Mistakes:
  • Using only 'pills' without 'nav'
  • Combining 'nav-tabs' and 'pills' incorrectly
  • Misspelling class names
3. Given this Bootstrap nav tab code snippet, what will be the visual result in the browser?
<ul class='nav nav-tabs' role='tablist'>
  <li class='nav-item'>
    <a class='nav-link active' href='#home' role='tab' aria-selected='true'>Home</a>
  </li>
  <li class='nav-item'>
    <a class='nav-link' href='#profile' role='tab' aria-selected='false'>Profile</a>
  </li>
</ul>
medium
A. Two tabs labeled 'Home' and 'Profile', with 'Home' highlighted as active.
B. Two pill-shaped buttons labeled 'Home' and 'Profile', both inactive.
C. A vertical list of links with no active highlight.
D. Tabs labeled 'Home' and 'Profile' but both disabled.

Solution

  1. Step 1: Analyze the classes and attributes

    The nav-tabs class creates tab style navigation. The nav-link active class highlights the 'Home' tab as active.
  2. Step 2: Understand the visual effect

    'Home' tab will appear selected with a border, 'Profile' will appear as a normal tab link.
  3. Final Answer:

    Two tabs labeled 'Home' and 'Profile', with 'Home' highlighted as active. -> Option A
  4. Quick Check:

    Active tab is highlighted in nav-tabs [OK]
Hint: Active tab uses 'nav-link active' class [OK]
Common Mistakes:
  • Confusing pills with tabs visually
  • Assuming both tabs are active
  • Ignoring role and aria attributes
4. Identify the error in this Bootstrap nav pills code snippet:
<ul class='nav nav-pills'>
  <li class='nav-item'>
    <a class='nav-link active' data-toggle='tab' href='#home'>Home</a>
  </li>
  <li class='nav-item'>
    <a class='nav-link' data-toggle='tab' href='#profile'>Profile</a>
  </li>
</ul>
medium
A. The attribute data-toggle should be data-bs-toggle in Bootstrap 5+.
B. The class nav-pills is invalid and should be nav-tabs.
C. The href attributes must be full URLs, not fragment IDs.
D. The nav-item class should be on the a tags, not li.

Solution

  1. Step 1: Check Bootstrap version attribute changes

    Bootstrap 5 replaced data-toggle with data-bs-toggle for JavaScript plugins.
  2. Step 2: Verify other attributes and classes

    nav-pills is valid, href can use fragment IDs, and nav-item belongs on li.
  3. Final Answer:

    The attribute data-toggle should be data-bs-toggle in Bootstrap 5+. -> Option A
  4. Quick Check:

    Use 'data-bs-toggle' in Bootstrap 5+ [OK]
Hint: Bootstrap 5 uses 'data-bs-toggle' not 'data-toggle' [OK]
Common Mistakes:
  • Using old Bootstrap 4 attributes
  • Misplacing classes on wrong elements
  • Thinking href must be full URL
5. You want to create a responsive Bootstrap nav with pills that switch content panels on click. Which combination of classes and attributes is correct to ensure accessibility and proper tab switching?
hard
A. <ul class='nav nav-pills'> <li class='nav-item'> <a class='nav-link' href='#home' role='tab' aria-selected='false'>Home</a> </li> </ul>
B. <ul class='nav nav-tabs' role='navigation'> <li> <a class='nav-link' href='#home'>Home</a> </li> </ul>
C. <div class='nav nav-pills'> <a class='nav-link' data-toggle='tab' href='#home'>Home</a> </div>
D. <ul class='nav nav-pills' role='tablist'> <li class='nav-item'> <a class='nav-link active' id='home-tab' data-bs-toggle='pill' href='#home' role='tab' aria-controls='home' aria-selected='true'>Home</a> </li> </ul>

Solution

  1. Step 1: Identify correct classes and roles for pills navigation

    Use nav nav-pills on ul with role='tablist' for accessibility.
  2. Step 2: Check anchor attributes for tab switching and accessibility

    Anchors need id, data-bs-toggle='pill', href to panel, role='tab', aria-controls, and aria-selected.
  3. Step 3: Confirm active state on the selected tab

    The active tab has nav-link active and aria-selected='true'.
  4. Final Answer:

    <ul class='nav nav-pills' role='tablist'> <li class='nav-item'> <a class='nav-link active' id='home-tab' data-bs-toggle='pill' href='#home' role='tab' aria-controls='home' aria-selected='true'>Home</a> </li> </ul> -> Option D
  5. Quick Check:

    Use 'nav-pills' with proper roles and 'data-bs-toggle' [OK]
Hint: Use 'data-bs-toggle', roles, and aria attributes for tabs [OK]
Common Mistakes:
  • Omitting role or aria attributes
  • Using old 'data-toggle' instead of 'data-bs-toggle'
  • Missing active class on selected tab
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard