43
Introduction to styled-components (CSS-in-JS) in React
For the purposes of this tutorial we’ll create a simple component with some text and buttons like the following:
Here’s how the markup for this component would be structured with traditional HTML:
<div class="welcome">
<h1>Hello World!</h1>
<p>
Accusantium enim placeat aperiam asperiores non earum. Sit rerum nihil
omnis in velit voluptatem. Vero amet exercitationem aut. Praesentium
sequi quisquam ducimus.
</p>
<p>
Impedit iste fuga architecto. Blanditiis maiores labore sint qui fuga
nemo id blanditiis. Iusto officia maxime consequatur est voluptatum
voluptatem aut.
</p>
<button type="button" class="btn btn-light">More Info</button>
<button type="button" class="btn btn-dark">Get Started</button>
</div>
And the CSS would look something like this:
.welcome {
margin: auto;
max-width: 480px;
}
h1 {
margin-top: 0;
font-size: 2.5em;
}
p {
line-height: 1.4em;
font-size: 1.2em;
}
.btn {
border: none;
border-radius: 3px;
color: white;
font-size: 1em;
font-weight: bold;
margin: 1em 1em 0 0;
padding: 0.75em 1em;
}
.btn-light {
background-color: blue;
}
.btn-dark {
background-color: darkblue;
}
Let’s now go through the process of converting this HTML and CSS into a styled-component.
The styled-components framework can be installed using either NPM or Yarn:
npm install styled-components
yarn add styled-components
Then imported into React as follows:
import styled from "styled-components";
First thing we need to do is convert the HTML markup into component based markup:
<Welcome>
<Heading>Hello World!</Heading>
<Paragraph>
Accusantium enim placeat aperiam asperiores non earum. Sit rerum nihil
omnis in velit voluptatem. Vero amet exercitationem aut. Praesentium
sequi quisquam ducimus.
</Paragraph>
<Paragraph>
Impedit iste fuga architecto. Blanditiis maiores labore sint qui fuga
nemo id blanditiis. Iusto officia maxime consequatur est voluptatum
voluptatem aut.
</Paragraph>
<Button light>More Info</Button>
<Button dark>Get Started</Button>
</Welcome>
styled-components utilises tagged template literals to style components. So in order to style our components we need to declare a variable that matches the component name and define what type of HTML element to render (div, h1, p, or button):
const Welcome = styled.div`
margin: auto;
max-width: 480px;
`;
const Heading = styled.h1`
margin-top: 0;
font-size: 2.5em;
`;
const Paragraph = styled.p`
line-height: 1.4em;
font-size: 1.2em;
`;
const Button = styled.button`
border: none;
border-radius: 3px;
color: white;
font-size: 1em;
font-weight: bold;
margin: 1em 1em 0 0;
padding: 0.75em 1em;
`;
You may have noticed the buttons have a light & dark property attached to them. You can pass a function to a styled component’s template literal to modify the styling based on the property provided. We’ll change the background color to be light or dark:
const Button = styled.button`
...
background-color: ${(props) => (props.light ? "blue" : "darkblue")};
`;
CSS-in-JS was one of those things I was reluctant to use at first but after spending some time working with styled-components it’s something I’ve grown to enjoy. If you’re interested in learning more about styled-components the full documentation can be found here.
43