Заголовки и другие элементы картинками

Иногда есть необходимость вставить какой-либо небольшой текст с помощью картинок.

Хочу рассказать об удобном и универсальном способе это делать. На помощь придет псевдоэлемент :before

Допустим нам надо вставить заголовок h2 рисунком:

Как видно, заголовок нарисован нестандартным шрифтом и расположен на неоднородном фоне. Поэтому картинку со сплошным фоном вставить нельзя, надо использовать gif-картинку с прозрачным фоном. Один из лучших способов это сделать:


<h2><img src="h2_news.gif" alt="Новости" /></h2>

При отключенных картинках мы увидим обычный заголовок h2 и сможем прочитать заголовок. Сразу скажу, я не специалист в оптимизации для поисковиков, но насколько знаю, поисковики заголовок, выполненный в виде картинки, ценят значительно меньше. Попробуем сделать html-код таким:


<h2>Новости</h2>

А картинку вставим с помощью css. Создадим стили заголовка, максимально похожие на нарисованное:


h2{
	font: 1.2em georgia,serif;
	color: #00416b;
	margin: 0 0 1.5em 0;
}

Следующий шаг — вытесним текстовый заголовок картинкой в псевдоэлементе :before


h2:before{
	content: url(h2_news.gif);
	display: block;
	line-height: 1em;
}

В результате имеем двойной заголовок. Чтобы избавиться от заголовка выполненного текстом укажем у заголовка высоту нашей картинки и применим свойство overflow: hidden;


h2{
	font: 1.2em georgia,serif;
	color: #00416b;
	margin: 0 0 1.5em 0;
	height: 14px;
	overflow: hidden;
}

Готово!

Теперь разберемся, что же у нас получилось. Поисковики видят то чего мы добивались. Пользователи, у которых включены картинки, видят то что задумал дизайнер. Причем при увеличении или уменьшении размера шрифта ничего не ломается.

Если у пользователя отключены картинки, то картинка в элемент :before не грузится, но пользователи видят заголовок, выполненный с помощью правил css. Единственный недостаток в этом случае — при увеличении размера шрифта текст заголовка начинает обрезаться, поэтому могу рекомендовать указывать размер шрифта поменьше.

Еще один момент. IE. Для него создаем псевдоэлемент с помощью js (увы, по-другому никак):


h2{
	zoom: expression(
	runtimeStyle.zoom = 1,
	insertAdjacentHTML('afterBegin','<span style="display: block;line-height: 1em;"><img src="h2_news.gif" alt="" /></span>')
	);
}

При отсутствии js пользователи IE увидят тоже, что и пользователи других браузеров при отключенных картинках. Т.е. все ок.

В заключение весь css сразу:


h2{
	font: 1.2em georgia,serif;
	color: #00416b;
	margin: 0 0 1.5em 0;
	height: 14px;
	overflow: hidden;
}
h2:before{
	content: url(h2_news.gif);
	display: block;
	line-height: 1em;
}
h2{
	zoom: expression(
	runtimeStyle.zoom = 1,
	insertAdjacentHTML('afterBegin','<span style="display: block;line-height: 1em;"><img src="h2_news.gif" alt="" /></span>')
	);
}

Пример

Сергей
17 марта
Да, но можно ведь не использовать js а просто в css написать ниже основного

_h2 { ... }

ведь если ставить перед любым параметром "_" то понимать его будет только IE, зачем тогда js?
Павел Колодяжный
17 марта
Ага. Хорошая метода. Хотя мы используем для графических заголовков display:block; + background.

А содержимое заголовка идет <h2><span>Текст заголовка</span></h2>, где h2 span {display:none;}.

Но ваша метода более универсальна.

=) Кстати, в показанном примере показан распространенный/системный шрифт Georgia. Так что, в приведенном примере, можно было обойтись вообще без растра.

17 марта
=) Кстати, в показанном примере показан распространенный/системный шрифт Georgia.

Нет, там Minion Pro


17 марта
Да, но можно ведь не использовать js а просто в css написать ниже основного
_h2 { ... }
ведь если ставить перед любым параметром "_" то понимать его будет только IE, зачем тогда js?

IE не поддерживает псевдоэлементы, поэтому элемент эмулируем с помощью js

Никита Козин
17 марта
Сергей, IE не понимает :before.

Павел, почему ваш способ менее универсальный? В любом случае для всех заголовков нужно прописывать свой стиль с указанием изображения.

17 марта
Павел, почему ваш способ менее универсальный?

У способа есть недостаток, на мой взгляд очень существенный — при отключенных картинках заголовка не будет видно.

Никита Козин
17 марта
Да, точно. Кстати, его вариант можно немного усовершенствовать:

<h2>
<img src="/header/news.gif">
<span>Новости</span>
</h2>

Таким образом можно написать общий стиль для всех заголовков, избежав необходимости описывать для всех заголовков отдельный стиль:

h2 span {display: none}
Павел Колодяжный
17 марта
Вот, кстати, на описанный мною метод.
andrey
17 марта
В опере не работает, к сожалению. Проверьте.
Сдается мне, что лучше всего картинки грузить скриптами для таких замен, ибо опера набирает обороты, а универсального решения нет.

Правда можно ли определить скриптом, что картинка загружена? Они(картинки) поддерживают onload?

18 марта
В опере не работает, к сожалению. Проверьте.

Вы хотели сказать при отключенных картинках ;) Да, есть такая ложка дегтя. Будем думать как исправить

asterian
18 марта
По-моему, у Лебедева был такой вариант:
h2 {text-indent: 5000px; width: 100%; overflow: hidden;}
h2 img {position: absolute; top: 0; left: 0;}

Высоту тоже нужно указать, но это обычно не проблема. Зато картинка не вшита в стиль, и семантически лишних тегов тоже нет:
<h2><img src="..." />Текст заголовка</h2>

Я таким пользуюсь, когда меню делаю картинками.
Дима Фитискин
18 марта
asterian, способов сделать это с тегом внутри заголовка много. в приведенном выше примере в заголовке нет «мусора».
MFD
21 марта
Текст картинки можно генерировать средствами php

24 марта
Текст картинки можно генерировать средствами php

Зачем?

Дима Фитискин
24 марта
Текст картинки можно генерировать средствами php

MFD, а картинку потом все равно нужно вставить в HTML. Тут как раз об этом.
Александр
7 апреля
А содержимое заголовка идет <h2><span>Текст заголовка</span></h2>, где h2 span {display:none;}.

Поисковики плохо относятся к display:none, так что вариант не подходит вовсе
Дима Фитискин
8 апреля
Александр, в таком варианте и без поисковиков проблем хватает. Например пользователь с отключенными картинками не увидит текста. Точнее сказать, вообще ничего не увидит.
Владимир
5 июля
Метод интересный, в опере - да, не работает.
Не далее как вчера была подобная задча, решил проще:

<h2 id="s_project"><a href="#">проект<span></span></a></h2>

Рисунок прописываем внутри span:
h2 span {display:block; position:absolute; top:0; left:0; width:56px; height:20px; z-index:20; background:url("i/s_project.gif") 0 0 no-repeat; }
ну а сам контейнер разумеется relative и overflow:hidden.

Итого все везде работает без JS, и с отключенными картинками в том числе. Жаль только что приходится код span-ом засорять :)