Skip to content

Tailwind CSS - Scroll Behavior

The Tailwind CSS Scroll Behavior utilities control the scrolling behavior of an element when a navigation event is triggered, such as clicking an anchor link. You can choose between an instant jump or a smooth, animated scroll.

By default, browsers use an ‘auto’ scroll behavior, which means clicking a link pointing to another part of the same page (e.g., <a href="#section2">) causes the viewport to jump instantly. The scroll-smooth utility overrides this to create a pleasant, animated scrolling effect, greatly improving the user experience for in-page navigation.

ClassCSS Properties
scroll-autoscroll-behavior: auto;
scroll-smoothscroll-behavior: smooth;

Practical Application: Smooth Scrolling for a Landing Page

Section titled “Practical Application: Smooth Scrolling for a Landing Page”

A common use case for scroll-smooth is on the root <html> element to enable smooth scrolling for all anchor links on a page. This is perfect for single-page websites or documentation pages with a table of contents.

The example below demonstrates this. We apply scroll-smooth to the <html> element. The top navigation bar contains links that point to different sections on the page. Clicking them will trigger a smooth scroll instead of an instant jump.

<!DOCTYPE html>
<!-- Apply scroll-smooth to the root element for a page-wide effect -->
<html lang="en" class="scroll-smooth">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Smooth Scroll Example</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
/* For better visual separation in the demo */
section {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
font-weight: bold;
}
</style>
</head>
<body class="font-sans">
<!-- Sticky Navigation -->
<nav class="sticky top-0 bg-gray-800 text-white p-4 z-10">
<div class="container mx-auto flex justify-center space-x-8">
<a href="#home" class="hover:text-cyan-400 transition-colors">Home</a>
<a href="#features" class="hover:text-cyan-400 transition-colors">Features</a>
<a href="#pricing" class="hover:text-cyan-400 transition-colors">Pricing</a>
<a href="#contact" class="hover:text-cyan-400 transition-colors">Contact</a>
</div>
</nav>
<!-- Page Sections -->
<main>
<section id="home" class="bg-slate-200">
<p>Home Section</p>
</section>
<section id="features" class="bg-slate-300">
<p>Features Section</p>
</section>
<section id="pricing" class="bg-slate-400">
<p>Pricing Section</p>
</section>
<section id="contact" class="bg-slate-500">
<p>Contact Section</p>
</section>
</main>
</body>
</html>
  • Global vs. Local: Apply scroll-smooth to the <html> tag for a global effect. For a specific scrollable container (like a modal or a sidebar), apply it directly to that element along with an overflow utility.
  • Modern Development: While the CDN is great for demos, a real project should use a build process. Install Tailwind CSS via npm and integrate it into your project with PostCSS for features like purging unused styles, applying vendor prefixes, and using the full power of tailwind.config.js.
  • Accessibility (a11y): Some users may have motion sensitivity (prefers-reduced-motion). You can use Tailwind’s motion-safe and motion-reduce variants to disable smooth scrolling for these users. For example: motion-safe:scroll-smooth.
  • Not working on <body>: The scroll-behavior property should be applied to the element that is actually scrolling. In most browsers, this is the <html> element, not the <body>.
  • Conflicts with JavaScript: If you have custom JavaScript that handles scroll events (e.g., from a library like GSAP or ScrollMagic), it might override the CSS scroll-behavior. Ensure your scripts and CSS work in harmony.