Styled Components is react library that allows us to style react components individually.
In this tutorial, you will learn about styled-components & how to use styled-components in your React application.
We can use styled-components in React & react-native applications but this guide will focus only on using styled-components with React.
Table of contents:
- What are Styled-components ?
- But why Styled-components ?
- Installing styled-components
- Getting started
- Props in styled-components
- Make it Responsive
- Overriding Styles
- Global styling
- Conclusion
What are Styled-components ?
Styled Components allows us to write CSS in JavaScript
It is a component-based framework specially developed for react & react-native applications which uses component-based approach to manage our styles.
It removes the mapping between components and styles. This means that when you're defining your styles, you're actually creating a normal React component, that has your styles attached to it.
But why Styled-components ?
Reusable styles: You're writing CSS in a component-based approach which means once you define your styles you can use that anywhere inside your project.
No class name bugs: In styled-components you don't have to worry about naming conventions, the library provides unique class name that eliminates duplication, overlap or misspellings errors.
Easy to manage CSS: You never have to find different files affecting the styling which makes it easier to manage CSS.
Eliminates unused code: If any specific styled-component is unused it automatically deletes all its styles.
Installing styled-components
Start by creating react application
npx create-react-app styled-components-tutorial
To use styled-components, you first have to install it using npm or yarn.
# with npm
npm install --save styled-components
# with yarn
yarn add styled-components
or if you're not using any package manager you can use styled-components with CDN, just add this to bottom of your html file.
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>
Getting started
styled-components uses tagged template literals to style your components.
import React from "react";
import styled from "styled-components";
// Creating a Heading styled-component that'll render an <h1> tag with some additional styles
const Heading = styled.h1`
font-size: 1.5em;
color: #2F9ED8;
`;
// Creating a Container styled-component that'll render an <section> tag with some additional styles
const Container = styled.section`
padding: 4em;
background: #B6585F;
`;
function App() {
return (
<div>
<Container>
<Heading>Styled Components</Heading>
</Container>
</div>
);
}
You can visit codesandbox & see the output.
In the above example we created styled-components inside existing component file. we can also create a separate file for styled-components.
// Heading.js
import styled from 'styled-components';
const Heading = styled.h1`
font-size: 1.5em;
color: #2F9ED8;
`;
export default Heading;
Now you can use Heading Component in any component of the project.
// App.js
import React from 'react';
import styled from 'styled-components';
// import the styled component:
import Heading from './Heading';
const App = () => {
return (
<div>
<Heading>Styled Components</Heading>
</div>
)
}
export default App;
Props in styled components
Styled components are functional components which means we can style components dynamically.
To make our components styles dynamic we use props.
Let's take a look at example
Suppose you want different buttons in your application (for ex. Primary, Danger, etc)
const Button = styled.button`
background: ${props => props.primary ? "blue" : "white"};
color: ${props => props.primary ? "white" : "blue"};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid blue;
border-radius: 3px;
`;
return(
<div>
<Button>Normal</Button>
<Button primary>Primary</Button>
</div>
);
We are rendering two button components, one normal button & one with "primary" as prop.
Live code example here.
Make it Responsive
To make your components responsive we can use media-queries just as we use them in plain CSS.
const Button = styled.button`
background: ${props => props.primary ? "blue" : "white"};
color: ${props => props.primary ? "white" : "blue"};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid blue;
border-radius: 3px;
@media (min-width: 768px) {
padding: 1rem 2rem;
width: 11rem;
}
@media (min-width: 1024px) {
padding: 1.5rem 2.5rem;
width: 13rem;
}
`;
return(
<div>
<Button>Normal</Button>
<Button primary>Primary</Button>
</div>
);
Overriding styles
To change a component slightly we can extend the style for a single use case.
For example:
const Button = styled.button`
color: blue;
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid palevioletred;
border-radius: 3px;
`;
const TomatoButton = styled(Button)`
color: tomato;
border-color: tomato;
`;
return(
<div>
<Button>Normal Button</Button>
<TomatoButton>Tomato Button</TomatoButton>
</div>
);
Global Styling
Thankfully, we have a bult-in function createGlobalStyle
in styled-components to apply global styles to our component.
We can use createGlobalStyle
to set same font-family, override default-browser styling, etc. (you got the point.)
// App.js
import React from 'react';
import styled, { createGlobalStyle } from 'styled-components';
import { Container, Nav, Content } from '../components';
const GlobalStyle = createGlobalStyle`
body {
margin: 0;
padding: 0;
background: teal;
font-family: Open-Sans, Helvetica, Sans-Serif;
}
`;
const App = () => {
return (
<>
<GlobalStyle />
<Container>
<Nav />
<Content />
</Container>
</>
)
}
export default App;
Note: Styles created with createGlobalStyle
do not accept any children
and that's it!
give yourself a pat on the back if you've made it till the end.
Conclusion
We covered the fundamentals & some basic concepts of styled-components & they are enough to get you rolling.
Now don't stop here use styled-components in your next project and see how it goes.
Don't forget to check out styled-components documentation.
Top comments (0)