Menu

Тень box-shadow в CSS: синтаксис, spread, inset и примеры

box-shadow рисует тени вокруг блока элемента. Разберем пять значений (x, y, размытие, spread, цвет), внутренние тени inset, наложение нескольких теней для реалистичной глубины, кольца фокуса через spread и ошибки, от которых тени выглядят грязно.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Как работает box-shadow

box-shadow рисует тень вокруг блока элемента по внешнему краю рамки. Она следует border-radius, не занимает места в раскладке и требует минимум двух значений: насколько сместить ее по горизонтали и по вертикали.

Синтаксис

box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
ЗначениеСмыслПо умолчанию
insetРисовать тень внутри блока, как вдавленную областьСнаружи
offset-xПоложительное сдвигает вправо, отрицательное влевоОбязательно
offset-yПоложительное сдвигает вниз, отрицательное вверхОбязательно
blurНасколько мягкий край; не может быть отрицательным0 (четкий край)
spreadУвеличивает (положительное) или уменьшает (отрицательное) тень0
colorЛюбой цвет; обычно лучше всего смотрится полупрозрачный черныйЦвет текста

Количество длин определяет их смысл: две это смещения, три добавляют размытие, четыре добавляют spread. Попробуйте:

Попробуйте 0 0 0 4px #f59e0b (кольцо), inset 0 0 12px #2563eb и -8px -8px 0 #16a34a.

Spread: кольца и тени с одной стороны

Spread меняет размер тени до размытия. Из этого получаются два приема:

  • Кольцо: без смещения, без размытия, только spread. В отличие от рамки, оно не меняет размер элемента, поэтому это хороший индикатор фокуса (:focus-visible { box-shadow: 0 0 0 3px #2563eb; }).
  • Кольцо с зазором: положите белый spread под цветной, более широкий.
  • Только с одной стороны: сместите тень вниз и уменьшите ее отрицательным spread, чтобы она выглядывала только снизу.

Многослойные тени для реалистичной глубины

У настоящих теней есть темная четкая часть рядом с объектом и мягкая бледная часть подальше. Два-три слоя имитируют это гораздо лучше, чем одно большое размытие:

Первая тень в списке рисуется сверху. Делайте цвет теней полупрозрачным черным или темным оттенком фона, но не чистым серым, чтобы они затемняли то, что под ними.

Внутренние тени inset

inset рисует тень внутри области padding, как будто поверхность вдавлена. Это подходит для текстовых полей, углублений и нажатых кнопок:

input {
  box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
  box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}

Внутренняя тень рисуется над фоном, но под содержимым. Тени, которые повторяют форму букв, а не блока, это тень текста text-shadow.

Частые ошибки

  • Чисто черные, полностью непрозрачные тени. Они выглядят как темная обводка. Используйте альфу от 10% до 30%.
  • Одно огромное размытие для глубины. Сочетайте маленькую четкую тень с большой мягкой.
  • Тень обрезана по краю. Ее обрезает предок с overflow: hidden; добавьте предку padding или перенесите правило overflow.
  • Отрицательное размытие. Оно невалидно, и все объявление игнорируется.
  • Анимация box-shadow на многих элементах. Она перерисовывается каждый кадр. На тяжелых страницах лучше анимировать opacity псевдоэлемента, который несет большую тень.

Часто задаваемые вопросы

Какой синтаксис у box-shadow?

box-shadow: offset-x offset-y blur spread color;, например box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. Обязательны только два смещения; добавьте inset, чтобы тень рисовалась внутри блока.

Что делает spread в box-shadow?

Увеличивает (положительное значение) или уменьшает (отрицательное) тень до размытия. Тень без смещения, без размытия и со spread 3px это сплошное кольцо толщиной 3px вокруг элемента.

Как сделать тень только снизу?

Сместите ее вниз и втяните отрицательным spread, чтобы исчезли бока: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.

Влияет ли box-shadow на раскладку?

Нет. Тень не занимает места и не сдвигает другие элементы, поэтому это хороший способ добавить кольцо фокуса или приподнятость при наведении без сдвига раскладки. Ее может обрезать overflow: hidden у предка.

Можно ли задать несколько теней box-shadow?

Да, через запятую. Первая тень рисуется сверху. Сочетание маленькой четкой тени с большой мягкой выглядит естественнее одной большой тени.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ