Core skills · Lesson 6/9

Tailwind CSS — Style at the Speed of Thought

30 min 2 exercises 1 quiz

What you'll learn

  • The idea that took over frontend: utility classes
  • Reading Tailwind code (every modern codebase has it)
  • Build your own mini-Tailwind to truly understand it
  • Responsive prefixes (sm:, md:, lg:) — one class list, every screen size
  • How to add the real Tailwind to a project

The spice rack 🧂

Classic CSS is like cooking where every dish needs its own custom sauce made from scratch:

.product-card { padding: 16px; background: white; border-radius: 8px; }
.profile-card { padding: 16px; background: white; border-radius: 8px; }
/* …the same sauce, re-made, forever */

Utility-first CSS is a spice rack: hundreds of tiny, single-job classes already prepared. You season the HTML directly:

<div class="p-4 bg-white rounded-lg shadow">
  A card, styled inline — no CSS file touched.
</div>

That's Tailwind CSS — each class does exactly one thing:

  • p-4 → padding: 1rem
  • bg-white → white background
  • rounded-lg → large border radius
  • text-xl → bigger text
  • flex gap-2 → flexbox with spacing
  • hover:bg-gray-100 → different background on hover

At first it looks "messy". Then you notice: you never invent class names, never jump between files, never break another page by editing shared CSS, and deleting HTML deletes its styles with it. That's why it won — this exact site is built with Tailwind.

Exercise 1

Build your own mini-Tailwind! Nothing teaches the concept better.

In the <style> block, define these 4 utility classes:

  1. .p-4 → padding: 16px
  2. .bg-white → background: white
  3. .rounded → border-radius: 8px
  4. .shadow → box-shadow: 0 2px 8px rgba(0,0,0,0.15)

The HTML already uses them — define the classes and watch both cards light up at once. (That's the "define once, season everywhere" effect.)

Responsive design — one class list, every screen 📱💻

A phone screen is ~375px wide; a laptop is often 1440px+. Tailwind bakes responsiveness right into the class names using breakpoint prefixes:

<div class="p-4 md:p-8 lg:p-12">
  <!-- padding: 16px on phones, 32px on tablets, 48px on desktops -->
</div>

The default breakpoints (memorize md and lg — you'll use them constantly):

  • (no prefix) — applies to all sizes (mobile-first default)
  • sm: — 640px and up
  • md: — 768px and up (tablets)
  • lg: — 1024px and up (small laptops)
  • xl: — 1280px and up (desktops)

Read md:flex as "apply display: flex, but only on screens 768px and wider." Stack them to build a fully responsive layout without writing a single @media query by hand — e.g. hidden md:flex means "hidden on mobile, shown as flex from tablet up," the exact pattern behind "hide this menu on phones, show it on desktop."

Exercise 2

Add two more utilities to your mini-Tailwind. In the <style> block, define:

  1. .text-xl → font-size: 20px
  2. .flex-row → display: flex and gap: 12px

The HTML below already uses both classes on a row of two badges.

Real-world case study: this site's own buttons 🔍

Look at any green button throughout this platform's lessons — its class list is real Tailwind you can now read completely: bg-emerald-500 hover:bg-emerald-400 text-black rounded-xl px-4 py-2. Translated: emerald background, slightly lighter emerald on hover, black text, extra-large rounded corners, and specific horizontal/vertical padding. Not a single custom CSS file was touched to make that button — it's utilities, composed. That's the entire craft of utility-first CSS.

Quick quiz

Question 1 of 5

What is a utility class?

Question 2 of 5

In Tailwind, hover:bg-gray-100 means…

Question 3 of 5

The biggest practical win of utility-first CSS is…

Question 4 of 5

What does md:flex mean?

Question 5 of 5

What does hidden md:flex achieve?

Add the real Tailwind

In a Vite/Next project:

npm install tailwindcss @tailwindcss/vite

…then follow the 2-minute framework guide at tailwindcss.com/docs/installation (each framework has an exact recipe).

Practice plan: rebuild your HTML & CSS lesson card using only Tailwind classes, add md: and lg: variants so it resizes gracefully, then browse a real project (this site's source on GitHub!) and read its class lists — you'll understand every one now.

Practice

Reading is not learning until you run something. Pick one.