Я пытаюсь создать отзывчивый реквизит для стилизованных компонентов следующим образом. Для начала у нас есть компонент (скажем, кнопка):
<Button primary large>Click Me</Button>
Эта кнопка получит цвет фона основного и большого размера (как определено в файле темы).
Теперь я хочу создать адаптивную версию этой кнопки. Вот как я бы хотел, чтобы это работало:
<Button
primary
large
mobile={{size: 'small', style: 'secondary'}}
tablet={size: 'small'}}
widescreen={{style: 'accent'}}
>
Click Me
</Button>
Теперь у меня есть та же кнопка, но с разными стилями и размерами для разных размеров экрана.
Теперь я получил этоработать - но это включает в себя много дублирующегося кода. Вот пример того, как это выглядит:
const Button = styled('button')(
({
mobile,
tablet,
tabletOnly,
desktop,
widescreen
}) => css`
${mobile &&
css`
@media screen and (max-width: ${theme.breakpoints.mobile.max}) {
background-color: ${colors[mobile.style] || mobile.style};
border: ${colors[mobile.style] || mobile.style};
border-radius: ${radii[mobile.radius] || mobile.radius};
color: ${mobile.style && rc(colors[mobile.style] || mobile.style)};
}
`}
${tablet &&
css`
@media screen and (min-width: ${theme.breakpoints.tablet.min}), print {
background-color: ${colors[tablet.style] || tablet.style};
border: ${colors[tablet.style] || tablet.style};
border-radius: ${radii[tablet.radius] || tablet.radius};
color: ${tablet.style && rc(colors[tablet.style] || tablet.style)};
}
`}
${tabletOnly &&
css`
@media screen and (min-width: ${theme.breakpoints.mobile.min}) and (max-width: ${theme.breakpoints.tablet.max}) {
background-color: ${colors[tabletOnly.style] || tabletOnly.style};
border: ${colors[tabletOnly.style] || tabletOnly.style};
border-radius: ${radii[tabletOnly.radius] || tabletOnly.radius};
color: ${tabletOnly.style &&
rc(colors[tabletOnly.style] || tabletOnly.style)};
}
`}
`
Я ищу способ упростить этот код. По сути, я хочу написать CSS-стили ОДИН РАЗ, а затем сгенерировать различные реквизиты и медиа-запросы на основе объекта запроса, который выглядит примерно так:
const mediaQueries = {
mobile: {
min: '0px',
max: '768px'
},
tablet: {
print: true,
min: '769px',
max: '1023px'
},
desktop: {
min: '1024px',
max: '1215px'
},
widescreen: {
min: '1216px',
max: '1407px'
},
fullhd: {
min: '1408px',
max: null
}
}
Я думаю, что я смогу создать функциюон проходит через объект mediaQueries
и вставляет соответствующий css для каждой итерации. Однако я не могу понять, как это сделать.
Есть идеи, как это сделать?
Кроме того, заранее спасибо за любую помощь, которую вы можете предложить.