Добавить изображение на страницу можно не только стандартным способом, указав путь к файлу, но и разместив картинку в теле документа или таблице стилей.
Как это работает?
Для того, чтобы разместить изображение непосредственно в теле документа необходимо воспользоваться схемой data:URI.
data: URI — это определённая стандартом RFC 2397 схема, которая позволяет включать небольшие элементы данных в строку URI, как если бы они были ссылкой на внешний ресурс.
Схема представляет собой текстовую строку следующего формата
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
[<MIME-type>]
— спецификация типа носителей данных. Например image/gif или text/plain;
[;charset=<encoding>]
— кодировка;
[;base64]
— формат, которым произведено кодирование;
<data>
— закодированные данные.
Рассмотрим замену ссылки на изображение кодом base64.
Селектор до внесения изменений:
.icon {
background: url(android.png);
width: 64px;
height: 64px;
}
После кодирования изображение выглядит как последовательность символов:
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUVCQUY3QUU0QUVGMTFFNTk4QjRDQjA2QkJBMTM1RDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUVCQUY3QUY0QUVGMTFFNTk4QjRDQjA2QkJBMTM1RDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5RUJBRjdBQzRBRUYxMUU1OThCNENCMDZCQkExMzVEOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5RUJBRjdBRDRBRUYxMUU1OThCNENCMDZCQkExMzVEOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiS4gvAAAAKLSURBVHja7JuNVcIwEIAPnwPECewIOIEZwQ1gA9jAsgEj4ATqBNQJ6AaUCWCDmjyvz7zSNP8Q9O69e6Jtjruvd0kaE2jbFlSNIJXQOcQXafMj1MhZvAkALIUehRYRgy/Q5vIWAEiphW4jAthiZkFsAPeQRmS67oS+DKStfJqP+LNQgJ2EHoQ2A7a40KcknibKACmlUgozoe/4e2vQI947U1K/TBZvQgDMIlhbZakA3CUqgVeh+4j29mgz+xJg2GG1iXQbmg0pS2BqWeOhesTvygpAcaHgVQhFLgAYDnl9JxvsvTcBgW7QRjNwbedTDikArDXOc+WejWfwnXDNPetrjwKyFheaa02g7ZPmsyqL4Cl3YAaMPVmZos/opG8JLNDGzjJTnOOd9IOeTCYutX+EPORhJEvOAKgSUgIc8hFvXwhAYAeYi0yvAeBPyL8HYDMMshsOj4WsCJU4DjNlxrdShps5ruzkIAdlPsDw1XmpTKI6360zoBx5He2kuuDLj0krC79K23cB00oOzxgAN60s2bwLmIYUnnHNm3yb0ihAAAgAASAABIAAEAACQAAIAAEgAASAABAAAjDwt9rQpso4nsr1+hAAuYq60hj4vAEAX5prTqvCUpYIo4XfpWXW+7IcV4UZ+tr53oCyxTbmDpFcAYzKpfYJ0ijwHwBUmXV+fhLQBxRKR3NNPYHDRqnY2+Q4DO/hu5Q24PifqpibpPrZoD6FOfxsd9fJG5zv7nJt04DHVrx+vLEOTPSd4Rb3VwPZ5NqGRgECQAAIAAEgAAQgPwCmCUrtsRJVJ/E00bnBqWEKW2hmk65twuNNeHBSd5SmHGlTQqSjMTkA6JbVagyiBrvT3z5tvAF8CzAAFmQSikZU7rwAAAAASUVORK5CYII=
Полный код селектора выглядит следующим образом:
.icon {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUVCQUY3QUU0QUVGMTFFNTk4QjRDQjA2QkJBMTM1RDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUVCQUY3QUY0QUVGMTFFNTk4QjRDQjA2QkJBMTM1RDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5RUJBRjdBQzRBRUYxMUU1OThCNENCMDZCQkExMzVEOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5RUJBRjdBRDRBRUYxMUU1OThCNENCMDZCQkExMzVEOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiS4gvAAAAKLSURBVHja7JuNVcIwEIAPnwPECewIOIEZwQ1gA9jAsgEj4ATqBNQJ6AaUCWCDmjyvz7zSNP8Q9O69e6Jtjruvd0kaE2jbFlSNIJXQOcQXafMj1MhZvAkALIUehRYRgy/Q5vIWAEiphW4jAthiZkFsAPeQRmS67oS+DKStfJqP+LNQgJ2EHoQ2A7a40KcknibKACmlUgozoe/4e2vQI947U1K/TBZvQgDMIlhbZakA3CUqgVeh+4j29mgz+xJg2GG1iXQbmg0pS2BqWeOhesTvygpAcaHgVQhFLgAYDnl9JxvsvTcBgW7QRjNwbedTDikArDXOc+WejWfwnXDNPetrjwKyFheaa02g7ZPmsyqL4Cl3YAaMPVmZos/opG8JLNDGzjJTnOOd9IOeTCYutX+EPORhJEvOAKgSUgIc8hFvXwhAYAeYi0yvAeBPyL8HYDMMshsOj4WsCJU4DjNlxrdShps5ruzkIAdlPsDw1XmpTKI6360zoBx5He2kuuDLj0krC79K23cB00oOzxgAN60s2bwLmIYUnnHNm3yb0ihAAAgAASAABIAAEAACQAAIAAEgAASAABAAAjDwt9rQpso4nsr1+hAAuYq60hj4vAEAX5prTqvCUpYIo4XfpWXW+7IcV4UZ+tr53oCyxTbmDpFcAYzKpfYJ0ijwHwBUmXV+fhLQBxRKR3NNPYHDRqnY2+Q4DO/hu5Q24PifqpibpPrZoD6FOfxsd9fJG5zv7nJt04DHVrx+vLEOTPSd4Rb3VwPZ5NqGRgECQAAIAAEgAAQgPwCmCUrtsRJVJ/E00bnBqWEKW2hmk65twuNNeHBSd5SmHGlTQqSjMTkA6JbVagyiBrvT3z5tvAF8CzAAFmQSikZU7rwAAAAASUVORK5CYII=");
width: 64px;
height: 64px;
}
Плюсы
Изображения доступны сразу
Если в проекте есть два изображения, показывающих обычное состояние и состояние при ховере, то, скорее всего, при наведении курсора первое изображение пропадет, а второе отобразится только через некоторое время.
Это происходит потому что изображение для ховера загружается только в момент совершения события. Браузеру требуется некоторое время для того, чтобы обратиться по ссылке, получить картинку и отобразить ее на странице.
В случае с использованием кодирования все изображения загружаются вместе с CSS, так как являются его частью.
Отсутствие лишних запросов
У браузеров есть ограничение на количество одновременных подключений к серверу. Как правило, это число в диапазоне от 4 до 6. Если изображения находятся внутри тела документа то освободившиеся подключения становятся доступными для загрузки другого контента.
Минусы
Размер
При кодировании размер изображений увеличивается. Больше всего “прибавляют в весе” небольшие картинки.
Сравнение размеров обычного png файла и файла содержащего base64 код.
Закодированное изображение стало тяжелее более чем на 34%.
Обновление
Поддерживать ресурс у которого много изображений «зашито» в css — проблематично.
К счастью, с появлением препроцессоров и сборщиков проектов эта проблема не стоит так остро.
- Кодированное изображение не наглядно: посмотреть чем на самом деле является конкретная вереница символов можно, разве что, в инспекторе элементов, в браузере.
- Для внесения изменения нужно модифицировать исходник и повторно его кодировать.
Internet Explorer 8
Если вам приходится поддерживать данный браузер, то у вас могут возникнуть проблемы. У браузера имеется ограничение на длину uri. Оно равно 32Кб, “лишние” данные будут просто обрезаться. В IE 9 данное ограничение уже равняется 4Гб.
Чем кодировать?
Для кодирования изображений можно воспользоваться: