jQuery textShadow - плагин для создания тени в IE

В предыдущей статье про свойство text-shadow я писала, что его вполне можно использовать, отказавшись от поддержки IE.
Но потом я подумала – а зачем отказываться?
И написала небольшой jQuery плагин для реализации этого свойства под IE.
Вызывается он крайне просто:
$('.block').textShadow('0 1px #191919'); // без размытия	
$('.block').textShadow('1px 1px 5px #191919'); // с размытием
Перечисление параметров идёт так же, как в свойстве text-shadow, с той лишь разницей, что цвет тени должен быть последним параметром.
Давайте рассмотрим код плагина:
$.fn.textShadow = 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 text = $(this); 
	    	text.css({
			position:'relative', // устанавливаем относительное позиционирование
			'z-index':0, // определяем позицию на случай использования фона
			zoom:1 // хак для IE 6
		}).append('<span></span>') // добавляем к элементу тег span 
		.find('span').html(text.html()) // находим его и вставляем в него содержимое элемента
	    	.css({width:text.width(), // ширина тени равна ширине элемента
		    position:'absolute', // устанавливаем абсолютное позиционирование
		    'z-index':-1, // прячем тень за основной элемент
		    color:color, // устанавливаем основной цвет
		    left:x - blur + 'px', // отступ от элемента сверху 
		    top:y - blur + 'px', // и снизу
		    'padding-left':text.css('padding-left'), // отступы тени равны отступам элемента
		    'padding-top':text.css('padding-top')}); 
		if (blur) text.find('span') // если нужно размыть тень, находим её
			.css('filter','progid:DXImageTransform.Microsoft.Blur(pixelradius=' + blur + ', enabled="true")'); // и размываем с помощью фильтра blur
        });
};
А вот и примеры из прошлой статьи:
Всё просто - тень без размытия сдвинута на пиксель вправо и вниз.
Из всех возможных вариантов использования этот мне нравится больше всего. Тень сдвигаем на пиксель влево и вверх.
В этом примере тень сдвинута только вниз.
Эффект размытия. Хорошо подходит для заголовков.
Браузеры, которые поддерживают text-shadow, выведут эти примеры с помощью CSS, а IE будет использовать вышеприведённый плагин.
Но как отличить IE от других браузеров?

Конечно, можно проверять браузер в самой функции, но мы сделаем проще.
<!--[if IE]><script type="text/javascript" src="text-shadow.jquery.js"></script>
<script type="text/javascript">
	$(document).ready(function(){
		$('.block').textShadow('1px 1px #191919');
	})
</script><![endif]-->
Все остальные браузеры будут воспринимать этот текст как обычный комментарий, и лишь IE загрузит необходимый плагин.
Подробнее об условных комментариях для IE можно почитать здесь.

Можно сделать ещё проще – если следующие строки, задающие параметры тени:
$(document).ready(function(){
	$('.block').textShadow('1px 1px #191919');
})
добавить в конец кода плагина, хак для IE сократится до простого вызова скрипта:
<!--[if IE]><script type="text/javascript" src="text-shadow.jquery.js"></script><![endif]-->

Вот и всё.
Пользуйтесь на здоровье, и успехов вам в создании кроссбраузерной вёрстки.


Комментарии

22 апреля 2010, 11:34 (Ответить)
Слушай! классная работа! мне очень пригодилась! а как можно сделать эффект box-shadow в IE? это вообще возможно?
22 апреля 2010, 16:09 (Ответить)
Рада, что статья понравилась. Для IE принцип создания box-shadow будет такой же, как и для text-shadow, разница лишь в том, что тень мы делаем не из текста, а из блока. Надо сказать, мне эта тема самой очень интересна, поэтому в следующей статье я напишу о box-shadow для IE.
12 июля 2010, 13:45 (Ответить)
Спасибо, занес в закладки.
Поддержка IE6 - это круто!
12 июля 2010, 21:32 (Ответить)
Ещё бы.
Особенно если вспомнить, в каком году был выпущен IE 6 и какой год сейчас на дворе.
19 ноября 2010, 14:08 (Ответить)
Афигено!!!!
22 ноября 2010, 11:08 (Ответить)
В файле text-shadow.min.js допущена ошибка вида
"missing ; before statement". Opera дала даже более точную строку "css('padding-top')})if(blur)a.find('span..."
Проблема решается перекопированием из статьи исходного кода :)
22 ноября 2010, 15:12 (Ответить)
Александр, спасибо, уже исправила.
23 ноября 2010, 16:57 (Ответить)
Это хорошо ) И у меня, кстати, был баг с отображением тени (она уходила от объекта на добрых 200 пикселей вправо) и пришлось модернизировать функцию. Изменил параметры при вызове (сделал function(o,idShadow)) и добавил примерно в 19 строке код вида
.next() // находим его .attr('id',idShadow)//устанавливаем id тени
.css({ // добавляем ему следующие свойства

И можно менять тень вида $("#id_тени").css(свойства); и т.д. :)
23 января 2011, 12:28 (Ответить)
Куда его пихать?! Объясните чайнику что делать с этим:

$('.block').textShadow('0 1px #191919'); // без размытия
$('.block').textShadow('1px 1px 5px #191919'); // с размытием

где в каком файле это должно лежать в css или хз где?!

я не врубаюсь жду ответа плз!
23 января 2011, 12:39 (Ответить)
Андрей,
В HTML код вашей страницы вы вставляете следующее:
<!--[if IE]><script type="text/javascript" src="[путь к файлу]text-shadow.jquery.js"></script>
<script type="text/javascript">
	$(document).ready(function(){
		$('[блок, к которому вам над применить эффект]').textShadow('1px 1px #191919');
	})
</script><![endif]-->

Кроме этого, вы должны подключить библиотеку jQuery.
8 февраля 2011, 11:40 (Ответить)
Нина, спасибо Вам большое! Пробовала разные плагины, они почему-то не срабатывали, а Ваш работает. Вы молодец
4 апреля 2011, 11:16 (Ответить)
Вы в условных комментариях подключаете файл text-shadow.jquery.js, а на скачивание даёте файл text-shadow.min.js, так и задумано?
4 апреля 2011, 14:25 (Ответить)
Да, так и задумано.
Код text-shadow.min.js отличается только тем, что он сжат для уменьшения размера.
30 мая 2011, 2:45 (Ответить)
Скажите а можно использовать такую конструкцию:
$('.block:hover').textShadow('0 1px #191919');

как сделать чтоб тень добавлялась при наведение на элемент?
22 июня 2011, 21:42 (Ответить)
Присоединяюсь к вопросу Евгения. Как-нибудь можно прикрутить к этому способу hover?
Автор, отзовитесь..)
22 июня 2011, 23:55 (Ответить)
И да, способ обрезает шрифты (обрезаются выступающие хвостики у букв "ц", "щ" и т.п.
1 июля 2011, 1:53 (Ответить)
вы тут пишете и обсуждаете хуйню
это написано три года назад
www.hintzmann.dk/testcenter/js/jquery/textshadow/
пруфлинк
и кстате удобнее реализовано

однако, девушка написала плуг к жквере - это подвиг. преклоняюсь. без иронии. мо-ло-дец!!!
5 июля 2011, 17:50 (Ответить)
megalol, Сам то написал в жизни хоть один плагин?
или только комментарии дурацкие?
11 июля 2011, 12:53 (Ответить)
тот способ который дал megalol не пашет, по крайней мере на IE8.
А это уже не выход...
9 августа 2011, 13:01 (Ответить)
Спасибо Вам огромное!!!
Это единственное, что помогло и получилось даже иннтересней чем в css!
yogadestiny.ru/kniga- здесь в дизайне и было интересного только работа с тенью (заголовок сайта, заголовки статей, гравировка в боковой панели(даже это сработало!)!
9 августа 2011, 13:35 (Ответить)
Единственное на кнопках не прокатило(((
Может я не правильно их обозвал в скрипте:
$('input[type=submit]').textShadow('0px 1px 1px #000');
$('input[type=submit]:active').textShadow('0px 0px 1px #000');
9 августа 2011, 13:50 (Ответить)
ЧТО С ТЕНЬЮ???
yogadestiny.ru/?s=
пожалуйста подскажите!!!!!
10 августа 2011, 12:21 (Ответить)
Не работает на кнопках как и в Opere!
Некорректно работает со ссылками!
И вот здесь: yogadestiny.ru/razvitie-bloga
внизу на надписи "СПАСИБО ЗА ВАШУ ПОМОЩЬ!" я вообще не понял почему!
18 августа 2011, 6:24 (Ответить)
Почему-то для спецсимволов типа $ тень не отрисовывает, а с русскими/латинскими буквами все нормально.
17 октября 2011, 19:31 (Ответить)
Когда блоков с одним id несколько, почему-то работает только для первого блока.
27 ноября 2011, 11:52 (Ответить)
может признаетесь, что это не ваш скрипт ?? не стоит обманывать народ... просто в чем разница так это в переводе !!!
12 января, 5:45 (Ответить)
Этот "плагин" не работает. Самый нормальный способ это просто указать:
filter:Shadow(Color=#fcfcd8,Direction=135,Strength=2);
И ни надо никаких заморочек, работает на УРА! всё очень просто.
7 марта, 20:27 (Ответить)
а потом откройте это (с фильтром в IE9) и офигеете. нормальных варианта по сути два - jquery.textshadow.js для "тонких" теней и jquery.dropshadow.js для "мягких"
14 марта, 18:07 (Ответить)
Спасибо Вам! Плагин заработал. Но у меня возникали проблемы с местоположением тени - тень бывала то гораздо левее, то правее самого текста. Может у кого-то тоже тень "уплывала", то будет полезно. Решил это так:

1. Надо не скачивать плагин, а копировать код со странички и сохранять отдельным файлом, к примеру textshadow-ie.js и подключить, как было описано Автором плагина.

2. Далее - ищем строку:

}).append('') // добавляем к элементу тег span

и прописываем тегу span класс:

}).append('')

3. В CSS файле, отвечающем за таблицу стилей для IE задаём правила для этого класса (если такового файла нет - то создать - у меня это файл styleie.css):

.textshadow{text-align: left;} или
.textshadow{text-align: right;}
в зависимости от того - куда "уплывает" тень.

Ещё раз спасибо за плагин!
14 марта, 18:11 (Ответить)
Странно, почему-то не отобразило то, что я прописал в .append('') :(
Вообщем - тегу span надо присвоить класс, например textshadow:
и в CSS-e правилом text-align ровнять его.
30 марта, 3:44 (Ответить)
Если кто-то хочет получить тень при наведении, то попробуйте такую конструкцию:
$(document).ready(function(){
var DefaultTextShadow = {
x: 2,
y: 2,
radius: 0,
color: "#000000"
};
var HoverTextShadow = {
x: 2,
y: 2,
radius: 0,
color: "#ff0000"
};
$("#menu a").textShadow(DefaultTextShadow);
$("#menu a").hover(function() {
$(this).textShadow(HoverTextShadow);
},
function() {
$(this).textShadow(DefaultTextShadow);
}
);
});

Работает прекрасно, только если вы не меняете задний фон при наведении на объект.

Это я думаю и так ясно, но дабы исключить лишние вопросы:
если изначально на тексте тени нет, то "DefaultTextShadow" можно не использовать. Тогда:
$("#menu a").hover(function() {
$(this).textShadow(HoverTextShadow);
},
function() {
$(this).textShadowRemove;
}
);

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