- Implementing image sprites in CSS
- Implementation
- See also
- Found a content problem with this page?
- CSS-спрайты
- Шаг 1. Использовать background
- Шаг 2. Объединить изображения
- Шаг 3. Показать часть спрайта в «окошке»
- Шаг 4. Сдвинуть спрайт
- Отступы
- Итого
- CSS спрайты: основные техники и полезные инструменты
- Применение на практике
- До или после?
- Организация элементов дизайна
- Полезные инструменты
- Полезные сервисы
- Как использовать спрайты CSS?
- Навигация по статье:
- Что такое спрайты css и зачем они нужны?
- Зачем использовать CSS спрайты?
- Использование CSS спрайтов для создания эффектов при наведении
Implementing image sprites in CSS
Image sprites are used in numerous web apps where multiple images are used. Rather than include each image as a separate image file, it is much more memory- and bandwidth-friendly to send them as a single image; using background position as a way to distinguish between individual images in the same image file, so the number of HTTP requests is reduced.
Note: When using HTTP/2, it may in fact be more bandwidth-friendly to use multiple small requests.
Implementation
Suppose an image is given to every item with class toolbtn :
.toolbtn background: url(myfile.png); display: inline-block; height: 20px; width: 20px; >
A background position can be added either as two x, y values after the url() in the background, or as background-position . For example:
#btn1 background-position: -20px 0px; > #btn2 background-position: -40px 0px; >
This would slide the starting point of the background image for the element with the ID btn1 20 pixels to the left and the element with the ID btn2 40 pixels to the left (assuming they have the class toolbtn assigned and are affected by the image rule above).
Similarly, you can also make hover states with:
#btn:hover background-position: px px; >
See also
Found a content problem with this page?
This page was last modified on May 29, 2023 by MDN contributors.
Your blueprint for a better internet.
CSS-спрайты
CSS-спрайт – способ объединить много изображений в одно, чтобы:
- Сократить количество обращений к серверу.
- Загрузить несколько изображений сразу, включая те, которые понадобятся в будущем.
- Если у изображений сходная палитра, то объединённое изображение будет меньше по размеру, чем совокупность исходных картинок.
Рассмотрим, как это работает, на примере дерева:
Сейчас «плюс», «минус» и «статья» – три отдельных изображения. Объединим их в спрайт.
Шаг 1. Использовать background
Первый шаг к объединению изображений в «спрайт» – показывать их через background ., а не через тег IMG .
В данном случае он уже сделан. Стиль для дерева:
.icon < width: 16px; height: 16px; float: left; >.open .icon < cursor: pointer; background: url(minus.gif); >.closed .icon < cursor: pointer; background: url(plus.gif); >.leaf .icon
Шаг 2. Объединить изображения
Составим из нескольких изображений одно icons.gif , расположив их, например, по вертикали.
Из , и получится одна картинка:
Шаг 3. Показать часть спрайта в «окошке»
А теперь самое забавное. Размер DIV для иконки – жёстко фиксирован:
Это значит, что если поставить в качестве background объединённую картинку, то вся она не поместится, будет видна только верхняя часть:
Если бы высота иконки была больше, например, 16×48 , как в примере ниже, то было бы видно и остальное:
…но так как там всего 16px , то помещается только одно изображение.
Шаг 4. Сдвинуть спрайт
Сдвиг фона background-position позволяет выбирать, какую именно часть спрайта видно.
В спрайте icons.gif изображения объединены так, что сдвиг на 16px покажет следующую иконку:
/*+ no-beautify */ .icon < width: 16px; height: 16px; float: left; background: url(icons.gif) no-repeat; >.open .icon < background-position: 0 -16px; /* вверх на 16px */ cursor: pointer; >.closed .icon < background-position: 0 0px; /* по умолчанию */ cursor: pointer; >.leaf .icon < background-position: 0 -32px; /* вверх на 32px */ cursor: text; >
- В спрайт могут объединяться изображения разных размеров, т.е. сдвиг может быть любым.
- Сдвигать можно и по горизонтали и по вертикали.
Отступы
Обычно отступы делаются margin/padding , но иногда их бывает удобно предусмотреть в спрайте.
Тогда если элемент немного больше, чем размер изображения, то в «окошке» не появится лишнего.
Пример спрайта с отступами:
Иконка RSS находится в нём на координатах (90px, 40px) :
Это значит, для того чтобы показать эту иконку, нужно сместить фон:
background-position: -90px -40px;
При этом в левом-верхнем углу фона как раз и будет эта иконка:
Элемент, в котором находится иконка (в рамке), больше по размеру, чем картинка.
Если бы в спрайте не было отступов, то в такое большое «окошко» наверняка влезли бы другие иконки.
Итого
Решение лучше всего принимать, исходя из принципов семантической вёрстки.
Задайте вопрос – что здесь делает изображение? Является ли оно самостоятельным элементом страницы (фотография, аватар посетителя), или же оформляет что-либо (иконка узла дерева)?
Элемент IMG следует использовать в первом случае, а для оформления у нас есть CSS.
- Сократить количество обращений к серверу.
- Загрузить несколько изображений сразу, включая те, которые понадобятся в будущем.
- Если у изображений сходная палитра, то объединённое изображение будет меньше по размеру, чем совокупность исходных картинок.
Если фоновое изображение нужно повторять по горизонтали или вертикали, то спрайты тоже подойдут – изображения в них нужно располагать в этом случае так, чтобы при повторении не были видны соседи, т.е., соответственно, вертикально или горизонтально, но не «решёткой».
Далее мы встретимся со спрайтами при создании интерфейсов, чтобы кнопка при наведении меняла своё изображение. Один спрайт будет содержать все состояния кнопки, а переключение внешнего вида – осуществляться при помощи сдвига background-position .
CSS спрайты: основные техники и полезные инструменты
Использование CSS-спрайтов на сайте позволяет повысить производительность и грамотно организовать элементы интерфейса.
Sprite Sheet — это одно большое изображение мелких графических элементов сайта, например иконок или кнопок. И благодаря CSS можно отображать каждый элемент отдельно.
Применение на практике
Главным преимуществом использования спрайтов является однократная загрузка сервером сразу всех элементов в одном файле. некоторые могут подумать, что подгрузка маленьких, мало весящих картинок позволяет увеличить производительность сайта, но это не так — случае отдельных изображений увеличивается количество HTTP-запросов. Также, при использование единого спрайта позволяет уменьшить вес графики. Пример спрайта на сайте webdesign tuts:
Пример кода для использования спрайтов на странице (демонстрация):
#navlist #navlist li #navlist li, #navlist a #home #home #prev #prev #next #next
Также спрайты часто используют для создания простого и кроссбраузерного hover-эффекта (демонстрация):
#navlist #navlist li #navlist li, #navlist a #home #home #home a:hover #prev #prev #prev a:hover #next #next #next a:hover
До или после?
Существует два подхода при подготовке спрайтов: до и после разработки сайта. В первом случае все мелкие картинки интерфейса компилируются в один файл на финальном этапе создания сайта. В этом случае удобно редактировать отдельные изображения, а также использовать их отдельно, если это необходимо. Такой способ подходит больше начинающим веб-дизайнерам.
Более опытные разработчики готовят спрайты на начальном этапе, это позволяет лучше организовать графику будущего дизайна, а также готовить PSD-шаблон к верстке.
Организация элементов дизайна
При подготовке файла со спрайтами стоит максимально уплотнить изображения, а если они одинакового размера (например иконки) — создать сетку, благодаря которой упростится использование спрайтов на сайте:
Готовить файл следует таким образом, чтобы будущие изменения в нем не влияли на расположение уже существующих элементов, иначе придется править весь CSS. PSD-файл со спрайтами обязательно должен быть хорошо маркирован: необходимо понятно называть все слои и группы, а также стараться не сливать слои, которые в будущем могут быть изменены.
Полезные инструменты
Compass — отличный фреймворк, который умеет создавать спрайты из папки с изображениями. Также использует Sass.
Lemonade — инструмент, позволяющий создавать файлы со спрайтами простым добавлением строчки кода в Sass-файлы.
SpriteMe — букмарклет, который умеет генерировать и просматривать использованные на сайте спрайты.
Вот как выглядит рабочий слой букмарклета:
Fireworks CS6 — последняя версия включает функцию генерации спрайтов.
Полезные сервисы
Spritepad — drag-and-drop сервис для создания спрайтов
Sprite Cow — сервис для удобной «нарезки» подготовленного вручную файла со спрайтами
Glue — командная строка для генерации спрайтов
CSS Sprites — еще один генератор, с расширенными настройками
SpriteRight — приложение-генератор для Мака
Как использовать спрайты CSS?
Вы уже используете css спрайты на своих сайтах? Если ещё нет нет, или только начинаете то эта статья для вас. В ней вы узнаете что это такое, зачем они нужны, почему их нужно использовать и как это правильно делать.
Навигация по статье:
Что такое спрайты css и зачем они нужны?
Спрайт представляет собой одну большую картинку, на которой объединены несколько других более мелких.
Используется эта картинка для задания фона для элементов на сайте при помощи CSS.
Для того чтобы задать для нужного блока определённую область спрайта используется позиционирование фона.
Например:
Допустим у нас есть 2 ссылки для которых нам нужно указать в качестве фона соответствующие социальные сети.
Вёрстка будет выглядеть так:
Теперь давайте загрузим спрайт с несколькими изображениями соцсетей на хостинг и в CSS зададим для них фон.
Для задания фона мы используем большое изображение с несколькими картинками и при помощи CSS свойства background-position смещаем фон как нам нужно.
При этом сначала мы указываем смещение по горизонтали и по вертикали.
Отрицательное значение говорит о том что фон смещается вверх и влево. Если нужно сдвинуть вниз или вправо то используем положительные значения.
Для второго блока это будет выглядеть так:
По сути всё то же самое, но меняется только значения CSS свойства background-position.
Раз уж мы заговорили об оптимизации, то имеет смысл присвоить всем элементам, для которых мы будем использовать спрайты CSS один общий класс. Это связано с тем что ряд CSS свойств у этих элементов будет повторяться (высота, ширина, фон и т.д.) и чтобы не писать их много раз для каждого элемента можно задать их сразу для всех один раз.
Вёрстка будет выглядеть так:
А так будет выглядеть CSS:
Зачем использовать CSS спрайты?
Согласитесь, использование спрайтов идея конечно интересная, но довольно хлопотная в реализации. И если бы у них не было преимуществ то навряд ли их бы кто-то использовал.
- позволяют уменьшить время загрузки за счёт того что обращение к серверу для загрузки изображения происходит только один раз. Когда у вас для каждого элемента задаётся отдельное фоновое изображение, то при загрузке страницы каждого изображения происходит обращение к серверу.
- Нужно потратить определённое время на создание такого объединённого фонового изображения.
- Сложнее задавать фон так как нужно вычислять значения для смещения.
- Для того чтобы добавить, удалить или изменить одно изображение приходится править весь спрайт.
Использование CSS спрайтов для создания эффектов при наведении
Если вы решите создать эффект смены фонового изображения для элемента при наведении, то столкнётесь со следующей проблемой.
При первом наведении на элемент после загрузки страницы фоновая картинка как бы мигает при смене. Данная проблема наблюдается не всегда, но в большинстве случаев.
Для решения этой проблемы делаем следующее:
- 1. Подготавливаем спрайт с двумя картинками