Заголовки и другие элементы картинками понедельник
17 марта
Иногда есть необходимость вставить какой-либо небольшой текст с помощью картинок.
Хочу рассказать об удобном и универсальном способе это делать. На помощь придет псевдоэлемент :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 марта - Ага. Хорошая метода. Хотя мы используем для графических заголовков 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>
Я таким пользуюсь, когда меню делаю картинками.
- MFD
21 марта - Текст картинки можно генерировать средствами php
24 мартаТекст картинки можно генерировать средствами php
Зачем?
- Александр
7 апреля А содержимое заголовка идет <h2><span>Текст заголовка</span></h2>, где h2 span {display:none;}.
Поисковики плохо относятся к display:none, так что вариант не подходит вовсе
- Владимир
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-ом засорять :)
17 марта
_h2 { ... }
ведь если ставить перед любым параметром "_" то понимать его будет только IE, зачем тогда js?