boxShadow - jQuery плагин для реализации box-shadow в IE

В комментариях к этой статье меня попросили написать плагин для jQuery, который бы делал возможным использование CSS3 свойства box-shadow в IE. Идея показалась мне интересной, к тому же для одного из моих проектов был нужен подобный функционал.
Этот плагин похож на плагин textShadow - разница лишь в том, что в textShadow подложкой является текст, а в boxShadow для эффекта тени используется блок, размытый средствами IE.
К слову, в Internet Explorer есть фильтр, который создаёт тень от блока, но она выглядит слишком жёсткой и может быть направлена только в одну сторону, что нас совершенно не устраивает.
Итак, перейдём к плагину.
Так происходит вызов плагина:
	$('.block').boxShadow('10px 10px #191919'); // без размытия тени	
	$('.block').boxShadow('10px 10px 15px #191919'); // с размытием
Параметры идут в следующем порядке – сдвиг по горизонтали, сдвиг по вертикали, размытие (опционально), цвет тени.

Код плагина

$.fn.boxShadow = function(o){
	if (!o) return; // если нет параметра - выходим
	var str = o.split(' '), // делим введенную строку
	x = parseInt(str[0]), // получаем отступ сверху
	y = parseInt(str[1]), // и снизу
	blur = 0, // значения по умолчанию
	color = '';
	if (str.length == 3) { // если было передано 3 параметра
		color = str[2]; // третьим параметром будет цвет
	} else { // иначе
		blur = parseInt(str[2]); // третьим параметром будет размытие 
		color = str[3]; // а четвёртым цвет
	}
	return $(this).each(function(){ // для каждого элемента
	    	var box = $(this), // находим блок, с которым будем работать
	    	off = box.offset(); // вычисляем его координаты
	    	box.css({position:'relative',zIndex:1}) // задаём свойства
                .after('<div></div>') // вставляем блок, который будет исполнять роль тени
		.next() // находим его
		.css({ // добавляем ему следующие свойства
			width:box.width() + parseInt(box.css('padding-left')) + parseInt(box.css('padding-right')), // устанавливаем ширину
			height:box.height() + parseInt(box.css('padding-bottom')) + parseInt(box.css('padding-top')), // устанавливаем длину
			position:'absolute', // абсолюное позиционирование
			zIndex:0, // прячем под основной слой
			backgroundColor:color, // устанавливаем цвет тени
			left:off.left + x - blur + 'px', // сдвиг слева
			top:off.top + y - blur + 'px'}); // сдвиг сверху
		if (blur) box.next() // если есть размытие, находим тень
			.css('filter','progid:DXImageTransform.Microsoft.Blur(pixelradius=' + blur + ', enabled="true")'); // и размываем её
	});
};
Вот примеры блоков, тень в которых сделана через box-shadow в нормальных браузерах и через плагин boxShadow в IE.
.block  {
	box-shadow:#a3a3a3 8px 8px;
	-moz-box-shadow:#a3a3a3 8px 8px;
	-webkit-box-shadow:#a3a3a3 8px 8px;
    $('.block').boxShadow('8px 8px #a3a3a3');    
.block  {
	box-shadow:#a3a3a3 8px 8px 15px;
	-moz-box-shadow:#a3a3a3 8px 8px 15px;
	-webkit-box-shadow:#a3a3a3 8px 8px 15px;
}
    $('.block').boxShadow('8px 8px 15px #a3a3a3');    
.block  {
	box-shadow:#a3a3a3 -8px -8px 15px;
	-moz-box-shadow:#a3a3a3 -8px -8px 15px;
	-webkit-box-shadow:#a3a3a3 -8px -8px 15px;
}
    $('.block').boxShadow('-8px -8px 15px #a3a3a3');    
.block  {
	box-shadow:#a3a3a3 0 0 15px;
	-moz-box-shadow:#a3a3a3 0 0 15px;
	-webkit-box-shadow:#a3a3a3 0 0 15px;
}
    $('.block').boxShadow('0 0 15px #a3a3a3');    
Если вам кажется, что тень в IE выглядит по-другому, попробуйте поиграть с настройками, изменив размытие или координаты.

Чтобы плагин срабатывал только в IE, его вызов мы сделаем следующим образом:
<!--[if IE]><script type="text/javascript" src="box-shadow.jquery.js"></script><![endif]-->
Не забывая при этом добавить вызов плагина в конец файла box-shadow.jquery.js:
$(document).ready(function(){
	/* Здесь будет вызов плагина */
}) 


А в следующей статье мы рассмотрим сразу два свойства CSS 3 – rgba и hsla.


Комментарии

3 мая 2010, 20:27 (Ответить)
Огромное спасибо за такое оперативное реагирование!!!
3 мая 2010, 21:09 (Ответить)
Антон, была рада помочь :)
10 июня 2010, 11:19 (Ответить)
box shadow вполне решается средствами css, что на порядок меньше по весу чем jquery и Ваш плагин. Что касается плагина к text-shadow, его уже написали до Вас, метод такой же ;)
10 июня 2010, 20:20 (Ответить)
, мой плагин - это лишь оболочка для CSS, который используется при создании тени в IE.
И сделан плагин для людей, которые не особенно разбираются в тонкостях CSS. Им не нужно знать как вычислять отступы, как создавать дополнительные блоки с position:absolute и что такое z-index. Им нужно, чтобы можно было написать
.block  { box-shadow:8px 8px 15px #a3a3a3; }
и практически тоже самое в JS:
$('.block').boxShadow('8px 8px 15px #a3a3a3');
и не задумываться об остальном.
29 августа 2010, 12:03 (Ответить)
Не могу понять, куда вставлять $('.block').boxShadow('8px 8px 15px #a3a3a3') И ещё по ссылке файл называется box-shadow.min.js, а в тексте box-shadow.jquery.js Это одно и тоже?
1 сентября 2010, 11:32 (Ответить)
, да, это одно и тоже. В box-shadow.jquery.js код даётся с комментариями, а в box-shadow.min.js комментарии удалены и код сжат для уменьшения размера файла.
29 августа 2010, 15:38 (Ответить)
В хеад вставил код а в код box-shadow.min.js в конце дописал строчку $(document).ready(function(){$('.photo').boxShadow('0px 0px 15px #888888');}) Но что-то в ИЕ не работает.
1 сентября 2010, 11:26 (Ответить)
, вы подключили библиотеку jQuery?
Скачать её можно здесь: jquery.com
3 сентября 2010, 11:20 (Ответить)
да, у меня на сайте уже есть блоки на jQuery и файл jquery-1.4.2.min.js подключен
3 сентября 2010, 13:02 (Ответить)
В таком случае можно посмотреть страницу, на которую вы вставили плагин?
Если сюда ссылку выкладывать неудобно, можете написать мне на e-mail, он указан в правой части страницы.
30 августа 2010, 17:55 (Ответить)
аналогично!! не работает почему то(( говорит ошибка на символе $ перед обращением к нужному id! в чем проблема может быть??
1 сентября 2010, 11:29 (Ответить)
, для работы плагина необходимо подключить JS-библиотеку jQuery.
Скачать её можно здесь: jquery.com
Я добавлю информацию об этом в пост.
10 сентября 2010, 10:14 (Ответить)
Хорошие скрипты пишите и разъясняете правильно. Спасибо вам!
10 сентября 2010, 17:36 (Ответить)
, спасибо, мне очень приятно :)
29 октября 2010, 2:48 (Ответить)
Хороший плагин! Спасибо :)
Правда мне кажется, что в нём не хватает поддержки внутренней тени блока, то есть свойства inset.
29 октября 2010, 9:58 (Ответить)
Nightraven, действительно не хватает :)
Но свойство inset сложно в реализации, так как оно требует наложения блока с тенью сверху, а не снизу.
12 декабря 2010, 19:30 (Ответить)
Не знаю как у вас оно работает, а лично у меня нифига не работает: clip2net.com/clip/m62478/1292171403-clip-346kb.png
12 декабря 2010, 22:20 (Ответить)
Дима, мой плагин - это костыль, замещающий box-shadow для IE в простых реализациях.
Вы можете отказаться от поддержки тени блока для IE, либо поискать решение, которое бы вас устроило.
13 декабря 2010, 16:44 (Ответить)
dalmazov.livejournal.com/734.html
13 декабря 2010, 19:47 (Ответить)
Нет, это же была не критика. Я просто пытался понять откуда такие отступы?
5 января 2011, 16:34 (Ответить)
Дмитрий, фраза "лично у меня не фига не работает" достаточно емкая и скорей служит упреком в Ваш адрес, нежели в адрес автора.
5 января 2011, 16:40 (Ответить)
Чтоб довести автоматизацию до конца, было бы не плохо чтоб плагин запускался во всех браузерах, но в зависимости от версии выполнял разные действия.
10 января 2011, 13:06 (Ответить)
Отличный плагин! НО вот я столкнулся с одной проблемой. Хотелось бы использовать его с не менее замечательным и забугорным скриптом CurvyCorners (www.curvycorners.net/)для закругления уголков. На мой взгляд самый лучший скрипт для этой цели. Однако ваша версия пока не поддерживает закругления и + при совместном использовании этих плагинов тень смещается пикселей на 150 вправо в моем случае (когда я прописывал смещение лишь в 15px). Было бы просто супер, если бы Вы обратили на это внимание и возможно внесли бы изменения в него. Спасибо! Успехов в работе! С уважением, Алексей!
27 января 2011, 18:38 (Ответить)
Nauz, спасибо.
Но увы, это невозможно.
Поскольку оба плагина работают на JS, то так или иначе они будут конфликтовать. Советую вам посмотреть в сторону box-shadow - recens.ru/css/css3_box_shadow.html
12 февраля 2011, 1:19 (Ответить)
if(!jQuery.browser.msie) $('.block').boxShadow('8px 8px 15px #a3a3a3');

это чтобы срабатывало только в IE
11 марта 2011, 17:01 (Ответить)
К таблице пытаюсь применить этот метод - не выходит. jquery.js - прописан. - прописан. в конце box-shadow.jquery.js - $(document).ready(function(){$('.block').boxShadow('0 0 20px #969696');})
у таблицы вид
в css прописано следующее:
.block{
-webkit-box-shadow: 0 0 20px #969696;
-moz-box-shadow: 0 0 20px #969696;
box-shadow: 0 0 20px #969696;}
$('.block').boxShadow('0 0 20px #969696');
И не работает! помогите!
16 марта 2011, 22:06 (Ответить)
Отличный плагин спасибо! Только вот почему то не работает только для ie:



я пытался даже изменить src:



потому что скачанный вариант так и называется.

Но оно и на остальных браузеров тоже влияет и конфликтует с ними.

А так на осле смотриться ОТЛИЧНО! )
16 марта 2011, 22:07 (Ответить)




18 марта 2011, 18:15 (Ответить)
recens, Вы молодец, спасибо, очень пригодилось, много времени сэкономил)
9 мая 2011, 3:29 (Ответить)
Спасибо за плагин. Было бы идеально если бы еще событие изменения размеров окна браузера обрабатывали. Удачи )
22 мая 2011, 23:54 (Ответить)
Спасибо, натолкнули на мысль. Только по-моему можно гораздо проще сделать.

html:



css:
.main {
box-shadow:#a3a3a3 0 0 15px;
-moz-box-shadow:#a3a3a3 0 0 15px;
-webkit-box-shadow:#a3a3a3 0 0 15px;
}

.shadow {
/*тут еще width и height добавить*/
background-color: #a3a3a3;
filter: progid:DXImageTransform.Microsoft.Blur(pixelradius=15, enabled="true")
}
22 мая 2011, 23:57 (Ответить)
html вырезало... Суть в том чтоб элемент с классом shadow поставить сразу после основного в условных комментариях IE
29 августа 2011, 15:28 (Ответить)
Работаю над модификацией вашего скрипта для адаптации rgba цветов с прозрачностью для Осла - позже выложу код
3 сентября 2011, 10:37 (Ответить)
И правда плагин НЕрабочий. Либо автор некорректно описал установку.
Я сделал так:
поставил jquery, залил этот скрипт. Заранее в этом скрипте прописал: $(document).ready(function(){ $('my-block').boxShadow('0 0 15px #a3a3a3'); })
---
Если правильно сделал, значит плагин туфта.
21 сентября 2011, 19:33 (Ответить)
Не могу понять, что и куда прописывать, можешь выложить собрынный архивчик из markup>html+css+js. Заранее Спасибо
29 сентября 2011, 19:02 (Ответить)
Спасибо большое за плагин! Все работает.
18 октября 2011, 14:48 (Ответить)
если не трудно. можно рабочий пример. а то я не понимаю куда что пихать чтобы работало
18 октября 2011, 16:23 (Ответить)
Самое смешное что сказал автор.
------
И сделан плагин для людей, которые не особенно разбираются в тонкостях CSS.
------
уважаемая если бы так оно и было вы бы показали что и куда вставлять. ваш пост рассчитан на профи и новичку точно не подойдет.
я знаю html уже лет 5. вставил все так как обычно это нужно сделать с jquery скриптами но нифига не работает чето.
22 октября 2011, 20:32 (Ответить)
Да для таких вещей вообще лучше использовать файлик PIE

Пользуюсь уже давно
Делает цсс3 - text-shadow и border-radius - это сам проверял

А еще в описании написано что применяется к:
* border-radius
* box-shadow
* border-image
* multiple background images
* linear-gradient as background image
12 ноября 2011, 22:33 (Ответить)
Не надо обс****ть пост. Все нормально и доступно написано!

ВСЕ РАБОТАЕТ!!!

для IE писать
$('.block').boxShadow('8px 8px 15px #a3a3a3');

для остальных браузеров в css
box-shadow:#888888 0 0 15px;


P.S. чтобы скопировать одну строку jQuery не надо 5лет знать html...
12 ноября 2011, 22:38 (Ответить)
для тех кто туп*т воспользоваться googl'ом чтобы узнать как воспользоваться jquery:
www.google.com/search?client=safari&rls=en&q=jquery&ie=UTF-8&oe=UTF-8
16 ноября 2011, 13:58 (Ответить)
Плагин неплохой. Но есть одно но:
Когда меняешь масштаб страницы (Ctrl++ или Ctrl+-) блок, который и дает эффект тени, свои размеры не меняет! Обновление страницы помогает, данный блок свои размеры пересчитывает, и все встает на места, до следующего изменения масштаба )))
27 декабря 2011, 18:46 (Ответить)
Очень интересно пишете, спасибо вам за это:) Особенно примечательно, насколько у вас документирован код. Полезно для ознакомления.
19 апреля, 13:55 (Ответить)
очень интересная и нужная вещь, но подскажите пожалуйста что я делаю не так, при попытке подключить библиотеку IE ругается что "Ошибка: Объект не поддерживает свойство или метод "boxShadow"
17 мая, 12:13 (Ответить)
Ели разобрался, но все работает, спасибо.

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