Bird
Raised Fist0
NextJSframework~20 mins

Scroll behavior control in NextJS - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Scroll Mastery in Next.js
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when this Next.js component uses useEffect to scroll?
Consider this Next.js functional component that scrolls the window to the top when it mounts. What will the user see after the component loads?
NextJS
import { useEffect } from 'react';

export default function ScrollTop() {
  useEffect(() => {
    window.scrollTo({ top: 0, behavior: 'smooth' });
  }, []);

  return <div style={{ height: '200vh' }}>Scroll and reload to test</div>;
}
AThe page jumps instantly to the top without animation.
BThe page smoothly scrolls to the top on load.
CNothing happens; the page stays where it was.
DThe page scrolls to the bottom smoothly.
Attempts:
2 left
💡 Hint
Think about what window.scrollTo with behavior 'smooth' does inside useEffect on mount.
📝 Syntax
intermediate
2:00remaining
Which option correctly disables scroll restoration in Next.js client-side navigation?
Next.js uses the browser's scroll restoration by default. Which code snippet correctly disables it to control scroll manually?
NextJS
import { useEffect } from 'react';
import { useRouter } from 'next/router';

export default function DisableScrollRestoration() {
  const router = useRouter();

  useEffect(() => {
    // Your code here
  }, [router]);

  return <div>Content</div>;
}
Awindow.history.scrollRestoration = 'manual';
Bwindow.scrollRestoration = 'manual';
Chistory.scrollRestoration = 'manual';
Dwindow.history.scrollRestore = 'manual';
Attempts:
2 left
💡 Hint
Check the correct property on window.history to control scroll restoration.
🔧 Debug
advanced
2:00remaining
Why does this Next.js scroll control code fail to scroll smoothly on route change?
This code tries to scroll smoothly to top on route change but the scroll is instant. What is the cause?
NextJS
import { useEffect } from 'react';
import { useRouter } from 'next/router';

export default function ScrollOnRouteChange() {
  const router = useRouter();

  useEffect(() => {
    window.scrollTo({ top: 0, behavior: 'smooth' });
  }, [router.pathname]);

  return <div style={{ height: '200vh' }}>Page content</div>;
}
AThe component does not render enough content to scroll.
Bwindow.scrollTo does not support smooth behavior in modern browsers.
CNext.js scroll restoration conflicts and resets scroll instantly after useEffect runs.
DThe useEffect dependency is wrong; it should be router instead of router.pathname.
Attempts:
2 left
💡 Hint
Next.js automatically restores scroll position on navigation unless disabled.
🧠 Conceptual
advanced
2:00remaining
What is the best way to implement smooth scroll to a section on the same page in Next.js?
You want to smoothly scroll to a section with id 'features' when clicking a button. Which approach works best in Next.js?
AUse <a href="#features"> with CSS scroll-behavior: smooth on html element.
BUse router.push('/page#features') and rely on Next.js scroll restoration.
CUse window.scrollTo({ top: document.getElementById('features').offsetTop }) without behavior.
DUse window.location.hash = '#features' without smooth behavior.
Attempts:
2 left
💡 Hint
Native browser smooth scrolling with CSS is simple and reliable.
❓ state_output
expert
3:00remaining
What is the scroll position after this Next.js component runs?
This component disables automatic scroll restoration and manually scrolls to 100px from top on route change. What is the final scroll position after navigation?
NextJS
import { useEffect } from 'react';
import { useRouter } from 'next/router';

export default function ManualScroll() {
  const router = useRouter();

  useEffect(() => {
    if ('scrollRestoration' in window.history) {
      window.history.scrollRestoration = 'manual';
    }

    const handleRouteChange = () => {
      window.scrollTo({ top: 100, behavior: 'auto' });
    };

    router.events.on('routeChangeComplete', handleRouteChange);

    return () => {
      router.events.off('routeChangeComplete', handleRouteChange);
    };
  }, [router.events]);

  return <div style={{ height: '300vh' }}>Long content</div>;
}
AThe page stays at the previous scroll position after navigation.
BThe page scrolls smoothly to 100 pixels from the top after navigation.
CThe page scrolls instantly to the top (0 pixels) after navigation.
DThe page scrolls instantly to 100 pixels from the top after navigation.
Attempts:
2 left
💡 Hint
Check the scrollRestoration setting and the scrollTo behavior used.

Practice

(1/5)
1. What does setting behavior: 'smooth' in window.scrollTo do in a Next.js app?
easy
A. It reloads the page after scrolling.
B. It makes the page scroll smoothly instead of jumping instantly.
C. It scrolls the page to the top instantly.
D. It disables scrolling on the page.

Solution

  1. Step 1: Understand the scroll behavior option

    The behavior property controls how scrolling happens. Setting it to 'smooth' means the scroll moves gradually.
  2. Step 2: Apply to Next.js scrolling

    Using window.scrollTo({ behavior: 'smooth' }) in Next.js makes the page scroll smoothly instead of jumping instantly.
  3. Final Answer:

    It makes the page scroll smoothly instead of jumping instantly. -> Option B
  4. Quick Check:

    behavior: 'smooth' = smooth scrolling [OK]
Hint: Remember 'smooth' means gradual scroll, not instant jump [OK]
Common Mistakes:
  • Thinking 'smooth' disables scrolling
  • Confusing 'smooth' with instant scroll
  • Assuming it reloads the page
2. Which of the following is the correct syntax to scroll smoothly to the top of the page in Next.js?
easy
A. window.scrollTo({ smooth: 'top' });
B. window.scrollTo(0, 0, 'smooth');
C. window.scrollTo({ top: 0, smooth: true });
D. window.scrollTo({ top: 0, behavior: 'smooth' });

Solution

  1. Step 1: Review window.scrollTo syntax

    The correct syntax uses an object with top and behavior keys: { top: 0, behavior: 'smooth' }.
  2. Step 2: Identify correct option

    window.scrollTo({ top: 0, behavior: 'smooth' }); matches the correct syntax. Others misuse parameters or keys.
  3. Final Answer:

    window.scrollTo({ top: 0, behavior: 'smooth' }); -> Option D
  4. Quick Check:

    Correct scrollTo syntax = window.scrollTo({ top: 0, behavior: 'smooth' }); [OK]
Hint: Use object with top and behavior keys for smooth scroll [OK]
Common Mistakes:
  • Passing parameters as separate arguments instead of object
  • Using incorrect keys like 'smooth' instead of 'behavior'
  • Misplacing the 'smooth' value
3. Consider this Next.js code snippet inside a component:
<pre>useEffect(() => { router.events.on('routeChangeComplete', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); }, []);
What will happen when the route changes?
medium
A. The page will smoothly scroll to the top after navigation.
B. Nothing will happen because the event listener is not removed.
C. The page will jump instantly to the top.
D. The page will reload after scrolling.

Solution

  1. Step 1: Understand event listener on routeChangeComplete

    The code listens for the route change completion event and triggers scrolling.
  2. Step 2: Analyze scrollTo call

    It calls window.scrollTo with behavior: 'smooth', so scrolling is smooth to top.
  3. Final Answer:

    The page will smoothly scroll to the top after navigation. -> Option A
  4. Quick Check:

    routeChangeComplete + smooth scroll = smooth scroll top [OK]
Hint: routeChangeComplete triggers smooth scroll to top [OK]
Common Mistakes:
  • Assuming instant jump instead of smooth scroll
  • Thinking event listener removal is required to trigger scroll
  • Confusing scroll with page reload
4. This Next.js code tries to scroll smoothly on route change:
<pre>useEffect(() => { router.events.on('routeChangeComplete', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); }, []);
But after navigating multiple times, scrolling stops working. What is the likely problem?
medium
A. The event listener is added multiple times without cleanup, causing issues.
B. The scrollTo syntax is incorrect and causes errors.
C. Next.js does not support scroll control on route changes.
D. The behavior 'smooth' is not supported in modern browsers.

Solution

  1. Step 1: Identify event listener management

    The code adds an event listener on mount but never removes it, so multiple listeners accumulate.
  2. Step 2: Understand effect of multiple listeners

    Multiple listeners cause unexpected behavior or conflicts, stopping scroll from working properly.
  3. Final Answer:

    The event listener is added multiple times without cleanup, causing issues. -> Option A
  4. Quick Check:

    Missing cleanup causes multiple listeners = problem [OK]
Hint: Always remove event listeners in useEffect cleanup [OK]
Common Mistakes:
  • Ignoring cleanup of event listeners
  • Blaming scrollTo syntax which is correct
  • Assuming browser support is the issue
5. You want to scroll smoothly to a specific section with id 'contact' after navigating to a new page in Next.js. Which approach correctly achieves this?
hard
A. Use window.scrollTo(0, 0); after navigation and then call scrollIntoView without behavior option.
B. Use window.scrollTo({ top: document.getElementById('contact').offsetTop, behavior: 'auto' }); inside routeChangeStart event.
C. Use router.events.on('routeChangeComplete', () => { document.getElementById('contact').scrollIntoView({ behavior: 'smooth' }); });
D. Use router.push('/contact'); without any scroll control; rely on default browser behavior.

Solution

  1. Step 1: Choose correct event and method

    Use routeChangeComplete to ensure page is loaded, then scroll to element with smooth behavior.
  2. Step 2: Verify scrollIntoView usage

    scrollIntoView({ behavior: 'smooth' }) scrolls smoothly to the element with id 'contact'.
  3. Final Answer:

    Use router.events.on('routeChangeComplete', () => { document.getElementById('contact').scrollIntoView({ behavior: 'smooth' }); }); -> Option C
  4. Quick Check:

    routeChangeComplete + scrollIntoView smooth = Use router.events.on('routeChangeComplete', () => { document.getElementById('contact').scrollIntoView({ behavior: 'smooth' }); }); [OK]
Hint: Scroll after routeChangeComplete using scrollIntoView with smooth [OK]
Common Mistakes:
  • Using routeChangeStart instead of routeChangeComplete
  • Forgetting behavior: 'smooth' for smooth scroll
  • Relying on default scroll without control
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