Как стать автором
Обновить

Комментарии 131

Насколько я знаю, чужие посты публиковать нельзя.
Было бы хорошо, если бы вы написали точно, работает ли это в IE6/7; в противном случае использование этого приема сильно ограничено.

Еще интересно, не падает ли скорость загрузки страницы при повсеместном использовании этого приема. Ведь обычные картинки браузер кеширует, а сохраненные в css — вряд ли.
Так весь CSS кешируется.
или так duris.ru
НЛО прилетело и опубликовало эту надпись здесь
Зачем пятый то? :)
НЛО прилетело и опубликовало эту надпись здесь
Но если это и в пятом заработало после костыля — вы «злобный гений» верстки :)
Всмысле скорее «зачем шестой» :) Да и седьмой уже с приятной периодичностью сдает позиции.
С шестеркой столько воспоминаний *умиленно*
Я правда написал инже в каментах, но еще и здесь продублирую, для ie7 можно использовать mhtml — у него с ним проблем не будет.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Можно пример картинки, который нельзя засунуть в спрайт?
тянущиеся бекграунды?
А какие с ними проблемы? Я засовывал тянущиеся в спрайты.
Про Clip написали ниже — не везде работает, что плохо.
Я не про clip. Просто частенько элементы для которых используется бэкграунд с repeat-x, ограничены по высоте. В таком случае можно сложить в пачку несколько таких бэкграундов, в один спрайт, в который к тому же можно вставить и другие изображения.
Это вам не border-radius, которым как правило можно принебречь в IE.
А какие проблемы со спрайтами в IE?
PIE легко обеспечит border-radius в IE.
НЛО прилетело и опубликовало эту надпись здесь
Согласен с Вами и Psih'ом. Действительно не случай для спрайтов
Какая проблема? Ставим бэкграунд в самый верх спрайта, задаём положение отступом.

Не, я не спорю, что такие варианты бывают, но они очень редки.
НЛО прилетело и опубликовало эту надпись здесь
Панацея со вкусом Firefox'а :)
Самый главный вопрос в максимальной высоте элементов, к которым применяются эти фоны. Если это нечто невысокое (типа заголовков и других элементов), то вполне можно упаковать в спрайт.
И какие проблемы c clip? в IE он прекрасно работает, просто с маленькой особеностью. Для пнг (с фильтрами) часто использую. А проблема в запятых — уберите запятые, во всех браузерах не сломается а в IE заработает
Это назвается спрайты и это действительно на данный момент очень Хороший способ!
Не подходит для анимированных гифов.
так вроде же говорится о
мелких картинках, которые нельзя засунуть в спрайты
На сколько мелких? В спрайтах позиционирование с точностью в 1px.
НЛО прилетело и опубликовало эту надпись здесь
Выше Вы все правильно написали.
Хз, насколько это целесообразно. Время на разработку увеличивается (время = деньги), а эффекта почти нет. Но прикольно:)
Вам явно слово «оптимизация» не знакомо. Экономия запросов к серверу это святое. Мы например в продакшен версиях всегда спецальными самописными скриптами собираем минимизированную версию из девелоперской. В итоге если открыть исходный код, то там в секции голова будут все стили в разделе, все скрипты в разделе и дальше тело с ногами, всё без переносов строк, выглядит стрёмно, но работает быстро. Запросы делаются только на необходимые картинки непосредственно в теле, которые нет смысла кодировать в base64, хотя будь моя воля я бы к одному запросу на сервер всё сводил.
НЛО прилетело и опубликовало эту надпись здесь
Очень зря, что автор не привел реальный пример, чтобы все увидели, что пользоваться таким способом нужно очень осторожно.

Даже на маленькую картинку вы полчите кода в несколько метров, сильно сомневаюьс, что это украсит Ваш css файл.
Я про код писал! А не про конечный результат.
Насчет «нескольких метров» для маленькой картинки вы сильно преувеличиваете, посмотрите в примерах, что я скинул, а скорость загрузки сильно выше + gzip в помощь
> Насчет «нескольких метров» для маленькой картинки вы сильно преувеличиваете

Специально замерил, для картинки телефончика, что ниже при размере шрифта 11 pt нужно: почти 6 метром кода

Преувеличил?
Ок, согласен насчет осторожности при использовании такого метода, но в приведенных мною примеров гигантского размера я не увидел.
А Вы код смотрели? Первая же галочка тянет на:
2,5 метра кода
При тех же 11pt.

Остальные примерно также или больше.
А теперь представьте у нас 10 картинок и в итоге это выльется в 30 метров кода и что это хранить вместе с нашим основным CSS кодом? Но, постойте CSS отвечает за стили и хранить в нем 30 метров абракадабр как то не правильно.

Конечно, можно выделить отдельный файл images.css, чтобы убрать всю эту «красоту» в отдельный файл, но тогда на чем мы выигрываем?
2 CSS файла VS 1 CSS и 1 спрайт.
Специально для этого есть решения, позволяющие упаковывать ваши картинки в цсс при деплое на прод. Не вижу в этом проблем.
В том то и проблема, что Вы не видите.

Сервисы по упаковке, хорошо, а если он недоступен?

PHP скрипт с регуляркой, а Вы учитвали, что при этом возрастет нагрузка на web-сервер?

Вы не провели достаточное исследование.
Я не использую сервисы, в моем случае (это рельсы), есть такой инструмент ка jammit github.com/documentcloud/jammit, который как раз пакует картинки в цсс, помимо множества других плюшек.

Возможно для php есть что-то подобное, не берусь утверждать…

И пакует он это все перед деплоем на прод.
Вы предлагаете упаковывать при каждом клиентсокм запросе?
Нет, я предлагаю сделать настаящие исследование, чтобы действительно убедить людей использовать именно такой способ.
Какой же вы тупой.
Извините, я что-то не понял. Можете пояснить, где там 6 метров?
Перейдите по ссылке ниже!
Там одна страница текста. Где 6 метров?
Ответ: 32 строки * 18 см = 576 см, что примерно 6 метров.
Очень неожиданно, если честно )

Я просто не мог проверить до сего момента, то, что вы указывали в примерах и был крайне удивлен, результирующим кодом в 6 kb, а вы оказывается про длину говорили…
не kb, а mb — метрах, очепятка
Строчка в 18 см?!

Надо было хотя бы раз вставить тег irony…
Неужели только мне нравится, когда код красивый (это ведь все таки стили)? И в нем нету сотен строк абракадабр?
Если оно делается в автомате при deploy, то кому какая разница?
А у нас тут ещё 31 марта…
Спасибо, за поднятое настроение :)))
Вот посмотрите как будет выглядить код, для маленькой картинки:Посмотреть
А вот сама картинка:
image
Для цссок скорее подойдет большое количество маленьких изображений <= 1 kb, ну а потолок 32kb, поскольку восьмой ie их не переваривает.
НЛО прилетело и опубликовало эту надпись здесь
Эффект как раз есть. И вполне материальный:
— увеличивается время загрузки страницы
— поступает команда: «Сделать быстрее, чтоб всё было ОК»
— картинки прячутся в CSS, а его, в свою очередь, забирает к себе CDN и отдаёт быстро-быстро много-много

Имеем — довольных посетителей, довольных заказчиков, премии и т.п. за один день работы
Если какой-нибудь портал при этом станет грузиться на 5-10 секунд быстрее, то это, конечно, круто, полезно и нужно:) А если речь идет о миллисекундах, то ситуация совсем уже другая.
У некоторых пользователей одно HTTP-соединение может открываться порядка секунды. При плохих пингах до пользователя, но вменяемых скоростях соединения профит от вписанных картинок очевиден.
Очень сложный вопрос. Дело в том, что Base64 код вполне может весить больше, чем картинка в web-форматах.
gzip нивелирует эту разницу
НЛО прилетело и опубликовало эту надпись здесь
Это зависит от конкретной картинки!
Храните картинки на разных доменах и разных железках, это полезнее будет.
НЛО прилетело и опубликовало эту надпись здесь
Не знаю в который раз уже пишут о Data Uri (очень много...), но можно же было хоть в ~ 100500-ый раз написать, что собирать изображение в строку нужно автоматически, а не руками. Следовательно проблем со сложностью обновления изображений быть не должно. Да и sprit'ы можно тоже в Data Uri засовывать…
Я правильно понимаю, что для 5-7 IE мы добавляем костыль в виде скрипта, и количество запросов становится тем же?)
НЛО прилетело и опубликовало эту надпись здесь
Для ie7 есть вполне «нормально» решение.
иногда уменьшение результативного объема изображения на больших файлах.

Интересно как, если мне не изменяет память base64 увеличивает объем процентов на 30
Ага. Из каждых 3х байтов получаются 4.
В сыром http-запросе помимо всего прочего идет куча всякой фигни. За счет этого и получается экономия, но только для небольших файлов (навскидку, < 1 KiB).
Это обсуждалось столько раз и base64 и спрайты — и то и другое давно успешно применяется.
Что нового Вы открыли миру хабру?
Автор ничего не открыл. И более того, не достаточно хорошо изучил вопрос. Изначально не привел никаких сведений о реальном изменении размера изображений до кодирования и после него, о замере времени реальной загрузки и т.д.
НЛО прилетело и опубликовало эту надпись здесь
Тогда удовлетворите наше любопытство и сделайте настоящее исследование расставив хоть какие-то точки над и. Например, вот так:
  • Необходимо будет решить вопрос с размером картинок. Во первых изучить алгоритм Base64. Пережать, скажем сотню картинок. Выявить закономерности (Например, если в картинке есть градиент, то она скорее всего увеличится). Оформить графики. Сделать Выводы.
  • Отобрать набор тестовых картинок (желательно разнотипных, типы должны появится из первого эксперемента). Загружать сайты с картинками с различных Web-серверов, машин, браузеров, в разное время суток в виде отдельных картинок, спрайтов, css. Оформить графики. Сделать Выводы.
  • Изучить нагрузку на Web-сервер без перекодирования и с кодирование картинок в Base64. Сделать Выводы.
  • Подвести общие итоги. Выписать плюсы и минусы. Дать конкретные рекомендации к каким картинкам и в каких случаях лучше применять этот метод, а в каких не стоит

Конечно, можно еще много чего добавить. Например, обзор сервисов (инструментов) для упоковки картинок в css.

Вот это было бы интересно.
НЛО прилетело и опубликовало эту надпись здесь
Base64 не занимается сжатием. Он просто перегруппировывает набор битов из групп по 8 в группы по 7 битов (очень упрощенно выражаясь), которые потом представляются в виде букв, цифр и пары спецсимволов. Таким образом, размера полученной последовательности можно прбилизительно оценить как originalSize*8/7.

Так что первые 2 пункта вроде как не нужны. Нагрузка на веб-сервер — это уже интереснее, хотя тут все-таки слишком много вариантов, но опять-таки все уже давно обсудили и даже тут на хабре =)
НЛО прилетело и опубликовало эту надпись здесь
Хорошо начало положено, только вот а где спрайты?
Все это должно быть в топике, а не в комментах. И блог выбрали правильно, так предшественников почитайте. И основоположника клиентской оптимизации на хабре sunnybear к примеру — его сайт www.webo.in
Да, только не в таком виде. На webo.in и небольшой видеокурс есть по клиентской оптимизации. Автору можно и его рекомендовать.
Для мобильных браузеров с отключенными картинками этот вариант плох: придется качать весь css файл
НЛО прилетело и опубликовало эту надпись здесь
Поговорим по этому поводу через пять лет, ок? Занесите в календарь напоминалку.
Еще год остался.
Полагаю, вопрос уже исчерпан. Даю новый прогноз. Еще пять лет и десктопы останутся только в памяти большой цивилизации. Интернет есть всё и интернет есть везде.
И на чём Вы будете кодить?
НЛО прилетело и опубликовало эту надпись здесь
Сравниваю 2 диаграмы загрузки ресурсов и не могу понять, как на второй base64 изображения начали грузиться одновременно со страницей. И как вообще в таком случае определено понятие «загрузки» изображений, если они — часть css?
НЛО прилетело и опубликовало эту надпись здесь
Я вижу еще значительные недостатки, которые не указаны в статье:
1. Чтобы не потерять в удобстве расширения и изменения макета/стилей нужно писать некий скрипт, который бы парсил CSS-ы и подменял URI фоновых картинок на их base64 эквиваленты, а потом заменял подключение developer-friendly CSS-ов на сгенерированные.
2. Если одно изображение используется несколько раз возникает значительная избыточность.
3. Если рассматривать подход без использования base64, то сначала загружается HTML — рендерится разметка, следом CSS — применяются стили разметки (размеры, колонки, шрифты, бла-бла), а потом уже загружаются фоновые изображения, дополняя страницу деталями. В данном случае зачастую первых двух действий относительно достаточно для взаимодействия пользователя со страницей.
В случае с base64 значительно увеличивается размер CSS файла, замедляя загрузку стилей разметки, замедляя тем самым рендеринг макета и изменяя логичный (по моему мнению) ход вещей.
НЛО прилетело и опубликовало эту надпись здесь
Гораздо, это во сколько?
Вам же написали, логика немного страдает. Сначала разметка, затем стили. Все правильно и логично, достаточно для того, чтобы клацнуть по рубрикатору или «на главную». Затем картинки.
В случае картинок в css, стройная система слегка смещается.
Да и почему Вы почему так напуганы соединениями?
> Да и почему Вы почему так напуганы соединениями?

Соединение с сервером одна из самых затратных операций. Чем меньше соединений, тем быстрее грузится сайт. Да и на сервер нагрузка меньше.
НЛО прилетело и опубликовало эту надпись здесь
А как отключить картинки? В смысле теперь при отключении картинок трафик не экономится.
Кстати, да, любопытный вопрос. Имею большой опыт сидения на дорогом жпрс-е.

Поразмышлял — выходит даже плюс. Ясно же, что в CSS имеет смысл засовывать мелкие картинки: значки, кнопки, пиктограммки, скругленные уголки и т.п. Они много не весят и вполне посильны даже для мобильной связи. И самое главное, зачастую без них макет выглядит неполноценно — непонятно куда можно кликать, теряются иконки статусов и т.д. (хотя отчасти это вопрос аккуратности разработчика). Зачастую хочется как раз эту копеечную мелочь врубить, оставив отключенными большие картинки основного контента.

Но дело в том, что если обычную картинку (тег IMG) можно легко посмотреть через команду контекстного меню, то изображение, подстеленное через css::background, отдельно просмотреть невозможно! Только включив вообще все картинки. Ну если не рассматривать варианты с файрбагом и копание в исходниках.
Давно пользуюсь data:url и могу сказать что все описанные недостатки нивелируются достоинствами этого метода оптимизации при его правильном использовании. Я имею в виду использование «быстрых» css селекторов, группировку селекторов при подключении одного изображения в разных местах, gzip сжатие. Время до показа страницы может немного и увеличивается, но незначительно и в большинстве случаев после этого человек получает уже практически полностью загруженную страницу и общее впечатление остается лучше чем когда страница грузится постепенно.

А на счет большого времени при изменении дизайна я категорически не соглашусь. Если сравнить время на изменения в дизайне при использовании data:url и его аналога css-спрайтов. То тут и обсуждать нечего data:url быстрее и удобнее. И это если еще не брать во внимание ограничения которые накладывает использование css-спрайтов. Я до сих пор с ужасом вспоминаю случаи когда заказчик просил внести большие изменения в спрайт из 40+ изображений.
А как в случае с IE < 8 происходит работа? Там же ведь по сути не css, а значит надо будет писать еще один css, в котором картинки подключаются обычным образом. И кстати картинки, то в таком случае не станут дергаться с сервера?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
До / после
Увеличил объём данных в 2 раза, зато уменьшили число запросов в 50 раз.
Понятно, что станет лучше.

Вообще, у меня есть идея как оценивать такие штуки чисто теоретически.
Смотрим цены на запросы и трафик, например, на Amazon S3 и считаем, что выгодней по деньгам. Где по деньгам выгодней — там и нагрузка будет меньше, скорей всего.
НЛО прилетело и опубликовало эту надпись здесь
Я и не говорил, что всё. Но с такими соотношениями для 99% сайтов data/uri будет точно выгодней. Хотя совсем не исключено, что спрайты будут еще выгодней.
> Кодируем изображение в base64 с помощью онлайн сервисов

Вот этого не надо IMHO советовать. Мало ли какой эксплойт они там подсунут/подмешают.

Лучше добавьте ссылку на удобный инструмент, которым легко пользоваться у себя.
Только для автоматической, так называемой, компиляции css, исходники имхо должны оставаться поддерживаемыми
Спасибо, у меня в текущем проекте как раз много мелких иконок.
Написал себе python-скрипт для конвертации url("../path") в url(data:image/png;base64, data)
а что значит «картинки нельзя засунуть в спрайты»?
OK, а как тогда определённый слой SVG таким образом использовать?
Допустим, мы упаковали SVG в base64, прописали правильный mime (image/svg+xml), а как слой тогда указать (было, например, filters.svg#superslice).
Вот монстры интернета, например, Google и Apple на своих сайтах используют спрайты. Думаю лучше использовать именно их. Еще и редактировать удобно (в какой-то мере) — открыл один файл и правишь львиную часть дизайна. Удобно.
Emmet, который есть почти для всех популярных редакторов, кроме чудесного Zen coding в том числе умеет по шорткату конвертировать изображения в base64. В Coda 2 — курсор в любое место URL с изображением, Ctrl+I и готово.
Вот это раньше холивары были!)) А ведь эту статью могут найти в поиске до сих пор и прочитать и пойти делать всё из неё..))

Хотел бы я посмотреть на придурка, который будет без проверки использовать советы восьмилетней давности. Впрочем, нет, не хотел бы.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории