личный блог Миши Cheerful’a

CSS Sprites или «Вся графика 1 картинкой»

5 мая 2010 в 12:57

Это типа урок) Я толком никогда не писал уроков, но сейчас решил сделать это, потому что ничего хорошего не нашел на тему css спрайтов в рунете.

Что такое CSS Sprites?

Наверняка встречали случаи, когда хотели скачать какую-то иконку с какого-нибудь сайта, а вместо одной нужной вам иконки скачивалась картинка с несколькими изображениями. Так вот это и есть css sprites — картинка, состоящая из нескольких графических элементов сайта. Т.е. мы берем всю постоянную графику сайта и засовываем в один общий png.

Зачем это делается? С первого взгляда может показаться, что это не удобно?Делается это для ускорения работы вашего сайта, путем уменьшения запросов к серверу. Он запросил один раз одну картинку — и вся графика загрузилась за один подход. Лично моё мнение, что это важно для крупных проектов с большой посещаемостью, чтобы пользователи наслаждались серфингом, а не ждали по 5 секунд открытие очередной страницы.

И насчет удобства. Я сперва тоже подумал, что не удобно как-то. Но на практике оказывается наоборот. Я думаю, теперь это станет для меня основным способом верстки.

Как использовать CSS Sprites?

Отображение только нужного вам фрагмента происходит путем указания нужных координат в пикселях.

Использовать спрайты можно в свойстве background, внутри div’ов, стилей и т.д.

Вы не можете вставить нужный фрагмент используя тэг img.

Давайте разберем принцип работы спрайтов на конкретном примере.

Допустим у нас есть 4 пиктограммы. В фотошопе скидываем их в один файл и делаем save for web в формате png-24

Хорошо. Теперь нам нужно сделать из «плюса» и «минуса» кнопки-ссылки.

Для этого в подключенный к вашему сайту CSS файле создаем стиль «plus» и прописываем ему нашу картинку плюса:

.plus {
display:block;
width:9px;
height:9px;
background:url(img/sprite.png) no-repeat scroll -10px 0px;
float:left;
}

Где sprite.png — общая картинка с 4-мя пиктограммами.

Важно всегда указывать точные значения ширины и высоты (width и height), иначе элементы будут обрезаны.

Обратите внимание на свойство background. В конце «-10px 0px» — это и есть координаты нашего плюса. Первое значение X, второе Y, т.е. отступ по горизонтали и вертикали, соответственно. По вертикали отступа у нас не должно быть, потому что иконка прижата к верхнему краю. А по горизонтали нам нужно «пропустить» иконку минуса и захватить границей 9 на 9 px (width:9px; height:9px;) нужный нам плюс. Вот картинка для пояснения.

Надеюсь, всё понятно)

Еще хочу рассказать об одной детали с которой столкнулся сам: если у вас есть какие-то фоновые изображения, которые растягиваются, то для них лучше создать отдельный спрайт, потому что в них важно, чтобы они упирались в левый и правый край (при repeat-x). А ваш основной спрайт может быть довольно широким и по причине экономии веса нету смысла такую большую колбасу вашей подложки вставлять туда. Сделайте отдельный png с ними. Вот например:

И тогда код для третьей сверху розовой плашки будет такой:

#pinkline { height:30px; width:299px; background: url(img/linebg.png) repeat-x scroll 0 -81px; }
Ну вот в целом и всё. Есть вопросы - задавайте, будем дописывать урок на ходу)
 
Комментарии:
  1. Ну для блогов ж это не используется? Или как?

  2. Ну эт надо когда сложное и тяжелая картинка подгружается, а если легкая . то и так пойдет жа)

    • да нет, суть не в весе.
      Вот наглядный пример:
      Тебя мама послала в магазин купить 10 разных булок. И вот ты пошел, купил первый вид булки, понес её домой. Пошел за второй булкой, купил, принес домой. Пошел за 3й. И так далее. Точно так же происходит при стандартной верстке картинок.
      А если ты пойдешь, купишь сразу 10 видов булок, положишь их в пакет и дома уже разложишь их на столе, то это будет css Sprite :)
      Тебе же не обломно было нести сразу 10 булок, не так уж и тяжело? Скорее обломнее было бы 10 раз ходить туда сюда. Вот так же и тут. Суммарный вес примерно один (в случае спрайтов даже поменьше будет), а количество запросов к серверу сокращается в разы.

  3. угу, мне тоже понравился))

  4. Классная вещь, нужно пробовать. И еще отличный дизайн, чувствуется художественный вкус. Желаю Вам в ходе марафона найти кучу друзей и перспективных заказчиков. Заглядывайте на огонек на http://opytnaya.ru/

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

  6. Полезная статья! Всегда думал что к чему в комбинировании иконок в один файл, а тут сразу все стало ясно:)

    Спасибо и удачи на марафоне!)

  7. Если я не ошибаюсь, то первая координата по высоте, а вторая по ширине спрайта(картинки).
    Нужно только каждый пиксель посчитать, чтобы не съехало никуда..

  8. igrun:

    Результаты для этой страницы:

    Page Speed Score: 58/100

    Remove unused CSS
    Use efficient CSS selectors

    Оптимизируй свой сайт сначала!!!

  9. Есть специальные сервисы: делают спрайты автоматом..

  10. Михайл, спасибо вам за этот урок. Вы так все мастерски и понятно объяснили, что я это не просто тупо запомнил, а ОСОЗНАЛ! У вас определенно есть талант преподавателя — объяснить так, что все понятно! Огромное вам спасибо! :)))

  11. vlad:

    Класс! просто, быстро и лаконично — я все понял сразу и легко! Спасибо!
    про css sprites я кстати узнал, вы будете смеяться, на goodfuckingwebdesignadvice. Там же один из советов — не пользуейте Dreamweaver — не знаете случайно почему?

    • Рад, что помогло)
      А дримвивер. Не знаю, я пользуюсь в режиме кода, когда верстаю сайт, потому что он подсказывает тэги и их свойства, мне это удобно, т.к я не такой уж прям бывалый верстальщик.

  12. Классно написанная статья )))
    Спасибо за труд, теперь мне стало интересно испробовать на практике:)

    • Пробуйте, главное продумывайте все заранее, а то потом при необходимости что-то поменять придется очень много времени потратить.

  13. Илья:

    Спасибо! Полезная информация!

  14. Да, я делала,как вы и говорите — ходила в магазин по 10 раз-
    теперь не буду. Спасибо большое.

  15. inom:

    Насчет св-ва scroll Оно позволяет перемещаться фону вместе с содержимым =)

  16. NEOx:

    Здравствуйте, на этой страничке помоему вирус. У меня в Опере открывается AdobeReader при посещении. Проверьте на всякий случай.

  17. opapa:

    Зашел недавно в панель управления сайтом на гоудедди. И что бы вы думали? 2011 год на дворе, а у них 67 файлов грузится… за 17 секунд…(именно поэтому я решил проверить почему так долго в первый раз без кеша грузило) из которых 2/3 картинки, которые нормальные люди засовывают в спрайты.


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