Разные методы Image Replacement для разных браузеров

13 Oct. 2006

Из всех видов IR на сегодня мне больше всего нравится метод с использованием CSS-свойства content с псевдо-классом :before. Этот метод работает в современных браузерах, примерно у 20% пользователей. По-моему, достаточно для начала. Что делать с остальными восьмидесятью — ниже.

В самой минимальном варианте CSS выглядит так:

h1 {
    overflow: hidden; 
    width: 300px;
    height: 30px; 
    }
h1:before {
    content: url(example.png);
    }

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

font: normal 80% sans-serif;

Opera, при отключении картинок, показывает вместо сгенерированной графики слово “Image”. Чтобы оно не мешалось, достаточно задать псевдо-классу размер шрифта поменьше и цвет, совпадающий с фоном. Никакого вреда юзабилити или другим браузерам от этого не замечено.

color: #FFF; /* for  Opera */
font-size: 1px; /* for  Opera */

В результате получаем:

h1 {
    overflow: hidden; 
    width: 300px;
    height: 30px; 
    margin: 0;
    padding: 0;
    font: normal 80% sans-serif;
    }
h1:before {
    content: url(example.png);
    color: #FFF; /* for  Opera */
    font-size: 1px; /* for  Opera */
    }

Для поддержки MSIE используем другой CSS-метод Image Replacement, например Phark Method. Без JS, без лишней HTML-разметки. Он прекрасно работает в MSIE. Главный недостаток: при отключении картинок, но с включенным CSS, вообще никакого текста не видно. В остальном, Phark Method — простой и надежный метод. Часто используется.

Дополнительный код должен подключаться с использованием Conditional Comments, чтобы его увидел только MSIE.

h1 {
    background: url(_h1.png) 0 0 no-repeat;
    text-indent: 5000px; 
    }

Благодаря тому, Firefox не видит этого кода, не проявляется, связанный с ним недостаток Phark Method-а. Теперь они просто не пересекаются.

См. рабочий пример.

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

Вот это я и называю: сделать на все 100% для одних, и на 120 — для других.

Что еще почитать о замене текста картинкой (Image Replacement)

12 Responses to “Разные методы Image Replacement для разных браузеров”

  1. YoYurec Says:

    отличный способ… вот только пытаюсь расширить применение, но получаю кучу вопросов:
    * а как насчёт заголовок-ссылка?
    * или графическое меню-роловеры? (делать 2 картинки, само собой – но тогда в ИЕ будут “мерцания” по ховеру… а делать роловеры одной картинкой ещё и для ИЕ — не кошешерно)

    буду благодарен ответу!

  2. uggallery Says:

    Честно говоря, не вижу препятствий для реализации того и другого. Заголовок-ссылка ничем не отличается от ссылки в элементе списка и т.п. Используются другие селекторы и всё.

    Бороться с мерцанием можно разными способами. Проще всего, используя технику css-sprite.

    Что то подобное я делал на этой странице. Там span-ы использованы, но это просто осталось с предыдущей реализации, можно обойтись без них.

    Немножко не понял что такое “роловеры одной картинкой ещё и для ИЕ”. И что значит “некошерно” в отношении CSS. Работает? Значит все нормально.

  3. YoYurec Says:

    Немножко не понял что такое “роловеры одной картинкой ещё и для ИЕ”.
    я имел ввиду удобную технику “css-sprite” (использование которой ставится под сомнение), эффект роловера получается позиционарованием фона так? так! но ведь это сработает для IR (метод background-image) в IE, а для нормальных браузеров ведь используем :content, его-то как позиционировать? накак! :( выходит нужно делать для состояния hover отдельную картинку… выходит для одной кнопки меню нужно 3 картинки: button1, button1over (Opera,FF) + button1sprite (IE).
    Либо для всех браузеров 2 картинки, но тогда без любимого css-sprite :(

  4. uggallery Says:

    Почему “никак”? Можно использовать margin-left с отрицательным значением.

    Я добавил к коду примера следующий код:

    h1:hover:before {
    margin-left: -300px;
    }

    И модифицировал картинку.

    Всё работает. Естественно можно использовать другой селектор, не h1.

  5. YoYurec Says:

    вах!!! молодца!!! респект :)
    будем модифицировать… сейчас юзаю NIR (он же BIR), а вообще переходить на твой метод собираюсь, он прошёл все полевые испытания, (и уже!) включая sprites. TNX!

  6. uggallery Says:

    Пожалуйста. Буду рад, если пригодится.

  7. (не)Удачный брендинг | rotorweb.ru | Проблемы и решения в Web-дизайне Says:

    [...] кроссбраузерная вставка Flash-анимации. Разные методы Image Replacement для разных браузеров. Световые кисти для [...]

  8. Ворон Says:

    Для оперы сделал:
    font-size:0;
    в результате чего получил при выключенных изображениях рамку без надписи.
    Так как у нас имеет место быть overflow:hidden; то от рамки избавился с помощью
    .fn:before{

    position:relative;
    left:-2px;
    }
    Проверял в опере 9.63
    Работает.
    Какие то подводные камни кто то видит?

  9. uggallery Says:

    Надо посмотреть. Что-то подобное я делал. Но отказался, как раз из-за того, что в будущем может создать проблемы на новых браузерах. Ну, еще и потому, что Опера зря эту рамку показывает, а следовательно сама себе злобный буратино. Ну и еще :) потому, что правильнее серфить не только с отключенными картинками но и стилями. В общем, клубок причин.

  10. namez Says:

    помогите как будет выглядеть решение для схемы

    текст

    не понимаю
    спасибо заранее за помощ!

  11. namez Says:

    …в html превратилось

    в общем в h1 вложенна ссылка!
    заголовок ссылка -)

  12. namez Says:

    использовал line-height для IE 6

    заголовок ссылка решилась -)

    Есть вопросы

    header-left address a {display: block; overflow: hidden; width: 104px; height:12px; }

    header-left address a:before {content: url(/images/telefonLink.png); color: #FFF; font-size: 1px;}

    При выключенных картинках текста почти не видно в таком блоке!
    тк размеры блока маленькие – текст чуток вылезает как бы снизу

    Как решить?

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