Styled Components in React: Writing CSS in JS

Lavesh Katariya

Lavesh Katariya

· 2 min read
Styled Components in React: Writing CSS in JS

Styled Components has revolutionized how we write CSS in React applications by enabling CSS-in-JS solutions that are both powerful and intuitive. This guide explores how to use Styled Components effectively in your React projects.

What are Styled Components?

Styled Components is a library that lets you write actual CSS code to style your components. It removes the mapping between components and styles, making it easier to maintain and modify your application's styling.

Getting Started

First, install the library:

npm install styled-components
# or
yarn add styled-components

Import it in your React component:

import styled from 'styled-components';

Basic Usage

Here's how to create a simple styled button:

const Button = styled.button`
  background-color: #007bff;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  cursor: pointer;

  &:hover {
    background-color: #0056b3;
  }
`;

// Use it in your component
function App() {
  return <Button>Click Me</Button>;
}

Props-Based Styling

One of the most powerful features is dynamic styling based on props:

const Button = styled.button`
  background-color: ${props => props.primary ? '#007bff' : '#6c757d'};
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  cursor: pointer;

  &:hover {
    opacity: 0.8;
  }
`;

// Usage
function App() {
  return (
    <div>
      <Button primary>Primary Button</Button>
      <Button>Secondary Button</Button>
    </div>
  );
}

Extending Styles

You can extend existing styles to create new components:

const Button = styled.button`
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

const PrimaryButton = styled(Button)`
  background-color: #007bff;
`;

const DangerButton = styled(Button)`
  background-color: #dc3545;
`;

Global Styles

Create global styles using the createGlobalStyle helper:

import { createGlobalStyle } from 'styled-components';

const GlobalStyle = createGlobalStyle`
  body {
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
  }

  * {
    box-sizing: border-box;
  }
`;

function App() {
  return (
    <>
      <GlobalStyle />
      {/* Your app components */}
    </>
  );
}

Theme Support

Styled Components has built-in theme support:

import { ThemeProvider } from 'styled-components';

const theme = {
  colors: {
    primary: '#007bff',
    secondary: '#6c757d',
    danger: '#dc3545'
  },
  spacing: {
    small: '8px',
    medium: '16px',
    large: '24px'
  }
};

const Button = styled.button`
  background-color: ${props => props.theme.colors.primary};
  padding: ${props => props.theme.spacing.medium};
`;

function App() {
  return (
    <ThemeProvider theme={theme}>
      <Button>Themed Button</Button>
    </ThemeProvider>
  );
}

Best Practices

1. Component Organization

// Create a separate file for styled components
// styles.js
export const Container = styled.div`
  max-width: 1200px;
  margin: 0 auto;
`;

export const Header = styled.header`
  padding: 20px;
  background: #f8f9fa;
`;

2. Naming Conventions

  • Use PascalCase for component names
  • Keep names descriptive and meaningful
  • Group related styles together

3. Media Queries

const ResponsiveDiv = styled.div`
  padding: 20px;
  
  @media (max-width: 768px) {
    padding: 10px;
  }
`;

Advanced Techniques

1. CSS Helper Functions

import { css } from 'styled-components';

const centerFlex = css`
  display: flex;
  justify-content: center;
  align-items: center;
`;

const Container = styled.div`
  ${centerFlex}
  background: #f8f9fa;
`;

2. Attribute Selectors

const Input = styled.input`
  padding: 10px;
  margin: 5px;

  &[type="password"] {
    letter-spacing: 2px;
  }
`;

3. Nested Selectors

const Card = styled.div`
  padding: 20px;
  background: white;

  h1 {
    font-size: 24px;
    margin-bottom: 10px;
  }

  p {
    color: #666;
  }
`;

Performance Considerations

1. Memoize Styled Components

const MemoizedButton = React.memo(styled.button`
  // styles
`);

2. Use Static Styles When Possible

// Prefer this
const Button = styled.button`
  padding: 10px;
`;

// Over this if the value won't change
const Button = styled.button`
  padding: ${() => '10px'};
`;

Common Issues and Solutions

1. Class Name Conflicts

  • Styled Components automatically generates unique class names
  • Use the className prop to add additional classes

2. Server-Side Rendering

  • Install and configure babel-plugin-styled-components
  • Use ServerStyleSheet for SSR setup

3. TypeScript Support

interface ButtonProps {
  primary?: boolean;
}

const Button = styled.button<ButtonProps>`
  background: ${props => props.primary ? 'blue' : 'gray'};
`;

Conclusion

Styled Components offers a powerful and flexible way to style React applications. By combining the power of CSS with the flexibility of JavaScript, it provides a superior developer experience while maintaining the benefits of CSS preprocessing, automatic vendor prefixing, and unique class names.

Remember to:

  • Keep your styled components organized
  • Use props and themes for dynamic styling
  • Follow best practices for maintainability
  • Consider performance implications

With these tools and techniques, you can create maintainable, scalable, and beautiful React applications.

Lavesh Katariya

About Lavesh Katariya

Innovative Full-Stack Developer | Technical Team Lead | Cloud Solutions Architect

With over a decade of experience in building and leading cutting-edge web application projects, I specialize in developing scalable, high-performance platforms that drive business growth. My expertise spans both front-end and back-end development, making me a versatile and hands-on leader capable of delivering end-to-end solutions.

Copyright © 2025 Lavesh Katariya. All rights reserved.