Как применить медиазапросы в пользовательском CSS, используя Tailwind 4?

В предыдущей версии существовала директива <code>@screen</code>, которая позволяла легко задавать стили, например, так: <br/> <br/> <pre><code>@screen(xl) {
  стили
}</code></pre> <br/> <br/> В актуальной версии данной директивы больше нет. <br/> <br/> У меня возникла проблема: <br/> <br/> Предположим, есть блок, в котором нужно изменить размеры нескольких элементов. При традиционном подходе я бы создал переменные и изменял их в медиазапросах, как показано ниже: <br/> <br/> <pre><code>.block {
  --width1: 1em;
  --width2: 2em;

  .block-inner1 {
    width: var(--width1);
  }
  .block-inner2 {
    width: var(--width2);
  }

  @screen(xl) {
    --width1: 3em;
    --width2: 5em;
  }
}</code></pre> <br/> <br/> Однако в текущей версии я могу использовать только такой подход: <br/> <pre><code>.block {
  --width1-sm: 1em;
  --width2-sm: 2em;

  --width1-xl: 3em;
  --width2-xl: 5em;

  .block-inner1 {
    @apply
    w-[--width1-sm]
    xl:w-[--width1-xl]
    ;
  }
  .block-inner2 {
    @apply
    w-[--width2-sm]
    xl:w-[--width2-xl]
    ;
  }
}</code></pre> <br/> Либо использовать глобальные переменные с директивой <code>@theme</code> для создания утилитарных классов через <code>@utility</code>, что также приводит к обширному коду. <br/> <br/> Безусловно, существует возможность писать обычные медиазапросы с указанием конкретных значений: <br/> <br/> <code>@media (width &gt; 768px) { --width1: 3em; }</code> <br/> <br/> Однако в этом случае возникает неудобство с использованием значений для точек переключения вместо более удобных мнемоник (sm, xl и т. д.). <br/> <br/> <b>Могу ли я узнать возможные способы использования медиазапросов в своем CSS-коде, или, возможно, есть вариант изменения значений непосредственно для CSS-переменных?</b> <br/> Например, тип такого подхода: <br/> <br/> <pre><code>.block {
  --width: 1em;
  @apply xl:--width-[4em];
}</code></pre>
  • 9 апреля 2025 г. 4:55
Ответы на вопрос 2
В Tailwind CSS версии 4 действительно произошли изменения, касающиеся работы с медиазапросами и пользовательскими CSS-переменными. К сожалению, директива `@screen`, как вы заметили, больше не поддерживается для использования в пользовательских стилях напрямую. Однако есть несколько способов решить вашу задачу, хотя они могут потребовать немного другого подхода.

1. **Использование медиазапросов с классами Tailwind**: Вместо применения переменных в медиазапросах, вы можете использовать утилитарные классы Tailwind для установки ширины. Например:

   ```css
   .block-inner1 {
     @apply w-[1em] lg:w-[3em];
   }
   .block-inner2 {
     @apply w-[2em] lg:w-[5em];
   }
   ```

   Это позволяет вам управлять изменениями размеры в зависимости от точек прерывания без использования переменных.

2. **Создание пользовательских классов с помощью `@apply`**: Если вам нужно изменить несколько свойств для различных точек прерывания, вы можете создать свои классы с помощью `@apply` и Mediquery:

   ```css
   @media (min-width: 768px) {
     .block-inner1 {
       width: 3em;
     }
     .block-inner2 {
       width: 5em;
     }
   }

   .block-inner1 {
     width: 1em;
   }
   .block-inner2 {
     width: 2em;
   }
   ```

   Это простое решение, которое будет работать для обычных случаев.

3. **Именованные CSS-переменные**: Вы можете создать CSS-переменные для ширины и использовать медиазапросы традиционным способом:

   ```css
   .block {
     --width1: 1em;
     --width2: 2em;

     .block-inner1 {
       width: var(--width1);
     }

     .block-inner2 {
       width: var(--width2);
     }
   }

   @media (min-width: 1024px) {
     .block {
       --width1: 3em;
       --width2: 5em;
     }
   }
   ```

   Это позволяет вам легко изменять значения переменных по мере необходимости.

4. **Глобальные CSS-переменные в `@theme`**: Если вы хотите использовать импортируемые значения, вы можете создать глобальные CSS-переменные через `@theme`, как вы упомянули. Это подходит для создания утилитарных классов.

На данный момент использование переменных непосредственно в `@apply` с Tailwind не поддерживается, так как они привязаны к процессу компиляции стилей Tailwind. Но вышеуказанные методы позволяют гибко управлять стилями и адаптировать их под различные размеры экранов.
кажется, можно сделать примерно так: 
https://play.tailwindcss.com/RTZm0EbTI9
Похожие вопросы