Некоторые техники замены текста картинками (image replacement)

23 Февраля, 2006

Обзор некоторых способов замены текста картинками.

Зачем?

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

  1. <h1>Заголовок – картинка</h1>

1. Способы без добавления HTML

Именно их я, как правило, и использую, если не нужно сильно заморачиваться на поддержке браузерами. Самые популярные:
1. LIR (пример ) (так же известен как Phark Method)

  1. h1{
  2. text-indent: -9000px;
  3. overflow: hidden;
  4. height:80px;width:200px;
  5. background-image: url(“img.gif”);
  6. }

Этот первый я чаще всего и применяю. Хотя при отключенных картинках мы не увидим ничего :(. Руководствуюсь принципом: «нефиг». :)

2. Метод Leahy/Langridge (подробнее)

  1. h1{
  2. padding: 80px 0 0 0;
  3. overflow: hidden;
  4. background-image: url(“img.gif”);
  5. height: 0px !important; /* для большинства броузеров */
  6. height /**/:80px; /* для блочной модели IE5.5 */
  7. }

Вместо 80px естественно нужно вставить свою высоту.

3. MIR (Malarkey Image Replacement) (подробнее)

  1. h1{
  2. letter-spacing :-1000em;
  3. height:80px;width:200px;
  4. background-image: url(“img.gif”);
  5. }

Довольно изящный метод.
Все три разумеется при отключенных картинках не покажут ничего. Следует это помнить. Доступность страдает, но иногда бывают ситуации в которых эти методы могут сильно выручить. Смотреть пример.

2. Способы c добавлением HTML

1. Метод Pixy (подробнее)
HTML:

  1. <h1>Заголовок – картинка<span></span></h1>

CSS:

  1. h1{
  2. margin:0; padding:0;
  3. position:relative;
  4. width:200px; height:80px;
  5. overflow:hidden;
  6. }
  7. h1 span {
  8. display:block;
  9. position:absolute; left:0; top:0; z-index:1;
  10. width:200px; height:80px;
  11. background:url(“img.gif”) top left no-repeat;
  12. }

Если картинки отключены текст будет видно. Один из лучших методов, главное не забыть вставить спан. По сути фоновая картинка ложится сверху на текст и при ее отсутствии текст просвечивает.
Есть еще несколько вариаций которые работают в тех же браузерах (ИЕ 5 и выше и все остальные более или менее новые) но отличаются немного структурой кода: Levin Alexander’s например.
2. Thierry Image (re)Placement (подробнее)
HTML:

  1. <h1><img src=”pic.gif” />Заголовок – картинка</h1>

CSS:

  1. h1 {
  2. height:80px;
  3. width:200px;
  4. overflow:hidden;
  5. position:relative;
  6. }
  7. h1 img {
  8. z-index:1;
  9. position:absolute;
  10. top:0;
  11. left:0;
  12. }

Другие способы

Среди прочих нельзя не упомянуть sIFRнеофициальные апгрейды к нему) — замена с помощью флеша и джаваскрипта.
И некоторые методы замены картинками еще на сервере: Dynamic Text Replacement и на русском PHP+CSS: Динамичеcкая замена текста.
А так же то, к чему мы прийдем рано или поздно :), CSS3 метод замены текста:

  1. h1 {
  2. content: url(img.gif);
  3. }

Ну или простой и банальный font-face, который наконец заработает везде.

Ссылки

Собственно не такой же ж я умник что бы самому вот это все придумать. :)
К тому же это далеко не полный список методов, лишь те, которые я практикую и считаю удобными для себя.

Линков из этих двух страничек хватит всерьез и надолго :)
С названиями полная путаница, поэтому называл я по имени того кто выше в гугле. Хоть для какой то ориентации.

XHTML/CSS, Дизайн

45 комментариев к “Некоторые техники замены текста картинками (image replacement)”

1. Февраля 23rd, 2006 | Flack

Спасибо, Thierry Image (re)Placement пока не встречал. Обязательно попробую.

2. Февраля 23rd, 2006 | ganges

Я делаю так.

h1 {
height:80px;
width:200px;
background:#fff url(someimage.gif);
}
h1 span {
display:none;
}

И HTML

<h1><span> Заголовок – картинка </span></h1>

Конечно, при выключенных картинках и включенном CSS не видно ничего. Это наверное самый примитивный IR. А вообще я за CSS3 метод :)

3. Февраля 23rd, 2006 | Kildor

Кстати, Опера давно уже поддерживает CSS3 метод ;-)

4. Февраля 23rd, 2006 | akella

коммент на правах рекламы :)

5. Февраля 23rd, 2006 | MAX

А я пробовал «Header Image Generator» :) (http://www.alistapart.com/articles/dynatext/) Работает на ура. Главное ttf-шрифт на сервер закачать :)

6. Февраля 26th, 2006 | uggallery

Странно, что нет методов (мне не попадались) вроде LIR-a, но где для сокрытия текста используются манипуляции с line-height. Это работает даже в IE 5.0. Правда, проверял не во всех браузерах. На маке, например, не проверял. Может есть какие-то противопаказания?

7. Февраля 27th, 2006 | akella

А как именно с помощью лайн-хейт Вы предлагаете?
очень большой или очень маленький? или отрицательный? Я как то и сам не пробовал – хотя и заметно что можно текст наверно смещать сильно по вертикали. Можно чуть подробнее?

8. Февраля 27th, 2006 | ganges

http://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/

Что меня лично наводит на мысль о том, что гипотетический метод IR с помощью line-height – не самый лучший. Я наступал на грабли с этим проперти в более простейшей ситуации, чем IR.
Отрицательный не покатит, ИМХО :)

9. Февраля 27th, 2006 | akella

Не совсем понял кстати параллель? Там же просто в очередной раз написали что лайн-хейт можно без единиц употреблять? А как это связано с граблями при ее употреблении?

10. Февраля 27th, 2006 | uggallery

Test-case для проверки/

Похоже, line-height c большим значением работает в самых популярных браузeрах. Нулевой — так-сяк, а отрицательный не работает вообще. Но реальность, конечно, может оказаться сложнее.

11. Февраля 27th, 2006 | ganges

А можно и с единицами :) Konqueror в моей разметке без едениц выдавал “страшную байду”, а с еденицами – все ок. Я, ясное дело сначала без едениц написал – пропустил через валидатор – а он – “говно мол, не катит”. Если бы тут Мейер свою заметку не написал, я бы наверное волосы на голове порвал :) Во как бывает

Паралель в том.что эксперимантировать с line-height с такой “скользкой” техникой как IR я считаю потенциально багоопасным.

На конкверор, конечно, можно забить, если забыть, что это “почти Safary”

12. Февраля 27th, 2006 | uggallery

>считаю потенциально багоопасным

Согласен. Хотя любой IR “багоопасен”, любой требует проверки. А этот, видимо, очень неплохо подходит для пятого IE, чем и привлекает.

13. Февраля 27th, 2006 | UGgallery -Замещение текста с помощь...

[...] Есть идея использовать для замещения текста (image replacement) CSS-свойстов line-height. Идея требует проверки, но уже сейчас кажется вполне перспективной [...]

14. Февраля 27th, 2006 | akella

Да – оперативно сработал :)

Это малозначимо – но вообще как факт – сначала случайно запустил 5.5 а не 5.01 – и при большом позитивном line-height – сверху от элемента соответствующее пустое пространство – чего, однако, не наблюдается в других ИЕ. Пожалуй letter-spacing в этом смысле чуть более универсален. Хотя как вариант – нулевой лайн хейт можно отдавать ИЕ безболезненно.
То бишь например вариант сочетания LIR (самый первый в посте и не работающий в ИЕ 5.0) очень даже привлекателен:
_line-height:0;

15. Февраля 27th, 2006 | uggallery

Эх! В 5.5-то я и не проверил :( До чего ж они разные эти IE. А я это уже в одном эскизе использовал. Пойду исправлять на _line-height:0 или что-нибудь в этом роде. Спасибо.

16. Мая 15th, 2006 | Арки

CSS-хаки – это круто, конечно, но с выходом ИЕ 7 будут большие проблемы. Опять придется переделывать все сайты.

Да и тестирование сайта во всех версиях ИЕ: 4, 5.0, 5.01, 5.5, 6.0, 7.0, а еще Файрфоксы, Оперы, Сафари, Konqueror – немножко напрягает.

Может, перестать изобретать велосипед, и просто оставить “по умолчанию” – чтобы весь текст выводился тем шрифтом, который указан в браузере (Times New Roman). Или выбрать Verdana – он выглядит гораздо лучше.

Но вот что мне не нравится – когда текст на сайте фиксированного размера. Читать неудобно! А разве текст не предназначен для чтения?

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

Совет: всегда проверяйте вид сайта при маленьком разрешении и с большим размером шрифта – узнаете много дового о верстке.

В общем, по-прежнему действует правило: хочешь сделать крутой современный сайт с наворотами, верстай DIV-ами и с большим количеством CSS. Хочешь быстро сделать простой и удобный сайт – делай табличную верстку с минимумом CSS.

17. Мая 15th, 2006 | akella

У Вас получился замечательный монолог, строго подтверждающий Вашу правоту. :)

Но во первых никаких особенно страшных проблем с ИЕ 7 я не вижу пока что. А если учесть что до его выхода еще полгода. ТО об этом думать пока все же рано.

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

Совет – очень хороший :). В таком случае всегда проверяйте ваши сайты натаблицах мобильниками, поисковиками(на предмет кучи лишнего кода), принтерами на предмет печатных версий ит д. Узнаете еще больше нового.

А правило боюсь действует для Вас. :) Но никак не для меня.
Вы напоминаете крестьянина который ворчит на трактор и говорит – “да проще лопатой вскопать, чем трактор заводить, бензин заливать”… :)

18. Мая 26th, 2006 | Shimon

Все прекрасно, только у меня почему то в первом способе никак не удается валидно приделать ссылку на заголовок :’(

а span как то не хочется…

19. Мая 27th, 2006 | akella

Порообуй писать тот ЦСС для замены текста на картинку не для “h1″, а для “h1 a”. Добавив туда правило display:block
Должно получиться.

20. Июня 3rd, 2006 | Максим Вуец

Может я чего не понимаю, но почему не проще сделать так:
h1 span { display: none; }
<h1>
<span>title</span>
<img src="img.gif"/>
</h1>

21. Июня 6th, 2006 | Ivan A-R

Да. Вроде как через скрытие логичнее получается. У меня картинка на заголовок полупрозрачная, и я сделал так:

h1 {
height:85px; width:700px;
overflow:hidden;
background: transparent url(“images/title.gif”) no-repeat;
}
h1 span {
visibility: hidden;
}

title

Где грабли выплывут?

22. Июня 6th, 2006 | akella

Все зависит от задач которые вы ставите перед собой. К примеру – ПРОСТО надо заменить нечто на картинку – без заморочек с аксессабилити и тд – мне было бы стыдно добавлять СПАН я бы сделал без него.
Другой вариант – нужно заморочится на аксессабилити – то есть что бы как минимум с отключенными картинками показывало текст какой то хоть. Но тогда твой метод Иван не подходит.

С другой стороны что лично мне иногда претило бы использовать метод Максима – та картинка на которую я заменяю текст – иногда служит все же частью дизайна и лучше ей быть в фоне. + контент дублируется. Но для других случаев совсем не плохой вариант. У Тьерри некое подобие такого подхода – Thierry Image Placement.
Короче чаще зависит от конкретного случая – иногда чего уж греха таить можно и влепить пустой див, пока никто не видит и потом не спать ночами от угрызений совести. только так :)

23. Июня 9th, 2006 | Ivan A-R

Спасибо. Я уже потом допёр, что с отключёнными картинками заголовка не будет.

Опять же, я исходил из того что у меня заголовок с прозрачными областями… Но тут уж ничего не попишешь.

А HTML выглядит достаточно прилично: <h1><span>title</span></h1>

24. Августа 15th, 2006 | Dcat

А какие есть варианты для замены INLINE элемента на картинку?
Например :) на картинку.

25. Августа 15th, 2006 | akella

Самое прямолинейное решение с помощью javascript – http://www.whaleofadive.com/misc/siir/about.php – вообще же логичнее тогда оставить картинки :). Или сделать это на уровне сервера.

26. Августа 18th, 2006 | Купер

Не понял изврат с -1000em

27. Августа 18th, 2006 | akella

Это для того что бы текст отобразился за пределами страницы, просто большое число что бы сдвинуть его(текст) из пределов видимости то бишь экрана. И что бы он не отображался поверх нашей картинки или чего либо еще на странице.

28. Августа 18th, 2006 | Купер

Так может просто в (или в css) сделать?

29. Августа 18th, 2006 | Купер

блин – я написал div style=”display:none” в кавычках, а его “съело”

30. Августа 19th, 2006 | akella

Такой метод(-1000em) считается более безопасным – и читатели экрана прочитают текст в первом случае – во втором могут и не прочесть.

31. Апреля 4th, 2007 | аниме

есть один масюсенький минус, если такой фигни понаделать на сайте многократно, то не удивляйтесь, ежели у вас упадёт посещяемость!!

Как говорится всё должно быть в меру!
я прото, что, чтобы под картинкой ебыл спрятан роман война и мир!

32. Июня 21st, 2007 | Grin

хорошая статья, спасибо

33. Ноября 1st, 2007 | Михаил

Скрытый текст по идее нехорошо, с точки зрения гугла…

34. Ноября 2nd, 2007 | Скакунов Александр

Как называется классный шрифт, использованный на картинках в примерах?

35. Ноября 2nd, 2007 | akella

Вряд ли я смогу восстановить :( – но разве это не Scriptina? Я вроде бы не использовал чего то очень необычного

36. Ноября 2nd, 2007 | Скакунов Александр

Вроде бы нет, но очень похоже, спасибо!

P.S. Было бы здорово иметь нотификацию по емейлу о приходящих комментариях, а то приходится по 20 раз открывать страницу, чтобы посмотреть глазами, ответил кто или нет.

37. Ноября 3rd, 2007 | akella

Я надеялся что RSS достаточно, но добавил и форму подписки, спасибо за идею.

38. Января 9th, 2008 | ArtDesigner

Может я что-то где-то упустил, но я пользуюсь методом, который лишен недостатков. Возможно я не прав.
h1 img src=”pic.png” alt=”Главная” /h1

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

39. Января 9th, 2008 | akella

Ну некоторые оптимизаторы считают что альт меньше переливает в ссылку, или меньше веса придает словам, например.
А недостатков у метода действительно мало =) Разве что – чуть больше HTML, ведь нужно обязательно указать альт, адрес картинки, высоту и ширину.

40. Января 24th, 2008 | Guyver

Хех, спасибо, буду пробовать на своих пациентах )

41. Марта 1st, 2008 | Никита

h1{
text-indent: -9000px;
}

Пользователи с отключенной графикой не увидят текст. Я использую похожую технику, только без смещения текста: http://www.sexhtml.ru/css/menu/

42. Июля 24th, 2008 | Del'ka

сегодня нашёл совершненно замечательный способ через :after
http://habrahabr.ru/blog/css/37811.html

хорош тем чо при отключенных картинках виден текст, но при этом нет несемантических span.

43. Октября 4th, 2008 | cssing :: Архив :: Оценка качества верстки

[...] Последний хоткей кстати проявляет “плохие” image replacement [...]

44. Мая 14th, 2009 | Перспективный блоггер

Смотрю в ff3, в методе Маларки наблюдаю на картинке первую букву текста – “З”, что вполне естественно, т.к. отрицательный letter-spacing не изменяет позицию первой буквы.

Здесь нужно бы еще отрицательный text-indent на ширину первой буквы добавить, но тогда это уже будет метод, объединенный с методом Фарка.

45. Января 26th, 2012 | Вредная верстка | Server Room

[...] Но как?! Читаем про LIR и Pixy. [...]

Оставить комментарий