Ответ
Плюсы:
- Уменьшение количества HTTP-запросов (все изображения в одном файле)
- Ускорение загрузки за счет кеширования одного файла
- Упрощение управления hover/active состояниями через CSS
- Меньший вес по сравнению с отдельными файлами (нет накладных расходов на каждый файл)
Минусы:
- Сложность обновления (изменение одного иконки требует перегенерации всего спрайта)
- Неэффективно если используются не все иконки из спрайта
- Проблемы с ретиной (нужно создавать спрайты в 2x размере)
- Сложность позиционирования (нужно точно указывать background-position)
Пример использования:
.icon {
background-image: url('sprite.png');
width: 20px;
height: 20px;
}
.icon-home {
background-position: 0 0;
}
.icon-user {
background-position: -20px 0;
} Ответ 18+ 🔞
А, слушай, вот эта ваша модная хуйня — CSS-спрайты! Ну, вроде как все иконки в одну картинку запихнуть, да? Ну, типа, круто звучит, но давай разберём, где тут реальная польза, а где просто пиздёж маркетологов.
Что хорошего, блядь (плюсы):
- Запросов меньше, ебать. Вместо того чтобы браузеру стучаться на сервер за каждой мелкой иконкой по отдельности — раз! — и одна картинка загрузилась. Всё, приехали. Особенно раньше, когда лимит на одновременные запросы был жёсткий, это было спасение.
- Кешируется на ура. Скачал один файл
sprite.png— и всё, он у тебя в кеше лежит до скончания времён (или пока кэш не почистишь). Новые страницы открываются — иконки уже тут как тут, не надо их снова тащить. - Ховеры-активы — раз плюнуть. Хочешь иконку поменять при наведении? Да хуле там! Просто сдвинь
background-positionна другую координату в этом же спрайте — и готово, никаких морганий при загрузке второй картинки. - Вес иногда меньше. Ну, потому что в одном PNG-файле одна общая палитра цветов на все иконки, а не в каждом файле своя. Накладных расходов меньше, епта.
А теперь, сука, ложка дёгтя (минусы):
- Обновить — пиздец. Захотел одну иконку поменять? Ну всё, пиши пропало. Надо заново весь спрайт собирать, все координаты пересчитывать, если что-то добавилось или съехало. А если над проектом не один человек? Один обновил, а другой про старый спрайт не знает — и пошла писать губерния, все иконки съехали, ёпта!
- Если юзаешь 2 иконки из 50 — зачем тебе 48 лишних, дурачок? Загружаешь гигантскую картинку, а пользуешься крошечным кусочком. Неэффективно, блядь. Особенно на мобилках, где каждый килобайт на счету.
- Ретина — отдельная боль. Чтобы на экранах с высокой плотностью пикселей не было мыла, надо делать спрайт в два раза больше. А потом через
background-sizeего масштабировать обратно. Геморрой, да и только. Или делать два отдельных спрайта — один для обычных экранов, другой для ретины. Вообще пиздец. - Позиционирование — высшая математика.
background-position: -148px -73px;Ну ты посмотри на это! Как будто координаты бомбы вводишь. Один пиксель ошибёшься — и вместо иконки дома у тебя пол-иконки юзера торчит. И поддерживать этот ад, когда спрайт разрастается... волнение ебать, терпения ноль ебать.
Ну и как с этим жить, примерчик:
/* Вот общий класс для всех иконок, тут спрайт подключается */
.icon {
background-image: url('sprite.png');
width: 20px;
height: 20px;
display: inline-block; /* Чтобы размеры работали */
}
/* А тут уже конкретные иконки, просто сдвигаем фон */
.icon-home {
background-position: 0 0; /* Верхний левый угол спрайта */
}
.icon-user {
background-position: -20px 0; /* Сдвинулись на 20px влево по X */
}
В общем, спрайты — инструмент, блядь, как молоток. В своё время — охуенный. Сейчас, с HTTP/2, который много мелких файлов качает быстро, и с SVG, который и в коде можно хранить, и масштабируется как хошь, — уже не так актуально. Но знать надо, а то придёшь на легаси-проект, а там спрайт на мегабайт, и сиди, ебашь эти координаты, в рот меня чих-пых!