Как добавить медиа-запрос к некомпонентной переменной в стилизованных компонентах?

Я работаю над проектом React JS, в котором я использую styled-components для стилизации веб-страниц.

Я использую в проекте компоненты reactstrap. Я стилизую компонент Button из reactstrap и пытаюсь добавить медиа-запрос.

Компонент ButtonX

import styled, {css} from 'styled-components';
import { Button } from 'reactstrap';
import media from '../media';


const orange = `
    background-color: #E4572E;
    border: 1px solid #E4572E;
    color: #fff;

    &:hover,
    &:focus {
        background-color: #e97857;
        border: 1px solid #e97857;
        color: #fff;
    }
`;

const inline = `
    position: absolute;
    top: 1rem;
    right: 1rem;
`;

const ButtonX = styled(Button)`
    padding: 0.5rem 1.5rem;
    font-weight: 500;
    font-size: 0.8rem;
    transition: all 0.4s linear;
    border-radius: 0.2rem;

    ${props => props.orange ? css`${orange}` : ''};
    ${props => props.inline ? css`${inline}`: ''}

    ${props => props.inline ? 
        (media.smalldevice`
            top: 4rem;
            right: 5rem;
        `)
        : ''}
`;

export {
    ButtonX
}

Я пишу компонент ButtonX вот так

<ButtonX orange = "true" inline = "true">Sign Up</ButtonX>

Так как в компоненте ButtonX я проверяю, установлен ли inline, затем добавляю код css, а также медиа-запрос для css.

${props => props.inline ? css`${inline}`: ''}

        ${props => props.inline ? 
            (media.smalldevice`
                top: 4rem;
                right: 5rem;
            `)
            : ''}

Я проверяю условие 2 раза, если inline истинно, затем добавляю css и медиа-запрос.

1) Вышеупомянутое работает, но я хочу добавить оба запроса в одном условии, которое не работает.

2) Кроме того, я хотел бы знать, как я могу написать этот медиа-запрос в переменной inline, указанной выше.

const inline = `
    position: absolute;
    top: 1rem;
    right: 1rem;

    ${
        media.smalldevice`
            top: 4rem;
            right: 5rem;
        `
    }

`;

Я попробовал второй, но он не работает, поскольку я уверен, что мы можем записать медиа-запрос в переменную.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
776
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавляя что-то вроде медиа-запроса в строку шаблона, вы интерполируете функцию. Они не могут работать внутри обычных шаблонных литералов, как вы предоставили inline.

styled-components предоставляет помощник под названием css, который можно использовать для интерполяции функций. В вашем случае это можно использовать:

import { css } from "styled-components";

const inline = css`
    position: absolute;
    top: 1rem;
    right: 1rem;

    ${media.smalldevice`
        top: 4rem;
        right: 5rem;
    `}
`;

Другие вопросы по теме