Как создать тень в CSS: свойство box-shadow

box-shadow добавляет элементу тень: сдвиг по горизонтали и вертикали, размытие края (blur), рост или сжатие самой тени (spread) и цвет. По умолчанию тени нет вообще (значение none) - без явного box-shadow элемент выглядит плоским.

Попробуй прямо сейчас: увеличь blur-radius (третье число) до 30px - тень станет заметно более размытой и мягкой.

Как задать box-shadow: сдвиг, размытие (blur) и растяжение (spread)

Полный набор значений идёт в таком порядке: offset-x offset-y blur-radius spread-radius color. Обязательны только offset-x и offset-y (сдвиг тени по горизонтали и вертикали) - без них тень вообще не появится, даже если задан цвет. blur-radius (необязателен, по умолчанию 0) размывает край тени - чем больше значение, тем мягче и шире растушёвка. spread-radius (тоже необязателен, по умолчанию 0) работает независимо от blur - увеличивает или уменьшает саму тень со всех сторон, как будто у блока стала другая ширина и высота. У blur-radius отрицательные значения запрещены спецификацией и просто игнорируются браузером, а вот spread-radius, наоборот, МОЖЕТ быть отрицательным - тогда тень становится меньше самого блока.

box-shadow: 4px 4px 10px 0 black; - сдвиг 4px/4px, размытие 10px, растяжение не задано (0 по умолчанию).

box-shadow: 4px 4px -10px black;, пытаясь "убрать" размытие отрицательным числом - blur-radius не может быть отрицательным, всё правило целиком будет проигнорировано.

Кстати, если тень в коде написана правильно, но на странице её всё равно не видно - дело часто не в самом box-shadow, а в overflow родителя: тень технически выходит за пределы границ блока, а overflow, отличный от visible, обрезает её точно так же, как и любое другое содержимое, которое не помещается.

Как задать несколько теней одному элементу сразу

Можно перечислить несколько теней через запятую - каждая описывается своим набором значений. Тени накладываются друг на друга в том же порядке, что и слои background-image из урока про фоновые изображения: ПЕРВАЯ тень в списке оказывается СВЕРХУ, а каждая следующая рисуется под предыдущими. Это удобно для многослойных эффектов - например, тонкая контрастная обводка первой тенью и мягкое размытое свечение второй.

box-shadow: 0 2px 4px black, 0 8px 16px gray; - две тени: резкая близко к блоку и более размытая дальше, обе видны одновременно.

box-shadow: 0 2px 4px black 0 8px 16px gray; без запятой между тенями - браузер попытается разобрать это как одну невалидную тень и проигнорирует всё правило.

Как сделать внутреннюю тень: ключевое слово inset

Ключевое слово inset (пишется первым, перед всеми числами) переворачивает тень внутрь элемента - вместо тени снаружи по краям появляется тень изнутри, будто поверхность блока слегка вдавлена. Середина блока при этом остаётся чистой, а снаружи блока никакой тени с inset уже не будет вообще - весь эффект целиком уходит внутрь.

box-shadow: inset 0 0 10px black; - тень видна изнутри у краёв блока, снаружи блока тени нет совсем.

box-shadow: 0 0 10px black inset; - у большинства браузеров сработает и так (inset не обязан идти первым по факту реализации), но по спецификации его место - перед числами, для читаемости лучше писать именно так.

Из истории box-shadow - тот же случай, что и border-radius из прошлого урока: Firefox 3.5 реализовал тени через -moz-box-shadow ещё в июне 2009 года, когда сама спецификация CSS3 Backgrounds and Borders, по признанию самой Mozilla, "всё ещё находилась в разработке" - официальный черновик в статусе Candidate Recommendation появился только полгода спустя, в декабре 2009-го. Браузер снова обогнал стандарт, а не наоборот, как было с box-sizing.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Задают отрицательный blur-radius, пытаясь "убрать" размытие Значение невалидно, всё правило box-shadow игнорируется целиком Для чёткой тени без размытия использовать blur-radius: 0, а не отрицательное число
Путают blur-radius и spread-radius Ожидаемый результат (растушёвка или изменение размера) не совпадает с реальным Помнить: blur размывает край, spread меняет сам размер тени независимо от размытия
Не видят тень, хотя код правильный У родителя задан overflow, отличный от visible - тень выходит за пределы блока и обрезается Проверить overflow у родителя или увеличить его размеры/отступы
Забывают запятую между несколькими тенями Браузер не может разобрать значение, вся тень пропадает Разделять каждую тень запятой

Шпаргалка

Что нужноКак сделать
Простая тень со сдвигомbox-shadow: 4px 4px 8px black;
Без размытия, чёткий крайbox-shadow: 4px 4px 0 black;
Увеличить/уменьшить саму теньbox-shadow: 0 0 0 10px black; (или -10px)
Несколько теней сразуbox-shadow: тень1, тень2;
Тень внутрь элементаbox-shadow: inset 0 0 10px black;
Без тени (по умолчанию)box-shadow: none;

Коротко: отвечаем на вопросы

Почему box-shadow не виден, хотя код написан правильно?

Самая частая причина - overflow, отличный от visible (hidden, auto или scroll), заданный у родителя элемента. Тень технически выходит за пределы границ блока, и такой родитель просто обрезает её вместе с любым другим содержимым, которое не помещается.

Чем отличается blur-radius от spread-radius?

blur-radius размывает край тени - чем больше значение, тем мягче и шире растушёвка, но общий размер тени по факту тоже увеличивается за счёт этой растушёвки. spread-radius работает иначе и независимо: он увеличивает или уменьшает саму тень со всех сторон, как будто у исходного блока стала другая ширина и высота, при этом край остаётся таким же резким или размытым, каким его сделал blur.

Категория
css
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×