Пользователь
0,0
рейтинг
10 декабря 2008 в 04:31

Разработка → Фоновый .png и IE 6 — принуждаем к миру.

Известен следующий баг «народного» браузера — картинки в формате .png, содержащие участки с альфа-прозрачностью отображаются неправильно. А именно — область этих участков заливается серым цветом (спасибо dreamhelg за лаконичное описание сути происходящего в данном случае).

Сегодня в в своей RSS-ленте обнаружил ссылку на очередную статью о конфронтации .png и IE. Воспринял ее, пожалуй, как и бóльшая половина удививших заголовок выше — с предубеждением (мол, опять двадцать пять). Тем не менее, выяснилось много интересного. Например, теперь фоновые .png отлично подчиняются свойствам background-position и background-repeat.

Сразу же отправлю всех любопытных на страничку с примерами и пояснениями. Реализуется все при помощи JavaScript, который создает и присваивает необходимому элементу страницы <DD_belatedPNG:rect/> (то есть наш .png «перерожденный» в VML).

Чтобы работало нужно:

  1. cкачать и подключить к HTML-документу JavaScript (на страничке с примерами есть две ссылки — на обычный и сжатый файлы);
  2. внутри HTML-документа запустить функцию (DD_belatedPNG.fix()), которой необходимо, в качестве параметра, передать селектор элемента, над которым мы проводим обряд манипуляцию.

Например:

<!--[if IE 6]>
<script type="text/javascript" src="DD_belatedPNG.js"></script>
<script type="text/javascript">
    DD_belatedPNG.fix('.png_bg, .other_class'); //пример подключения классов
</script>
<![endif]-->

Что особенного?

  • в отличии от других fixов не использует AlphaImageLoader, тем самым не создавая путаницы в порядках слоев (изменения z-index после применения фильтра);
  • как сказано выше теперь свойства CSS background-repeat и background-position работают;
  • заодно поддерживается доступ к стилю элемента через element.style и работа с псевдо-классом :hover;
  • скромный вес скрипта — 4 Кб в сжатом виде.

Недостатки:

  • нельзя в качестве селектора указывать <body>, в связи с ограничениями накладываемыми особенностью присвоения VML тому или иному DOM-узлу;
  • работа свойства background-position:fixed не проверялась;
  • будучи скриптом борящимся с «фоновыми» каверзами IE, он не помогает отображать .png полупрозрачным внутри тега ;
  • скрипт не работает пока с элементами таблиц <tr> и <td>.

Вообще, скрипт довольно сырой. Первая проба выпущена всего навсего три дня назад. Посему и дополнительные баги могут появиться и работа скрипта быть более ресурсоемкой, нежели хотелось бы. Тем не менее я думаю, что штука сделанная Дрю Диллером (Drew Diller, так зовут автора скрипта) будет интересна многим, оттого и написал эту кратенькую заметку.

UPD. Выпущена третья версия скрипта в которой исправлены некоторые недоработки. В том числе однопиксельные отступы слева и сверху, появление нежелательноых границ, скролов, а также добавлена возможность передавать функции несколько селекторов через запятую (см. пример кода выше).
frujo @frujo
карма
39,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (77)

  • +1
    Неуж-то теперь я смогу победить ИЕ6!!! :)
    *убежал тестить новый фикс…
  • +6
    Перепробовала множество фиксеров, остановилась на плагине к jquery pngFix. Всем он хорош, и background-repeat умеет делать, но только как-то уж очень коряво. Да и если в фоне множится png-картинка, время загрузки страницы значительно увеличивает. Я думаю нужно просто отказаться от фонового png в ие6, все надеюсь что он сдохнет в ближайшее время
    • +19
      Я бы даже сказал — Все надеются что он сдохнет в ближайшее время (ну или большая часть сообщества)
      • +1
        а я бы сказал, что не надеются, а страстно желают ему зла!
        (по кр. мере, я — желаю)
    • НЛО прилетело и опубликовало эту надпись здесь
  • +11
    Для ie6, с некоторых пор и с молчаливого согласия заказчиков, обхожусь связками гифов и джпегов (насколько возможно, имитируя полупрозрачность), а для остальных браузеров использую полноценный пнг. В итоге, пользователи устаревшего и, немного ущербного браузера, получают картинку чуть хуже чем остальные. Эдакий намек на обновление, ненавязчиво — «ваше ПО устарело». Все довольны.

    • +1
      Думаю, что пользователи «устаревшего и ущербного» никогда не увидят эти сайты в других браузерах, так что если они и подумают что-то плохое, то про саму графику, а уж никак не про браузер. Тут необходимы более кардинальные решения, например, на IE6 выдавать вместо сайта надпись «Смените браузер». Или намеренно верстать всё с использованием всех не поддерживаемых IE6 фич и приписывать: «Сайт оптимизирован для не-IE6» :)
      Понятно, что для продакшена себе такого позволить нельзя, но на персональных проектах — почему бы и нет? :)
      • +1
        Для меня отличным примером того как подтолкнуть пользователя к размышлениям на тему смены устаревшего браузера был сайт www.stuffandnonsense.co.uk (откройте при помощи 6-го ИЕ и другим браузером). По-моему славно :)
        • 0
          К сожалению, не могу заценить в полной мере, так как мой standalone IE6 не обрабатывает условные комментарии :( В коде мессадж почитал, да :)
          Но имхо для дизайн-студии это очень смелый шаг.
          • +3
            Специально для вас (кликабельно)! :)

            FF:


            IE6:
            • 0
              Спасибо!
              Зачётно сделали ребята, молодцы :)
    • +1
      Есть еще такой способ сделать то, о чем пишите. У всех кроме ИЕ будет полупрозрачность, у пользователей ИЕ — аналог GIF. :)
  • 0
    Стараюсь обойти использование прозрачностей максимально, ибо, с background-position научили работать iepngfix, но размер подключений оставляет желать лучшего… но это не самое плохое — хуже то, что страница до конца начинает грузиться из-за увеличивающегося кол-ва обращений к серверу в разы дольше.
    • –1
      про разы это вы загнули. да и какая нахрен разница? если пользователям ие6 срать на себя, свое удобство и безопасность, то неужели вы считаете, что необходимо их опекать и заботиться, делать им удобнее? думаю вряд ли. они этого увеличившегося времени на рендеринг даже и не заметят в большинстве своем.
      • 0
        Не знаю — я проверял у себя — было 8мь изображений с прозрачностью. После того как страница казалось бы загрузилась, слева внизу еще остается — осталось 100 объектов или как там. Т.е. в разы больше.

        Пользователи ИЕ, как правило, просто хотят получить тем, что у них есть информацию с того сайта, где эта информация есть — они как бы не при чем.
  • НЛО прилетело и опубликовало эту надпись здесь
  • +5
    Мне кажется, что часть статей страдает одними недостатками…
    В статье не описывается проблема.
    Например:
    1. Известный баг — то-то не работает с тем-то…
    2. Из ленты получил такую-то информацию…
    3. Вот мое решение данной проблемы…

    Вот именно первый пункт и в данной статье отсутствует.
    Я конечно понимаю — действует принцип «кто знает, тот поймет».
    Но я, например, не сталкивался с этим, и хочу узнать новое. А по тексту статьи не понимаю сразу проблему — приходится догадываться.

    Уважаемому автору — это не наезд, а просто совет или дельное замечание.
    Если не прав — уж простите :)
    • +3
      А хотите расскажу вместо автора?) Известный баг — это то, что картинки в формате .png, содержащие прозрачные участки, в браузере ie6, отображаются неправильно. А именно, область прозрачных участков заливается серым цветом. А статья рассматривает очередное решение этой проблемы на яваскрпте.
      • 0
        Спасибо, теперь ясно.
        Это было бы отличное предисловие к статье.
        Теперь гораздо интереснее :)
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          то есть можно имитировать прозрачность, задав нужный фон картинки?
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              спасибо за совет, этого я не знала
              • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Есть еще более интересный способ. Ознакомтесь на сайте cssing.org.ua
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Простите, не туда отправил. Хотел ответить сюда, а получилось вам. Вы абсолютно правы!
      • –2
        Вы немного не правы, с прозрачностью png в ИЕ 6 все нормально, а вот с полу-прозрачностью…
        • –2
          проблемы у ие с альфа-каналом, то бишь с пнг-24, не с пнг-8 да.
          • 0
            вообщето полупрозрачность и подразумевает 24-битный пнг
            • +1
              это не я вам минус поставил, я согласен что с пнг-8 никаких проблем нет! а полупрозрачность = альфа-канал
    • 0
      Я немного торопился «подарить шарик первым». Кроме того опасался накликать нашествие Капитана Очевидность :) Так или иначе, добавил кратенькое описание проблемы в начале топика.
      Спасибо, благодаря вам буду писать лучше.
      • 0
        данная проблема уже была решена около полугода.
        www.twinhelix.com/test/iepngfix.zip

        www.twinhelix.com/css/iepngfix/
        • 0
          К сожелению, данный фикc не позволяет работать со свойствами background-repeat и background-position.
          • 0
            А вы скачайте зип и сами проверьте )

            v2.0 Alpha 3: Alternatively, download the latest development code (updated 26 August 2008) at the Test Area, this includes support for background position and repeat.

            он все позволяет. если не нужно позиционирование подключается через бехэвиор в цсс, а если нужно, то еще и яваскрипт. И все ок, я сам наткнулся на него не так давно, но с тех пор использовал уже в нескольких проектах и проблем абсолютно никаких.
            • 0
              Я когда-то писал об этом способе на Хабре и у читателей возникло немало нареканий. С тех пор я более скептично к нему отношусь. Там не все столь гладко. Да и метод описываемый здесь использует абсолютно иной подход. Все решается не при помощи фильтра Explorerа, а при помощи VML. Это абсолютно новый взгляд на решение проблемы.
              • 0
                ну а преимущества перед фильтром какие? больше скорость обработки или что?
                • 0
                  В первую очередь это то, что используя фильтр не выйдет задать фон элементам формы. После его действия нарушится порядок слоев и обработанный фон «накроет» то, к чему он относится сверху, вместо того, чтобы оказаться внизу.
            • 0
              Ну, на счёт абсолютно никаких это вы зря. У меня возникали серьезные проблемы с производительностью при тайлинге небольших изображений. В моём проекте была горизонтальная тень — 1 x 20 пикселей. Страница грузилась за 30 секунд в «Not responding» браузере. Автор советует использовать *очень* длинные картинки. Исправил на 800 x 20 всё стало намного легче.
  • 0
    Именно сейчас это пригодилось бы мне, но лучше гифами обойдусь или вообще уберу пнг для тех кто использует ИЕ6.
    • 0
      У гифа совсем другое качество :(
      Лучше уже фикс :)
      • 0
        Да я бы вообще писал огромными буквами удали ИЕ6, так что гифы не пугают меня, лишь бы примерное что-то там было под этот, тормозящий процесс создания, браузер.
    • 0
      с гифами, впрочем как и с пнг-8 большая проблема, там появляются ореолы и никак не сделаешь полупрозрачность.
  • 0
    Кажется, это что надо, ушел тестить…
  • 0
    Скажите, как-нить через expression его можно включать?
    • 0
      А зачем, простите? Включайте через conditional comments.
      • 0
        не очень удобно отдельно в хтмл стили перечислять
    • 0
      во внешний js для IE6 на onload можно повесить.
      • 0
        на все селекторы?
        • 0
          А зачем их много делать? Можно сделать один класс .png и всюду его внедрить :)
        • 0
          вообще ступил, конечно, можно все нужные селекторы в одном месте перечислить… да это подходит…
  • 0
    Есть один неприятный баг

    thecosss.kanet.ru/stuff/pngbug.gif

    Используется пнг 100х100 и 2 дива один за другим, во втором диве черный фон. Никаких бордеров быть не должно… :(
    • 0
      Я думаю, это будет интереснее автору фикса, а не создателю топика :)
      • +1
        Багрепорт я уже отправил…
        • +1
          Кстати, скрипт развивается стремительно очень. Еще вчера была доступна вторая версия, а сегодня днем вышла третья его версия. Думаю все благодаря таким как вы.
    • 0
      На сайте автора появилась новая версия скрипта. В ней внесены изменения исправляющие указанные вами функциональные оплошности. Попробуйте еще разик.
  • 0
    Не заработало.
    В одном из трех применений показало, что-то похожее на ожидаемый результат, но всё съехало.
    Жаль, надежды были.
  • +1
    Очень интересная тема, спасибо за наводку!

    Держите нас в курсе, я думаю это многим будет интересно, к сожалению не нашел на сайте автора фидов(

    Кстати, с закругленными уголками, автор этого метода тоже пытается экспериментировать :)
    • +1
      На здоровье. :)
      Интересно, что существуя всего около 4-х дней скрипт стал достаточно популярным и даже очень авторитетные разработчики (как например Джонатан Снук) пророчат ему большое будущее.
      Также добавлю, что фид уже есть.
      • 0
        везде посмотрел есть ли фид, кроме страницы, которую хотел отслеживать)
    • 0
      да, перспективная вещь.

      впервые про этот способ узнал в блоге Bolk'a: bolknote.ru/2008/08/11/~1808, кстати он с blog.ad.by одновлеменно написали, у них прям соревнование по vml))
  • 0
    Вот неплохой jQuery плагин с хорошей совместимостью — iFixPng2. Меня полностью устраивает.
    • 0
      плагин хороший, но у меня почему-то png-24 картинками не хорошо показываются — с крестиком внутри, а png-8 фоном вообще исчезают со страницы
      • +1
        неправильно путь на прозрачный гиф прописали
        • 0
          точно ) спасибо!
          все работает )))
          *как я рад, как я рад!*
  • 0
    а я то думал что никто нарочно не поддерживает этого осла, что бы быстрей избавиться от него :(.
  • +1
    > А именно — область этих участков заливается серым цветом (спасибо dreamhelg ).
    Дак вот кто в этом виноват!
    • 0
      Да, забавно вышло. Испралюсь немедленно :)
  • 0
    Вот ещё один вариант борьбы с IE — PNG Behavior. :)
    • 0
      Он работает на основе фильтра ИЕ, поэтому несколько не из этой оперы, к сожеленинию.
  • –1
    Мы используем целый набор, примерно вот такой
    <script type="text/javascript" src="/lib/fancybox/jquery.pngFix.js"></script>
    ...
    <!--[if lt IE 7]>
    <![if gte IE 6]>
    <script type="text/javascript" src="/lib/fixpng.js"></script>

    <![endif]>
    <![endif]-->
    ...
    <!--[if lt IE 7]>
    <script defer type="text/javascript" src="/img/js/jwupf/ultimatepngfix_inline.js"></script>
    <script type="text/javascript" src="/img/js/jwupf/ultimatepngfix_bg.js"></script>
    <script type="text/javascript" src="/lib/jquery-1.2.3.min.js"></script>
    <![endif]-->
    <!--[if lte IE 6]>
    <script type="text/javascript" src="/img/js/pngfix/supersleight-min.js"></script>
    <![endif]-->



    Именно в таком сочетании — получается максимальный эффект. Пример реализации
    • 0
      Ого! Очень много всего.
    • 0
      У вас в примере зеленая полоска сверху в Safari рвется по краям. Не гуд.
    • 0
      У меня в IE6 страница тормозит просто жуть. При перелистывании «тарифные планы» или проекты — то изображение, которое должно спрятаться не прячется полностью. остается пикселей 5
    • 0
      так на всякий случай =)
      в опере 9,62 в верхней зеленой полоске закругленный углы не прижаты к краям
  • 0
    Спасибо, два дня мучался с проблемой, Ваш пост очень мне помог.
  • 0
    Первые впечатления очень положительные! Спасибо, надеюсь в дальнейшем не разочаруюсь.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.