Всем привет!
Media Queries в styled components работают точно так же, как и в обычном CSS.
const CardWrapper = styled.div`
display: flex;
flex-direction: row;
@media (max-width: 768px) {
flex-direction: column;
}
`;Ниже рассмотрим небольшой пример.
Что мы сделаем?
Сделаем простую страницу, которая будет адаптироваться под размер экрана устройства.
Код можно посмотреть на Code Sandbox.

Как сделать страницу адаптивной используя styled components?
- Нужно определить брейкпоинты в JS объекте
- Определеить девайс для каждого брейкпоинта используя обычный media queries синтаксис
- Применить правила @media в styled components
#1 Определяем брейкпоинты и девайсы
Определим брейкпоинты:
const size = {
mobileS: '320px',
mobileM: '375px',
mobileL: '425px',
tablet: '768px',
laptop: '1024px',
laptopL: '1440px',
desktop: '2560px'
}Затем создадим правило media query для каждого девайса.
export const device = {
mobileS: `(min-width: ${size.mobileS})`,
mobileM: `(min-width: ${size.mobileM})`,
mobileL: `(min-width: ${size.mobileL})`,
tablet: `(min-width: ${size.tablet})`,
laptop: `(min-width: ${size.laptop})`,
laptopL: `(min-width: ${size.laptopL})`,
desktop: `(min-width: ${size.desktop})`,
desktopL: `(min-width: ${size.desktop})`
};#2 Сделаем компоненты адаптивными
Приложение имеет следующую корневую структуру:
const App = () => (
<Page>
<Hello name="CodeSandbox" />
<Card withPictureOf="cats" />
<Card withPictureOf="coffee" />
<Card withPictureOf="oranges" />
</Page>
);Чтобы компоненты стали адаптивными, нужно обновить:
- <Page> должен иметь максимальную ширину (width)
- <Card> должен отображать текст под картинкой на небольших экранах
Для <Page> мы можем легко добавить max-width в зависимости от девайса:
import styled from 'styled-components';
import { device } from './device';
const Page = styled.div`
margin: auto;
font-family: "sans-serif";
text-align: center;
@media ${device.laptop} {
max-width: 800px;
}
@media ${device.desktop} {
max-width: 1400px;
}
`;А для <Card> нужно обновить flex-direction:
import { device } from './device';
const CardWrapper = styled.div`
display: flex;
// Mobile friendly by default
flex-direction: column;
border: 1px solid gray;
box-shadow: 5px 5px #ccc;
padding: 10px;
margin: 10px;
// Switch to rows on large devices
@media ${device.laptop} {
flex-direction: row;
}
`;Вот и все!
Теперь страница корректно подстраивается под наш девайс.

Остались вопросы? Спрашивайте в комментариях!
Вольный перевод статьи.
Оригинал статьи: ссылка