Как работает 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?
Да, через запятую. Первая тень рисуется сверху. Сочетание маленькой четкой тени с большой мягкой выглядит естественнее одной большой тени.