🧭 Introduction
In previous lessons, you learned:
- CSS files → simple but global
- Inline styles → dynamic but limited
As your React app grows, global CSS causes problems like:
- Class name conflicts
- Styles overriding each other
- Difficult maintenance
To solve this, React provides CSS Modules, which allow you to write locally scoped CSS.
In this lesson, you will learn:
- What CSS Modules are
- Why they are needed
- How to use CSS Modules in React
- Dynamic & conditional styles with CSS Modules
- Best practices and common mistakes
❓ What are CSS Modules?
CSS Modules are:
CSS files where class names are scoped locally to the component by default.
This means:
- No global CSS conflicts
- Styles apply only to the component that imports them
🧠 Why Use CSS Modules?
❌ Problems with Normal CSS
- Class names are global
- Naming collisions
- Hard to maintain large apps
✅ Benefits of CSS Modules
✔ Scoped styles
✔ Cleaner code
✔ Easy maintenance
✔ Component-based styling
🧩 How CSS Modules Work
React transforms your CSS class names into unique names behind the scenes.
Example:
.title { color: blue; }
Becomes something like:
title__Header_module__x7a3k
👉 This happens automatically.
🛠 Step 1: Create a CSS Module File
CSS Module files must follow this naming pattern:
ComponentName.module.css
📄 Example: Button.module.css
.button {
background-color: teal;
color: white;
padding: 10px 15px;
border: none;
cursor: pointer;
}
.active {
background-color: green;
}
🛠 Step 2: Import CSS Module
import styles from "./Button.module.css";
👉 styles is an object containing class names.
🧩 Step 3: Use CSS Module Classes
const Button = ({ active }) => {
return (
<button
className={`${styles.button} ${active ? styles.active : ""}`}
>
Click Me
</button>
);
};
export default Button;
✔ No global pollution
✔ Safe and predictable styling
🧠 Accessing CSS Module Classes
styles.button
styles.active
❌ You cannot use plain string class names.
🧩 Conditional Styling with CSS Modules
<p className={isError ? styles.error : styles.success}>
Message
</p>
🧩 Multiple Classes Example
<div className={`${styles.box} ${styles.shadow}`}>
Card
</div>
🆚 CSS vs CSS Modules
| Feature | CSS | CSS Modules |
|---|---|---|
| Scope | Global | Local |
| Class conflicts | Yes ❌ | No ✅ |
| Maintenance | Hard | Easy |
| Component-based | ❌ | ✅ |
⚠ Common Mistakes
❌ Forgetting .module.css extension
❌ Using className="button"
❌ Importing incorrectly
❌ Overusing global CSS with modules
🎯 Best Practices
✅ One CSS module per component
✅ Use meaningful class names
✅ Combine with inline styles if needed
✅ Avoid unnecessary global CSS
❓ FAQs — CSS Modules in React
🔹 Are CSS Modules supported by default?
Yes, in Create React App and Vite.
🔹 Can I use media queries?
Yes. CSS Modules support all standard CSS features.
🔹 Can I use pseudo-classes like :hover?
Yes, fully supported.
🔹 Should I replace all CSS with CSS Modules?
For component styling — yes.
For global styles — no.
🧠 Quick Recap
✔ CSS Modules provide scoped styling
✔ Prevent class name conflicts
✔ Perfect for component-based apps
✔ Cleaner and safer than global CSS
🎉 Conclusion
CSS Modules are a perfect middle ground between global CSS and advanced styling libraries. They keep your styles modular, maintainable, and scalable, making them ideal for professional React applications.
You’re now styling like a real React developer 🎨🚀
👉 Next Lesson (SECTION 7):
Lesson 36 — Tailwind CSS in React