CSS Sprites: все, что вы знали, но боялись спросить

    Сейчас уже много где написано и упомянуто про технику CSS sprites (aka CSS Image Maps). Я не буду открывать Америку и рассказывать о ней дотошно еще раз, а просто хочу привести несколько примеров и полезных ссылок. И пару советов из собственной практики.

    Сама техника заключается в том, что мы создаем комбинированное изображение, из которого затем «вырезаем» с помощью свойств background-position нужный нам в данном случае кусок. На текущем уровне поддержки браузерами (я полагаю, что 99,9%) оно является просто must-have для любого уважающего себя интернет-ресурса (ибо позволяет сократить число запросов к серверу, отделить поведение от представления, возложить труд по анимации на CSS-движок браузера, а не на JS-движок, т.е. это будет работать даже с выключенными скриптами, и много-много прочих «вкусностей»). Но обо всем по порядку. Поехали.

    читать дальше на webo.in →
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 57
    • 0
      Спасибо за обзор. Сам я впервые с этой техникой столкнулся, анализируя код digg`а. Весьма удобно, да.
      • 0
        да, поддерживаю. Большое спасибо! прояснил некоторые вещи ;) Извините, карму добавить не могу :(
        /me пошел переделывать верстку.
        • 0
          вообще, эта технология - изврат по сравнению с тегом IMG

          к тому же существует опция в HTTP, позволяющая объединять несколько запросов в одном

          исходя их всего этого интересно было бы узнать кто быстрее (в тестах) и, главное, насколько и почему
          • 0
            Не так это страшно как кажется. Нужно только помнить где-какая картинка стоит :-)
            А выйгрыш в скорости даёт приличный. Особенно в IE. Сотня иконок грузятся около минуты, а карта - несколько секунд.
            • 0
              выигрыш есть, я не сомневаюсь, я о том что путь не слишком "правильный" :-)

              мне видится, правильнее было бы ненавязчиво проинструктировать браузер о том что серию картинок можно загрузить одним блоком (внутри одной коннекции), и всё потом сделать "по-тихому", через TCP/IP с HTTPой
              • 0
                Ну неужели нельзя добиться того же эффекта ... если, положим, все ссылки с одной страницы грузить в рамках одного соединения с сервером?! Хотя, возможно это и неэффективно - но тогда можно по 20 запрсов объединять. С другой стороны, что-то здесь не так, иначе давно бы уже решение было :-)
                • 0
                  Может быть потому что это от сервера сильно зависит?
                  Решение со спрайтами никакой настройки сервера не требует, и будет работать на любом хостинге.
                • 0
                  А могли бы вы описать подробно для тех кто это не знает, например для меня, если не сложно? Если немного описывать - можно и в комментариях, если много - то отличный пост может получится, ну а если лень, я лично был бы рад и ссылкам. Спасибо.
              • 0
                Это что за опция?
                • +1
                  Persistent Connections

                  Prior to persistent connections, a separate TCP connection was established to fetch each URL, increasing the load on HTTP servers and causing congestion on the Internet. The use of inline images and other associated data often require a client to make multiple requests of the same server in a short amount of time. Analysis of these performance problems and results from a prototype implementation are available. Implementation experience and measurements of actual HTTP/1.1 (RFC 2068) implementations show good results.

                  http://www.w3.org/Protocols/rfc2616/rfc2…
                  • +2
                    Это где-то используется? И кем-то поддерживается?
                    • 0
                      насколько я понимаю, это keep-alive. он разумеется используется, но спрайты все равно полезны для уменьшения количества запросов.
                • 0
                  исходя из идеологии w3c, тег img предназначен для разметки изображений
                  спрайты же используются для хранения оформительских штук, тоесть не контента, поэтому должны быть вынесены из html в css

                  ну и в большинстве случаев, лично для меня, спрайты просто более удобны чем набор отдельных картинок, меньше кода - меньше головной боли
                • +3
                  Не лишним будет также упомянуть, что существуют утилиты, позволяющие генерировать простые карты CSS sprites не отходя от браузера. Вот эта хотя бы.
                  • +3
                    Сорри, до конца не дочитал, сам дурак.
                  • 0
                    С ІЕ (и вообще совместимостью) порядок?
                    • 0
                      Всё нормально там.
                      • +1
                        Проблема только с прозрачностью PNG спрайтов в IE6.
                        Фильтром не решается из-за отсутствия у него background-position.
                        • 0
                          Вы правы, я позабыл. Никогда не юзал PNG с прозрачностью для sprites.
                    • 0
                      Метода известна, но за обзор спасибо.
                      • 0
                        Присоединяюсь :)
                        Иногда такие вещи надо вспоминать, потому что забываются, и очень зря!
                      • 0
                        Не знал. Спасибо, пригодится.
                        • 0
                          надо же, не знал. Спасибо, очень интересно. И обзор helpful.
                          • 0
                            в IE6 часть неработает, часть сильно мигает. в Опере и FF все ок.
                          • 0
                            Спасибо, весьма грамотная статья.
                            • 0
                              ещё надо учесть, что в IE не работает конструкция из вложенных в a:hover элементов
                              • 0
                                для больного брата есть костыли. Но можно ему и так поковылять, в основном rollover только для кликабельных-ссылкоподобных элементов применяется.
                              • 0
                                самостоятельно когда то пытался сделать, получился только вертикальный набор, на горизонтальном в ие черт знает что - при наведении какой-то непонятный эффект - картинки убегали влево, причем на разное расстояние 8).

                                никаких вложенных элементов.

                                я делал - ссылка-блок с фиксированными размерами, text-indent - чтобы текст ссылки остался, но не был виден, фон - картинкой с position - top при наведении - center, при переходе на пункт - ссылка становится >b< с тем же фоном background-position:bottom

                                background(url(i/1.jpg) no-repeat top center) и т.п.
                                • 0
                                  мне кажется, стоило попробовать фиксированный background-position, а не center.
                                • –1
                                  а как мне самое вкусное съесть?
                                  • 0
                                    Использую данный метод во всех своих разработках. Но!

                                    Очень мешает отсутствие background-position-x: и background-position-y: которые присутствуют только в IE. С этими свойствами можно описать сложную карту при помощи 3 строк, в противном случае нужно писать стили для каждого элемента. Для закладок это ещё куда ни шло, а когда элементов становится достаточно много, например, более 50 и вы планируете использовать не фиксированный размер иконок (более того, не фиксированное их количество), а меняющийся в зависимости от настроек (в котором разная ширина полей изображений), то такое использование становится проблематичным.

                                    Только по этой причине пришлось использовать всё тот же JS, о чём жалею.
                                    • 0
                                      Генирируйте карту на сервере
                                      • 0
                                        С этим хорошо справляется JS. Но даже генерация на сервере мне кажется менее разумным, чем добавление в CSS свойств: background-position-x и y.
                                        Согласен, выход всегда можно найти. Тут скорее речь об удобстве.
                                    • 0
                                      Никогда не мог понять любовь дизайнеров к onmouseover, всегда решая проблему ролловеров через css. Отличная статья, thx).
                                      • 0
                                        респект! Отличная статья.
                                        Вроде ничего криминального, но все собрано в одну кучу, и обосновано. Спасибо.
                                        • 0
                                          отличная статья...
                                          спасибо
                                          • 0
                                            очень к месту пришлась, спасибо! Как раз сейчас осваиваю этот метод
                                            • +3
                                              Может ретро, но ещё в 2005 году было написано — http://www.artlebedev.ru/tools/technogre…
                                              • 0
                                                И мне сразу вспомнилось :)
                                                • 0
                                                  написано-то написано, только почти никто нигде не использует. В основном, из-за того, что не знают, что так вообще можно, и в частности, из-за того, что не знают, КАК это можно сделать.
                                                  • 0
                                                    я когда прочитал этот материал, у меня эта техника "зашилась" в башке.
                                                    и в своих проектах я её юзаю.
                                                  • 0
                                                    Вообще-то еще в 2004 - http://www.alistapart.com/articles/sprit…
                                                  • 0
                                                    Совершенно логично.
                                                    Меньше обращений к серверу, меньше задержек.
                                                    • +1
                                                      не знаю... я почему-то не очень этот приём пользую... скорее всего мне просто лень с фотошопом возиться, копируя-вставляя-склеивая кнопки. чтобы не было задержек при rollover делаю просто
                                                      a {background: url('i/button-hover.jpg'; background: url('i/button.jpg'; )
                                                      a:hover {background: url( background: url('i/button-hover.jpg'; )
                                                      и никаких задержек и интерактивность наглядная - мигнут кнопки при загрузке, показывая бестолковому юзеру, что туда можно ткнуть мышкой.
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                      • 0
                                                        Почитал комментариии. ИНогда я радуюсь, что мои сайты всё же чем-то да лучше чем у других =)
                                                        • 0
                                                          Давно использую эту технику, и даже статью сейчас пишу по CSS, и там эта техника упоминается...
                                                          • 0
                                                            Первый раз напоролась, разглядывая эппловское меню на сайте. Сначала была в ахуе, потом прониклась)
                                                            Спасибо за обзор, один из самых интересных и увлекательных %) матералов на хабре за последнее время.
                                                            • 0
                                                              эх ... усложняется веб разработка :/
                                                              кому это разбирать? я - программист :) а у верстальщика не хватит мозгов такое осознать и пользоваться :)
                                                              • 0
                                                                Хех, у нас обычно наоборот — у программиста не хватает мозгов, а точней банального запаса знаний, осознать что я там с ксс наверстал и почему не таблицами %)
                                                              • 0
                                                                посидел над меню Apple.
                                                                В конце концов разобрался, сделал аналог.
                                                                Может пригодиться.
                                                                • 0
                                                                  Если использовать эту технику на ссылках-картинках, то какой аналог существует для img alt?
                                                                  Т.е. как в данном случае быть с аксесабилити при выключенной загрузке картинок?
                                                                  • 0
                                                                    для начала стоит определиться, зачем эта самая accessibility нужна.

                                                                    Если дать пользователю понять, что на этом месте какая-то картина, которая несет смысловую нагрузку, — то ее и нужно делать картинкой. Если же это другой функциональный элемент (например, ссылка меню или кнопка отправки формы), то при отключенных картинках он должен выглядеть максимально к этому приближенно. Обычно для этого используют title'ы.

                                                                    В общем, при отключенных картинках пользователь должен понимать, что он на этой странице делает :)
                                                                    • 0
                                                                      решил путем добавления пустого img внутрь :

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