Что CSS грядущий нам готовит? Часть вторая: box-shadow

В первой части мы рассмотрели создание закруглённых углов с помощью свойства border-radius.

Сегодня мы рассмотрим свойство box-shadow, которое позволяет создавать тень вокруг блока.
Как и предыдущее свойство, его поддерживают далеко не все браузеры, но если вам нужен лишь декоративный эффект с минимальным использованием css, то box-shadow нет равных.
В данный момент box-shadow поддерживает Firefox (начиная с версии 3.5), Safari (начиная с версии 3.0), Opera (начиная с версии 10.50) и Chrome.
Даже Internet Explorer в какой-то мере поддерживает создание теней, начиная с версии 5.5. И, судя по виду, алгоритм построения тени не менялся с момента выпуска этой версии (IE 5.5 вышел почти 10 лет назад) – такой жуткой реализации я не встречала.

Примеры

Перейдем к примерам.
Самый простой вариант - тень без размытия. Только этот пример IE отображает так же, как все остальные браузеры.
.block  {
	box-shadow:#a3a3a3 8px 8px;
	-moz-box-shadow:#a3a3a3 8px 8px;
	-webkit-box-shadow:#a3a3a3 8px 8px;
	filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=8, OffY=8,Color='#a3a3a3', Positive='true')
}
Сначала передаём цвет тени, затем смещение относительно блока (8 пикселей вправо и 8 вниз) и радиус размытия тени (15 px).
.block  {
	box-shadow:#a3a3a3 8px 8px 15px;
	-moz-box-shadow:#a3a3a3 8px 8px 15px;
	-webkit-box-shadow:#a3a3a3 8px 8px 15px;
}
Показываем тень слева-сверху.
.block  {
	box-shadow:#a3a3a3 -8px -8px 15px;
	-moz-box-shadow:#a3a3a3 -8px -8px 15px;
	-webkit-box-shadow:#a3a3a3 -8px -8px 15px;
}
Равномерный контур тени по всему блоку.
.block  {
	box-shadow:#a3a3a3 0 0 15px;
	-moz-box-shadow:#a3a3a3 0 0 15px;
	-webkit-box-shadow:#a3a3a3 0 0 15px;
}
Тень внутри блока. Это свойство поддерживает только Firefox, Chrome и Opera 10.50.
.block  {
	box-shadow:inset #a3a3a3 0 0 15px;
	-moz-box-shadow:inset #a3a3a3 0 0 15px;
	-webkit-box-shadow:inset #a3a3a3 0 0 15px;
}
Последний параметр (5px) - расширение тени во все стороны. Это свойство поддерживают только вышеприведённые браузеры.
.block  {
	box-shadow:inset #a3a3a3 0 0 15px 5px;
	-moz-box-shadow:inset #a3a3a3 0 0 15px 5px;
	-webkit-box-shadow:inset #a3a3a3 0 0 15px 5px;
}
Отрицательное значение сужает тень, создавая интересный эффект.
.block  {
	box-shadow:#a3a3a3 0 0 40px -15px;
	-moz-box-shadow:#a3a3a3 0 0 40px -15px;
	-webkit-box-shadow:#a3a3a3 0 0 40px -15px;
}

Вот ещё пример того, что можно сделать, используя box-shadow.
Его увидят только те, кто использует Firefox, Chrome или Оперу 10.50:
Вам тоже показалось, что это результат применения фильтра Blur в Фотошопе?
.block {
	background-color:#1e97f0;
	box-shadow:inset #fff 0 0 10px 40px;
	-moz-box-shadow:inset #fff 0 0 10px 40px;
	-webkit-box-shadow:inset #fff 0 0 10px 40px;
}

Создаём градиенты

Кто сказал, что градиенты можно создавать только в Фотошопе?
.block  {
	background-color:#1e97f0;
	box-shadow:inset #f9fcff 0 190px 100px -100px,inset #095084 0 -190px 100px -100px;
	-moz-box-shadow:inset #f9fcff 0 190px 100px -100px,inset #095084 0 -190px 100px -100px;
	-webkit-box-shadow:inset #f9fcff 0 190px 100px -100px,inset #095084 0 -190px 100px -100px;
}
Здесь мы используем две тени – более светлую для верхней части и более тёмную для нижней.

Ещё один пример:
.block  {
	height:270px;
	box-shadow:inset #ff0404 0 50px 50px -30px,
		inset #ff9b04 0 150px 50px -80px,
		inset #fff904 0 250px 70px -130px,
		inset #05fe1e 0 320px 70px -180px,
		inset #04f2ff 0 450px 70px -230px,
		inset #0404ff 0 550px 70px -280px,
		inset #e604ff 0 650px 70px -330px;

	-moz-box-shadow:inset #ff0404 0 50px 50px -30px,
		inset #ff9b04 0 150px 50px -80px,
		inset #fff904 0 250px 70px -130px,
		inset #05fe1e 0 320px 70px -180px,
		inset #04f2ff 0 450px 70px -230px,
		inset #0404ff 0 550px 70px -280px,
		inset #e604ff 0 650px 70px -330px;

	-webkit-shadow:inset #ff0404 0 50px 50px -30px,
		inset #ff9b04 0 150px 50px -80px,
		inset #fff904 0 250px 70px -130px,
		inset #05fe1e 0 320px 70px -180px,
		inset #04f2ff 0 450px 70px -230px,
		inset #0404ff 0 550px 70px -280px,
		inset #e604ff 0 650px 70px -330px;
}
Лучше не спрашивайте, как это сделано :)

Приведённые выше примеры не работают в Safari, IE и Опере версии ниже 10.50.

Итог

Уже сейчас возможности box-shadow впечатляют.
Осталось лишь дождаться времени, когда все браузеры будут поддерживать его в полной мере.

P. S. Пока искала информацию по box-shadow, нашла свойство, предназначенное именно для создания градиентов - gradient. Его мы и рассмотрим в следующей статье.

Если кому-то вдруг стало интересно, как IE решил проблему отображения теней - зайдите на эту страницу и поиграйте с настройками. Разумеется, заходить нужно с IE.


Комментарии

11 апреля 2010, 21:27 (Ответить)
спасибо за статью использовал.
30 апреля 2010, 21:13 (Ответить)
Большое спасибо! Давно искал как сделать градиент. Спасибо!!!!!!!!
1 мая 2010, 9:52 (Ответить)
SADR, пожалуйста, но градиент всё-таки лучше создавать с помощью свойства gradient. Его поддерживают большее количество браузеров и у него куда больше возможностей.
17 мая 2010, 14:52 (Ответить)
recens, недавно пришлось писать для заказчика сайт, где решил попробовать для блочных теней использовать CSS. На счёт IE вопросов нет. А вот, что очень удивительно - в Safari 4 возникли проблемы. При том в Chrome их нет, хотя движок у них один. Либо Safari вообще не отображает тень (при том, что все остальные показывают её как надо), либо отображает очень узко (например при использовании ширины 5px выдаёт как 2 или 1 только). В чём может быть проблема?
17 мая 2010, 17:04 (Ответить)
simply, а можно конкретные примеры, в которых тень не отображается или отображается узко?
17 мая 2010, 17:20 (Ответить)
-moz-box-shadow: #000000 0px -2px 5px 5px; FF прекрасно понимает о чём идёт речь. и очень широко растягивает "расплывчатость" -webkit-box-shadow: #000000 0px -2px 5px 5px; Chrome тоже правильно справляется. А вот яблочники вообще оставили меня без тени блока. Это может быть как-то связано с 4ым параметром?
17 мая 2010, 20:37 (Ответить)
Расширение тени (или 4-тый параметр) так же как и параметр inset поддерживает только Firefox, Chrome и Opera версии выше 10.50, поэтому в эппловском браузере тень при всём вашем желании не будет отображаться.
Хотя довольно странно, что на одном движке свойство поддерживается по-разному.
22 мая 2010, 13:02 (Ответить)
вот спасибо дорогая. какая вы умница). только вот я не могу всё понять? почему всем окнам не сделать для себя единый-универсальный компилятор css-html?
22 мая 2010, 22:17 (Ответить)
Чтобы не лишать верстальщиков работы, наверно.
А если серьёзно, то пока CSS 3 не будет введён как официальный стандарт, то и будут существовать все эти -moz, -webkit, -o, -ms и прочие, и придётся писать для Сафари с Хромом border-top-left-radius, а для Firefox - border-radius-topleft.
А когда он будет введён - неизвестно.
Вот и корячимся с версией на CSS3, с версией для остальных браузеров, и отдельным пунктом - с костылём для IE.
4 сентября 2010, 4:03 (Ответить)
А может забить пока на это и делать постаринке? тоесть картинками. кроссбраузерно зато.
4 сентября 2010, 21:49 (Ответить)
Можно, конечно, тут каждый решает сам.
Я, например, делаю иногда картинками, иногда с помощью костылей - всё зависит от сложности вёрстки.
1 октября 2010, 13:56 (Ответить)
Занятная статейка, данке :)
1 октября 2010, 14:03 (Ответить)
Спасибо :)
16 марта 2011, 19:46 (Ответить)
IE9 RC понимает все примеры без костылей.
13 сентября 2011, 19:52 (Ответить)
Очень интересная статья, мне нравится как вы пишите, но в браузер mozila всё равно это свойство не идёт!!!
13 сентября 2011, 21:35 (Ответить)
Дмитрий, для Mozilla используйте свойство -moz-box-shadow вместо box-shadow.
14 сентября 2011, 15:51 (Ответить)
Да, я знаю, извиняюсь за ложную тревогу, всё получилось, отличная статья!!! СПАСИБО!
20 ноября 2011, 18:42 (Ответить)
Отлично:) Понравился радужный градиент:)

Добавить комментарий