You are currently viewing Styled Components: Writing CSS in JavaScript
Styled Components

Styled Components: Writing CSS in JavaScript

In the world of modern web development, component-based architecture has become the industry standard. Frameworks like React, Vue, and Angular focus on building reusable and modular components, making it easier to manage complex UI logic and structure. But when it comes to styling those components, traditional CSS often doesn’t feel as modular or scalable. That’s where Styled Components—a powerful CSS-in-JS library—comes into play.

Styled Components allows developers to write actual CSS inside JavaScript files. It enhances developer experience by making styling more modular, scoped, and dynamic—all while integrating seamlessly with the component-based nature of React. In this guide, we’ll explore everything you need to know about Styled Components, how it works, and why it might be the perfect solution for your next React project.

Using Tailwind CSS with React: A Quick Start Guide


Table of Contents

  1. What is Styled Components?
  2. Why CSS-in-JS?
  3. Installing Styled Components
  4. Creating Your First Styled Component
  5. Benefits of Using Styled Components
  6. Theming with Styled Components
  7. Dynamic Styling Using Props
  8. Global Styles and Resets
  9. Animations with Styled Components
  10. Best Practices and Common Pitfalls
  11. Comparison with Other Styling Approaches
  12. Final Thoughts

1. What is Styled Components?

Styled Components is a popular library for styling React components using tagged template literals. It allows you to write CSS directly in your JavaScript files, scoped to individual components by default. This avoids class name conflicts, makes code more readable, and encourages style reuse.

Developed by Max Stoiber and Glen Maddern, Styled Components is part of the broader CSS-in-JS movement, which is about co-locating styles with logic.

Here’s a basic example:

import styled from 'styled-components';

const Button = styled.button`
  background: #3498db;
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
  border: none;
  cursor: pointer;
`;

function App() {
  return <Button>Click Me</Button>;
}

2. Why CSS-in-JS?

Traditional CSS works great for small projects. But as your app scales, maintaining global stylesheets can become messy. CSS-in-JS offers several benefits:

  • Scoped styles (no class name collisions)
  • Dynamic styling using component props
  • Better maintainability through modular design
  • Theming and reusability
  • Improved developer experience with autocomplete and syntax highlighting

CSS-in-JS is not just a trend—it’s a practical solution for large-scale, component-heavy applications.


3. Installing Styled Components

Setting up Styled Components is simple. If you’re working in a React environment, all you need is:

npm install styled-components

Or with Yarn:

yarn add styled-components

If you’re using TypeScript:

npm install --save styled-components @types/styled-components

4. Creating Your First Styled Component

Let’s start by building a simple React component using Styled Components.

import React from 'react';
import styled from 'styled-components';

const Container = styled.div`
  padding: 2rem;
  background-color: #f4f4f4;
  text-align: center;
`;

const Title = styled.h1`
  color: #333;
`;

function HomePage() {
  return (
    <Container>
      <Title>Welcome to My Styled App</Title>
    </Container>
  );
}

export default HomePage;

Explanation:

  • We define Container and Title as styled components.
  • Styles are scoped to the component—no need to worry about overwriting global styles.

5. Benefits of Using Styled Components

1. Component-Level Scoping

Each styled component has a unique class name, ensuring that its styles don’t affect others unintentionally.

2. Dynamic Styling

Pass props directly into components to control styling dynamically. No need for separate classes or conditionals.

3. Improved Readability

Styles live next to the component logic, making components easier to understand and maintain.

4. Theming Support

You can build consistent design systems using themes.

5. No Class Name Bugs

Say goodbye to btn, btn-primary, and confusing override chains.


6. Theming with Styled Components

Themes let you define design tokens like colors, spacing, and fonts once and use them throughout your app.

Step 1: Create a Theme

// theme.js
export const lightTheme = {
  primary: '#3498db',
  secondary: '#2ecc71',
  text: '#333',
  background: '#fff',
};

Step 2: Provide the Theme

Wrap your app with ThemeProvider:

import { ThemeProvider } from 'styled-components';
import { lightTheme } from './theme';

function App() {
  return (
    <ThemeProvider theme={lightTheme}>
      <HomePage />
    </ThemeProvider>
  );
}

Step 3: Use Theme in Components

const Title = styled.h1`
  color: ${({ theme }) => theme.primary};
`;

Now you can change themes easily by updating your theme object.


7. Dynamic Styling Using Props

You can style components conditionally using props.

const Button = styled.button`
  background-color: ${({ primary }) => (primary ? '#3498db' : '#95a5a6')};
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
`;

function App() {
  return (
    <>
      <Button primary>Primary Button</Button>
      <Button>Default Button</Button>
    </>
  );
}

No need for if statements or classnames—you control style logic inside the component itself.


8. Global Styles and Resets

Sometimes you need to apply global styles, like a reset or base typography.

Styled Components provides a helper called createGlobalStyle.

import { createGlobalStyle } from 'styled-components';

const GlobalStyle = createGlobalStyle`
  * {
    box-sizing: border-box;
  }

  body {
    margin: 0;
    font-family: 'Inter', sans-serif;
  }
`;

function App() {
  return (
    <>
      <GlobalStyle />
      <HomePage />
    </>
  );
}

This lets you apply global styles without using external CSS files.


9. Animations with Styled Components

You can use CSS keyframes just like you would in vanilla CSS.

import styled, { keyframes } from 'styled-components';

const fadeIn = keyframes`
  from { opacity: 0; }
  to { opacity: 1; }
`;

const AnimatedBox = styled.div`
  animation: ${fadeIn} 2s ease-in;
  background: coral;
  padding: 20px;
`;

function App() {
  return <AnimatedBox>Hello Animation!</AnimatedBox>;
}

Animations can also be made dynamic using props or themes.


10. Best Practices and Common Pitfalls

✅ Keep Styles Small and Reusable

Don’t cram too many styles into one component. Break them into smaller ones.

✅ Use Theme for Consistency

Avoid hardcoding values. Instead, pull colors, spacing, and fonts from a theme.

✅ Name Components Meaningfully

Name your styled components according to their role, not their HTML element type (e.g., PrimaryButton, not StyledDiv).

❌ Don’t Overuse Inline Logic

Avoid writing complex logic inside styles. Use helper functions if needed.

const getColor = (type) => {
  switch (type) {
    case 'danger':
      return 'red';
    case 'success':
      return 'green';
    default:
      return 'gray';
  }
};

const Alert = styled.div`
  background-color: ${({ type }) => getColor(type)};
`;

11. Comparison with Other Styling Approaches

FeatureStyled ComponentsCSS ModulesSASS/SCSSTailwind CSS
Scoped Styles
Dynamic Styling✅ (via plugins)
Theming
JS Integration
Learning CurveModerateEasyEasyMedium
IDE SupportGoodExcellentExcellentGood

Styled Components offers a great balance between flexibility, readability, and scalability.


12. Final Thoughts

Styled Components is a game-changer for modern frontend development. It simplifies styling by allowing developers to write CSS directly in their JavaScript, co-locating logic and design in a way that’s intuitive, powerful, and clean.

Whether you’re building a small portfolio or a large enterprise app, Styled Components can make your styling process more manageable and enjoyable.

Summary:

  • It’s a powerful tool for writing scoped, dynamic styles in React.
  • It supports theming, global styles, animations, and more.
  • It keeps your UI consistent and easy to maintain.
  • It scales well with large applications.

If you haven’t tried it yet, Styled Components is worth exploring. Once you get used to writing styles in JavaScript, you may never want to return to traditional CSS again.


Would you like this turned into a downloadable PDF, blog post layout, or a tutorial-style GitHub project? Let me know, I’d be happy to help with that too!