Bird
Raised Fist0
Bootsrapmarkup~10 mins

ScrollSpy component in Bootsrap - Browser Rendering Trace

Choose your learning style10 modes available
Render Flow - ScrollSpy component
Load HTML with nav and sections
↓
Initialize ScrollSpy JS
↓
Calculate section positions
↓
Listen to scroll events
↓
Detect current section in viewport
↓
Update nav active class
↓
Repaint nav with highlight
The browser loads the page with navigation and content sections. Bootstrap's ScrollSpy JavaScript calculates where each section is on the page, listens for scrolling, and updates the navigation menu to highlight the section currently visible.
Render Steps - 5 Steps
Code Added:<nav> with .nav and .nav-pills classes and links
Before
[No navigation menu visible]

[Content sections stacked vertically]
Section 1
Section 2
Section 3
→
After
[Navigation menu with 3 links horizontally]
[Section 1]
[Section 2]
[Section 3]
Adding the navigation menu creates clickable links for each section, shown horizontally with pill style.
🔧 Browser Action:Creates DOM nodes for nav and styles them with Bootstrap CSS
Code Sample
This code creates a vertical scrollable area with three sections. The navigation menu on top highlights the link of the section currently visible as you scroll.
Bootsrap
<nav id="navbar-example" class="navbar">
  <ul class="nav nav-pills">
    <li class="nav-item"><a class="nav-link" href="#section1">Section 1</a></li>
    <li class="nav-item"><a class="nav-link" href="#section2">Section 2</a></li>
    <li class="nav-item"><a class="nav-link" href="#section3">Section 3</a></li>
  </ul>
</nav>

<div class="scrollspy-example" data-bs-spy="scroll" data-bs-target="#navbar-example" data-bs-offset="0" tabindex="0">
  <h4 id="section1">Section 1</h4>
  <p>Content for section 1...</p>
  <h4 id="section2">Section 2</h4>
  <p>Content for section 2...</p>
  <h4 id="section3">Section 3</h4>
  <p>Content for section 3...</p>
</div>
Bootsrap
.scrollspy-example {
  position: relative;
  height: 300px;
  overflow-y: scroll;
}
.nav-link.active {
  background-color: #0d6efd;
  color: white;
}
Render Quiz - 3 Questions
Test your understanding
After applying step 3, what visual change happens in the navigation menu?
AThe nav link for Section 1 becomes highlighted
BAll nav links disappear
CThe nav menu moves to the bottom
DThe nav links become disabled
Common Confusions - 3 Topics
Why doesn't the nav link highlight change when I scroll?
ScrollSpy requires the scroll container to have position: relative or be the window. Also, the container must have the data-bs-spy="scroll" attribute and the correct data-bs-target. Without these, ScrollSpy won't detect scrolling properly (see render_step 2).
💡 Make sure the scroll container is set up with data-bs-spy and position relative.
Why is the active nav link highlight delayed or off by some pixels?
The data-bs-offset attribute controls when a section is considered active. If offset is too large or small, the highlight changes too early or late (see property_table). Adjusting offset fixes this timing.
💡 Use data-bs-offset to fine-tune when nav links highlight during scroll.
Why can't I scroll the content with keyboard?
The scroll container needs tabindex="0" to be focusable for keyboard scrolling (see code_sample). Without it, keyboard users can't scroll and trigger ScrollSpy updates.
💡 Add tabindex="0" to scroll container for keyboard accessibility.
Property Reference
AttributeValueEffectVisual ResultCommon Use
data-bs-spyscrollEnables ScrollSpy behaviorWatches scroll to update navActivate ScrollSpy on container
data-bs-target#navbar-exampleSpecifies nav to updateHighlights correct nav linkLink nav to scroll container
data-bs-offset0Offset for active section detectionAdjusts when nav link becomes activeFine-tune scroll trigger point
tabindex0Makes container focusableAllows keyboard scrollingAccessibility improvement
Concept Snapshot
ScrollSpy watches scrolling inside a container and highlights nav links for visible sections. Use data-bs-spy="scroll" on the scroll container. Use data-bs-target="#nav-id" to link nav menu. Add tabindex="0" for keyboard scrolling. Adjust data-bs-offset to control highlight timing. Active nav links update automatically as you scroll.

Practice

(1/5)
1. What is the main purpose of the Bootstrap ScrollSpy component?
easy
A. To lazy load images as you scroll
B. To create a fixed header at the top of the page
C. To add animations when scrolling
D. To highlight navigation links based on the page scroll position

Solution

  1. Step 1: Understand ScrollSpy functionality

    ScrollSpy tracks which section is visible on the page while scrolling.
  2. Step 2: Identify ScrollSpy's effect on navigation

    It highlights the corresponding navigation link to show the active section.
  3. Final Answer:

    To highlight navigation links based on the page scroll position -> Option D
  4. Quick Check:

    ScrollSpy = Highlight nav links on scroll [OK]
Hint: ScrollSpy links scroll position to nav highlights [OK]
Common Mistakes:
  • Confusing ScrollSpy with fixed headers
  • Thinking ScrollSpy adds animations
  • Assuming ScrollSpy lazy loads content
2. Which attribute is required on the scrollable container to enable Bootstrap ScrollSpy?
easy
A. data-bs-spy="scroll"
B. data-bs-target="#navbar"
C. data-bs-toggle="scrollspy"
D. data-bs-scroll="true"

Solution

  1. Step 1: Identify the attribute that activates ScrollSpy

    The attribute data-bs-spy="scroll" tells Bootstrap to watch scroll events.
  2. Step 2: Differentiate from other attributes

    data-bs-target points to the nav but does not activate ScrollSpy itself.
  3. Final Answer:

    data-bs-spy="scroll" -> Option A
  4. Quick Check:

    Activate ScrollSpy = data-bs-spy="scroll" [OK]
Hint: Use data-bs-spy="scroll" to enable ScrollSpy [OK]
Common Mistakes:
  • Using data-bs-toggle instead of data-bs-spy
  • Confusing data-bs-target as activation attribute
  • Adding non-existent data-bs-scroll attribute
3. Given this HTML snippet, what will happen when you scroll the page?
<body data-bs-spy="scroll" data-bs-target="#navbar">
  <nav id="navbar">
    <a href="#section1">Section 1</a>
    <a href="#section2">Section 2</a>
  </nav>
  <div id="section1">Content 1</div>
  <div id="section2">Content 2</div>
</body>
medium
A. The navbar will become fixed at the top when scrolling
B. The page will scroll automatically to section1 on load
C. The link for the section currently visible will be highlighted in the navbar
D. Nothing will happen because ScrollSpy requires JavaScript initialization

Solution

  1. Step 1: Analyze the HTML snippet

    The body has data-bs-spy="scroll" and data-bs-target="#navbar" attributes.
  2. Step 2: Check ScrollSpy initialization requirements

    Bootstrap 5 supports automatic initialization of ScrollSpy via data attributes without explicit JavaScript calls.
  3. Step 3: Expected behavior

    The link corresponding to the section currently visible will be highlighted in the navbar as you scroll.
  4. Final Answer:

    The link for the section currently visible will be highlighted in the navbar -> Option C
  5. Quick Check:

    ScrollSpy highlights nav links based on scroll position [OK]
Hint: ScrollSpy highlights nav links automatically with data attributes [OK]
Common Mistakes:
  • Thinking data attributes alone activate highlighting
  • Expecting auto-scroll to sections on load
  • Confusing with sticky/fixed navbar behavior
4. What is wrong with this ScrollSpy setup?
<div id="scrollArea" data-bs-spy="scroll" data-bs-target="#menu">
  <nav id="menu">
    <a href="#part1">Part 1</a>
    <a href="#part2">Part 2</a>
  </nav>
  <div id="part1">Content 1</div>
  <div id="part2">Content 2</div>
</div>
medium
A. The scrollable container #scrollArea needs a fixed height and overflow set
B. The nav element must be outside the scrollable container
C. The data-bs-target should point to #scrollArea, not #menu
D. The href attributes in nav links must be full URLs

Solution

  1. Step 1: Check ScrollSpy container requirements

    ScrollSpy requires the scrollable container to have a fixed height and overflow: auto or scroll to detect scrolling.
  2. Step 2: Identify missing CSS for #scrollArea

    The code lacks CSS to make #scrollArea scrollable, so ScrollSpy won't work properly.
  3. Final Answer:

    The scrollable container #scrollArea needs a fixed height and overflow set -> Option A
  4. Quick Check:

    Scrollable container needs height + overflow [OK]
Hint: Scrollable container must have fixed height and overflow [OK]
Common Mistakes:
  • Not setting height and overflow on scroll container
  • Placing nav outside scroll container unnecessarily
  • Using wrong data-bs-target attribute
  • Using full URLs in href instead of section IDs
5. You want to use ScrollSpy on a page with a fixed top navbar and multiple sections. Which combination of steps is correct to ensure ScrollSpy works properly?
hard
A. Add data-bs-spy="scroll" on navbar, set overflow: hidden; on body, and use full URLs in navbar links
B. Add data-bs-spy="scroll" and data-bs-target on body, set position: relative; on body, and ensure navbar links match section IDs
C. Add data-bs-spy="scroll" on each section, set position: fixed; on navbar, and use # only in links
D. Add data-bs-spy="scroll" on html, set overflow: scroll; on navbar, and use external links in navbar

Solution

  1. Step 1: Enable ScrollSpy on the scroll container

    Usually, body is the scroll container, so add data-bs-spy="scroll" and data-bs-target there.
  2. Step 2: Set position: relative; on the scroll container

    ScrollSpy requires the scroll container to have position: relative; for correct offset calculations.
  3. Step 3: Ensure navbar links correspond to section IDs

    Links in the navbar must have hrefs matching the IDs of the page sections for ScrollSpy to highlight correctly.
  4. Final Answer:

    Add data-bs-spy="scroll" and data-bs-target on body, set position: relative; on body, and ensure navbar links match section IDs -> Option B
  5. Quick Check:

    ScrollSpy setup = data attributes + position + matching links [OK]
Hint: Set data attributes on body, position relative, matching hrefs [OK]
Common Mistakes:
  • Adding data-bs-spy on wrong elements
  • Forgetting position: relative on scroll container
  • Using full URLs instead of section IDs in links
  • Setting overflow on navbar instead of scroll container
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