Блог

2025 / piscodev / Игорь Быстрицкий

обложка статьи
Блог

Grid Template Areas вместо Position Absolute в CSS

Используем CSS Grid, чтобы свалить несколько элементов в одну кучу, заставляя их накладываться друг на друга, а затем располагаем их в нужных позициях. Небольшой гайд по CSS Grid.

    • TailwindCSS
  • Нормально

  • 20 июня 2024
  • Игорь Быстрицкий

ЗадачаPosition Absolute (традиционный подход)Grid Template Areas StackПочему Grid Template Areas Stack лучше Position Absolute?ЗаключениеДемо
Если понравилась статья, поделитесь с друзьями

Tailwind / Больше статей

Как писать стили для скроллбара в CSS

Как писать стили для скроллбара в CSS

Пишем стили для скроллбара (полоски прокрутки) на странице с помощью Webkit. Также покажу несколько более менее готовых вариантов в конце. Подробный гайд с фотографиями и ссылками на песочницу.

20 июня 2024
Приятные шрифт от Vercel - Geist Sans и Geist Mono

Приятные шрифт от Vercel - Geist Sans и Geist Mono

"Geist действительно олицетворяет дух программирования и дизайна в творческом сообществе Vercel" - заявляют в Vercel.

20 июня 2024
Шрифты в Next и Tailwind

Шрифты в Next и Tailwind

Расскажу о любимом способе использовать шрифты на проектах с Next и Tailwind

30 мая 2024
Tailwind - лучший CSS инструмент?

Tailwind - лучший CSS инструмент?

Писать стили в 5 раз быстрее, не покидая файл с разметкой? Используй utility first классы Tailwind и экономь свое время.

29 октября 2023

Задача

Нужно создать кнопку с текстом по центру а также добавить иконку (слева или справа), которая не будет сдвигать текст из-за своего присутствия.

Для упрощения вместо иконки буду использовать эмодзи 🎁. Если вам нужны качественные паки иконок, то вам на сайт Icones.

Мы используем следующую разметку...

HTML

<button>
	<span>🎁</span>
	Открыть
</button>

И хотим, чтобы результат был таким:

Желаемый результат (иконка слева не сдвигает текст посередине)
Желаемый результат (иконка слева не сдвигает текст посередине)

Position Absolute (традиционный подход)

Если с текстом по центру все понятно, ведь это неотъемлемая часть кнопки и его можно отцентрировать через стиль самой кнопки...

HTML

<button class="text-center">
	<span>🎁</span>
	Открыть
</button>

..., то с 🎁 сложнее. Помимо того, что 🎁 должен существовать внутри кнопки, он также не должен влиять на позиционирование ее текста. Для решения этой задачи существует следующий традиционный подход:

  1. Сделать кнопку relative контейнером.
  2. Желаемому элементу добавить absolute позицию.
  3. Наконец, сдвинуть элемент в нужное место с помощью свойств top и left, а также translate-x и translate-y.

Выглядеть это будет следующим образом:

HTML

<button class="relative text-center">
	<span class="absolute left-4 top-1/2 -translate-y-1/2">🎁</span>
	Открыть
</button>
Класс top-1/2 двигает элемент вниз, а -translate-y-1/2 пододвигает его вверх и тем самым центрирует.

Так мы получаем желаемый результат:

Результат просто поражает...
Результат просто поражает...

Но можно проще.

Grid Template Areas Stack

Это свойство, которое по своей сути создает 1x1 сетку и помещает все элементы в одну кучу, в которой они накладываются друг на друга и существуют независимо.

В первую очередь, необходимо сделать и текст кнопки и 🎁 самостоятельными элементами:

HTML

<button>
	<span>🎁</span>
	<span>Открыть</span>
</button>

Далее необходимо дать кнопке класс grid а также для свойства grid-template-areas необходимо указать 'stack'. Так как grid-template-areas является нестандартным для Tailwind классом, его можно добавить как произвольное свойство:

HTML

<button class="grid [grid-template-areas:'stack']">
	<span>🎁</span>
	<span>Открыть</span>
</button>
Обратите внимание, что значение 'stack' должно быть в кавычках. Я сам об этом часто забываю.

И так как элементы внутри кнопки теперь самостоятельные, мы можем дать им класс [grid-area:stack], который поместит их в ту самую единственную клетку:

HTML

<button class="grid [grid-template-areas:'stack']">
	<span class="[grid-area:stack]">🎁</span>
	<span class="[grid-area:stack]">Открыть</span>
</button>

Теперь разукрасим кнопку...

HTML

<button class="grid h-10 w-full rounded-md bg-gradient-to-r from-amber-400 to-orange-500 px-4 font-medium text-white shadow-xl shadow-orange-500/50 [grid-template-areas:'stack']">
	<span class="[grid-area:stack]">🎁</span>
	<span class="[grid-area:stack]">Открыть</span>
</button>

...и посмотрим что получилось:

Почти то, что нужно...
Почти то, что нужно...

Дело за малым. Каждому из элементов нужно объяснить, где они должны находиться. Так как это grid элементы, то нужно использовать соответствующие классы self-{...}, justify-self-{...} и даже place-self-{...}:

HTML

<button class="grid h-10 w-full rounded-md bg-gradient-to-r from-amber-400 to-orange-500 px-4 font-medium text-white shadow-xl shadow-orange-500/50 [grid-template-areas:'stack']">
	<span class="self-center justify-self-start [grid-area:stack]">🎁</span>
	<span class="self-center [grid-area:stack]">Открыть</span>
</button>
Желаемый результат достигнут
Желаемый результат достигнут

Готово!

Время пройти тест

Проверьте свои знания по текущей теме

В чем особенность Grid Template Areas Stack?

Почему Grid Template Areas Stack лучше Position Absolute?

  • Этот подход позволяет не применять свойство translate к элементу, когда нам нужно отцентрировать элемент (а это почти всегда). Если мы захотим использовать translate для анимации в будущем, то оно будет свободно и анимания не сломает позицию элемента.
  • Банально этот синтаксис может показаться вам более приятным и понятным.

Заключение

Grid Template Areas Stack это еще один способ убрать элемент из "общей раскладки" и указать ему индивидуальную позицию. Этот занятный способ можно использовать как альтернативу Position Absolute.

Демо

Посмотрите на сегодняшнюю подопытную кнопку своими глазами на Tailwind Play, добавьте в нее новый элемент, опробуйте Grid Template Areas Stack, пока прочитанное в свежей памяти.