Урок 07. Теория: чем отделять элементы

📁 Раздел: Базовые утилиты ⏱️ Время изучения: ~45 мин 🎯 Сложность: Начальная

⚡ Кратко

Рамка задаётся двумя классами: border (толщина 1px) и цвет. Тень отвечает за «высоту» элемента над поверхностью: чем важнее и «выше» элемент, тем крупнее тень. Кольцо (ring) рисуется тенью и не влияет на раскладку, outline — настоящий контур браузера и предпочтителен для фокуса.

Рамка: толщина и цвет — разные классы

В Tailwind рамка разбита на составляющие. Класс border задаёт только толщину; без цвета браузер возьмёт currentColor, и рамка окажется цвета текста — обычно не то, чего вы хотели.

border без цвета
border + border-slate-200
<div class="flex flex-wrap gap-4">
  <div class="rounded-lg border p-4 text-sm text-rose-600">border без цвета</div>
  <div class="rounded-lg border border-slate-200 p-4 text-sm text-rose-600">border + border-slate-200</div>
</div>

Толщина: border (1px), border-2, border-4, border-8. Стороны: border-t, border-b, border-x, border-y, логические border-s и border-e. Стиль: border-solid (по умолчанию), border-dashed, border-dotted.

divide: линии между детьми

Когда нужно разделить элементы списка, не нужно вешать рамку на каждый и отменять её у последнего. Класс divide-y у родителя ставит границу между соседями:

  • Первая строка
  • Вторая строка
  • Третья строка
<ul class="max-w-sm divide-y divide-slate-200 rounded-lg border border-slate-200">
  <li class="px-4 py-2 text-sm text-slate-700">Первая строка</li>
  <li class="px-4 py-2 text-sm text-slate-700">Вторая строка</li>
  <li class="px-4 py-2 text-sm text-slate-700">Третья строка</li>
</ul>

Рамка, тень и кольцо решают одну задачу разными средствами — «отделить». Рамка похожа на контур на чертеже: строгая, занимает место. Тень — на свет от лампы: показывает, что предмет лежит выше. Кольцо — на подсветку выделенного объекта: временно, поверх всего, ничего не сдвигает.

Скругления

Шкала радиусов: rounded-sm, rounded-md, rounded-lg, rounded-xl, rounded-2xl, rounded-3xl, rounded-4xl и крайние значения rounded-none и rounded-full.

none
sm
lg
2xl
full
<div class="flex flex-wrap items-end gap-3 text-center text-xs text-slate-600">
  <div><div class="size-14 rounded-none bg-slate-300"></div>none</div>
  <div><div class="size-14 rounded-sm bg-slate-300"></div>sm</div>
  <div><div class="size-14 rounded-lg bg-slate-300"></div>lg</div>
  <div><div class="size-14 rounded-2xl bg-slate-300"></div>2xl</div>
  <div><div class="size-14 rounded-full bg-slate-300"></div>full</div>
</div>

Скругление можно задать по сторонам и углам: rounded-t-lg, rounded-bl-xl. Правило вкуса: у вложенного элемента радиус должен быть меньше, чем у родителя, иначе углы выглядят неаккуратно.

Тени: шкала «высоты»

Тень в интерфейсе — это метафора расстояния до поверхности. Чем выше элемент «парит», тем он важнее и тем крупнее тень.

shadow-xs
shadow-sm
shadow-md
shadow-lg
shadow-xl
<div class="flex flex-wrap gap-4">
  <div class="rounded-lg bg-white p-4 text-xs text-slate-600 shadow-xs">shadow-xs</div>
  <div class="rounded-lg bg-white p-4 text-xs text-slate-600 shadow-sm">shadow-sm</div>
  <div class="rounded-lg bg-white p-4 text-xs text-slate-600 shadow-md">shadow-md</div>
  <div class="rounded-lg bg-white p-4 text-xs text-slate-600 shadow-lg">shadow-lg</div>
  <div class="rounded-lg bg-white p-4 text-xs text-slate-600 shadow-xl">shadow-xl</div>
</div>
ТеньСмыслПример
shadow-xs, shadow-smлежит на поверхностикарточка в списке
shadow-mdслегка приподняткарточка при наведении
shadow-lg, shadow-xlвсплывающий слойменю, поповер
shadow-2xlмодальное окнодиалог поверх страницы
shadow-noneплосковнутри уже приподнятого блока

Есть и специальные: inset-shadow-sm — внутренняя тень (эффект «вдавленности»), text-shadow-sm — тень текста поверх картинки.

ring и outline: чем отличаются

Оба рисуют контур вокруг элемента, но по-разному:

ringoutline
Как реализованочерез box-shadowнастоящий outline
Влияет на раскладкунетнет
Повторяет скруглениедада
Совместимость с теньюделит box-shadow с shadow-*независим
Рекомендацияподсветка, выделениесостояние фокуса
<div class="flex flex-wrap gap-4">
  <button class="rounded-md bg-white px-4 py-2 text-sm text-slate-700 ring-2 ring-sky-500">ring-2 ring-sky-500</button>
  <button class="rounded-md bg-white px-4 py-2 text-sm text-slate-700 outline-2 outline-offset-2 outline-sky-500">outline-2 outline-offset-2</button>
</div>
Никогда не убирайте фокус совсем. outline-none без замены делает интерфейс непроходимым с клавиатуры. Если стандартный контур не нравится — замените его своим: focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sky-600.

Из чего собирается карточка

Соберём всё вместе. Обратите внимание: рамка или тень — обычно достаточно чего-то одного, вместе они спорят.

На рамке

Строгий, «плоский» стиль. Хорош для плотных интерфейсов.

На тени

Мягкий, «объёмный» стиль. Хорош для витрин и лендингов.

<div class="grid gap-4 sm:grid-cols-2">
  <div class="rounded-xl border border-slate-200 bg-white p-5">
    <h3 class="text-sm font-semibold text-slate-900">На рамке</h3>
    <p class="mt-1 text-sm text-slate-600">Строгий, «плоский» стиль. Хорош для плотных интерфейсов.</p>
  </div>
  <div class="rounded-xl bg-white p-5 shadow-md">
    <h3 class="text-sm font-semibold text-slate-900">На тени</h3>
    <p class="mt-1 text-sm text-slate-600">Мягкий, «объёмный» стиль. Хорош для витрин и лендингов.</p>
  </div>
</div>