Responsive styling using styled components
Posted
Updated
Europe’s developer-focused job platform
Let companies apply to you
Developer-focused, salary and tech stack upfront.
Just one profile, no job applications!
Styled components are visual primitives to style your React App and have plenty of great features, like the ability to write CSS right in the component, complexity reduction, faster loading, clear scope and other performance improvements.
This article is about how to use media queries in styled-components.
💰 The Pragmatic Programmer: journey to mastery. 💰 One of the best books in software development, sold over 200,000 times.
Quick refresher on media queries from MDN:
Media queries are useful when you want to modify your site or app depending on a device's general type (such as print vs. screen) or specific characteristics and parameters (such as screen resolution or browser viewport width).
A media query syntax looks something like this @media screen and (max-width: 768px) { SOME CONDITIONAL STYLING }
.
I have some good news for you: Media queries with styled components just work the same as in good old CSS.
There are no code changes, adaptions or helper classes needed when writing media queries in styled components, though some best-practices should be considered.
When writing media queries in styled-components I follow these three steps, and I can only recommend this approach.
The first step should be a definition of the supported screen sizes in your application. As the needs in applications are different, a good starting point are the standard breakpoints in Google Chrome Dev Tools. Add or subtract breakpoints as for your specific need.
Let's create an object which holds the sizes.
const sizes = {
mobileS: '320px',
mobileM: '375px',
mobileL: '425px',
tablet: '768px',
laptop: '1024px',
laptopL: '1440px',
desktop: '2560px',
};
Based on the sizes we can create a media query for each supported device. We can improve readability of the code, when using ES6 template strings.
export const devices = {
mobileS: `(min-width: ${sizes.mobileS})`,
mobileM: `(min-width: ${sizes.mobileM})`,
mobileL: `(min-width: ${sizes.mobileL})`,
tablet: `(min-width: ${sizes.tablet})`,
laptop: `(min-width: ${sizes.laptop})`,
laptopL: `(min-width: ${sizes.laptopL})`,
desktop: `(min-width: ${sizes.desktop})`,
};
To apply the media query in a styled component just add it to the styling. Let's consider the following application.
const App = () => (
<ProfilePage>
<Card>
<ProfileImg />
<ProfileText />
</Card>
</ProfilePage>
);
This is a pseudo-code of a profile page. The page should be responsive.
The ProfilePage
should have a different maximum width on laptop and desktop,
and the Card
should have the ProfileText
below the ProfileImage
on small devices.
import styled from 'styled-components';
import { device } from './device';
const ProfilePage = styled.div`
margin: auto;
text-align: center;
@media ${device.laptop} {
max-width: 800px;
}
@media ${device.desktop} {
max-width: 1400px;
}
`;
For moving the text under the image in the Card
component, flex-direction
can be of help.
When developing a web application starting with the smallest supported screen is always helpful.
const Card = styled.div`
display: flex;
flex-direction: column;
margin: 0.5rem;
@media ${device.laptop} {
flex-direction: row;
}
`;
YaY, 🥳🥳🥳. That's it. Requirements fulfilled.
Thanks for reading and if you have any questions, use the comment function or send me a message @mariokandut. If you want to know more about React, have a look at these React Tutorials.
References (and Big thanks):
Never miss an article.