- PVSM.RU - https://www.pvsm.ru -
Напишу лишь вкратце зачем это нужно, так как на хабре уже много раз описывали [1] преимущества [1] и недостатки [2] css-спрайтов.
Используя css-спрайты со множеством элементов встает проблема о создании css-свойств с background-position
; Их нужно писать много, иногда очень много. Конечно, нам помогают многие сервисы по генерации спрайтов — они выдают вместе со спрайтом еще и css/less/sass — файл с координатами. Но практически всегда все жестко завязано на пикселях:
background-size: cover/contain/100%
не работают по понятным причинам;
Используя спрайты, подготовленные для 72ppi, на телефонах, планшетах и новых retina-ноутбуках вызывает размытие изображений, и выглядят некрасиво...
Дисклеймер о кроссбраузерности, кроссплатформенности и кросс-чего-нибудь-еще-сти
Использовать css3 в данном методе мы будем только для дисплеев с ppi, выше стандартных 72. Подобные дисплеи появились сравнительно недавно, и никакие IE 7.0- IE8.0 и им подобные старые версии Firefox или Opera там стоять не будут. С мобильным сегментом тоже все в порядке, поддержка media [4] запросов реализована везде [5].
Сразу замечу, что использовать less на рабочем проекте никто не заставляет, все можно скомпилировать в обычный css. Для mac подобных программ куча, для windows будет полезна программа WinLess [6].
Сейчас я рассматривать буду частный случай спрайта — спрайт с иконками, сгенерированный замечательным ресурсом icomoon.io [7]
Чтобы мы делали с помощью простого css, если б нужно было настроить под ретину спрайт? Скорее всего, мы бы отказались от использовали спрайт с высоким разрешением. Возможно, подключали бы его только для устройств с высоким ppi.
Но здесь мы столкнемся с проблемой масштабирования этого спрайта под подходящий нам размер. А это, кроме как transform: scale(x);
просто так не решить, и придется перерисовывать спрайт, переписывать все background-position
. И все бы ничего, но иногда количество иконок зашкаливает, да и вообще хотелось бы универсальное решение.
Итак, приступим:
.icon-rss,.icon-e-mail,.icon-youtube,.icon-mailru {
display: inline-block;
width: 16px;
height: 16px;
background-image: url(sprites.png);
background-repeat: no-repeat;
}
.icon-rss {
background-position: 0 0;
}
.icon-e-mail {
background-position: -32px 0;
}
.icon-youtube {
background-position: -64px 0;
}
.icon-mailru {
background-position: -96px 0;
}
background-size: 496px;
px
" на переменную, по-умолчанию равную 1px. Пусть она будет называться size
. Делается это легко автозаменой. Попутно не забываем переименовать файл в расширение less и заинклудить к главному less-файлу вашего проекта:
@size: 1px;
.icon-rss,.icon-e-mail,.icon-youtube,.icon-mailru {
display: inline-block;
width: 16*(@size);
height: 16*(@size);
background-image: url(sprites.png);
background-repeat: no-repeat;
background-size:496*(@size);
}
.icon-rss {
background-position: 0 0;
}
.icon-e-mail {
background-position: -32*(@size) 0;
}
.icon-youtube {
background-position: -64*(@size) 0;
}
.icon-mailru {
background-position: -96*(@size) 0;
}
::before
или ::after
@media
запросы less поддерживает в любом месте кода: в зависимости от плотности пикселей будем подключать тот или иной файл.
@size: 1px;
.icon-rss,.icon-e-mail,.icon-youtube,.icon-mailru {
display: inline-block;
width: 16*(@size);
height: 16*(@size);
background-image: url(sprites.png);
@media
only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and ( min--moz-device-pixel-ratio: 2),
only screen and ( -o-min-device-pixel-ratio: 2/1),
only screen and ( min-device-pixel-ratio: 2),
only screen and ( min-resolution: 192dpi),
only screen and ( min-resolution: 2dppx) {
background-image: url(sprites32.png);
}
@media
only screen and (-webkit-min-device-pixel-ratio: 4),
only screen and ( min--moz-device-pixel-ratio: 4),
only screen and ( -o-min-device-pixel-ratio: 4/1),
only screen and ( min-device-pixel-ratio: 4),
only screen and ( min-resolution: 360dpi),
only screen and ( min-resolution: 4dppx) {
background-image: url(sprites64.png);
}
background-repeat: no-repeat;
background-size:496*(@size);
}
.icon-rss {
background-position: 0 0;
}
.icon-e-mail {
background-position: -32*(@size) 0;
}
.icon-youtube {
background-position: -64*(@size) 0;
}
.icon-mailru {
background-position: -96*(@size) 0;
}
px
". Вместо этого, я переменной size
присваиваю значение в единицах измерения "rem
". Это дает свободу изменения размеров иконок до необходимого, а в случае, если мы открываем сайт с планшета, эти самые rem
становятся чуть больше, т.к. я задаю чуть больший размер шрифта для планшетов, например:
@media (min-width: 768px) and (max-width: 1366px) {
html {font-size: 120%;}
}
P.S.: Об орфографических, синтаксических и лексических ошибках просьба писать в ЛС.
P.P.S.: Данный материал не претендует на добавление в палату мер и весов, и используемые примеры не совершенны. Гуру-less/sass в этом посте не найдет ничего особенного, а вот новичкам будет полезно.
Автор: Carduelis
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/veb-dizajn/44769
Ссылки в тексте:
[1] описывали: http://habrahabr.ru/post/159027/
[2] недостатки: http://habrahabr.ru/post/28177/
[3] поддерживают: http://caniuse.com/#search=font
[4] media: http://habrahabr.ru/users/media/
[5] везде: http://caniuse.com/css-mediaqueries
[6] WinLess: http://winless.org/
[7] icomoon.io: http://icomoon.io/app/
[8] Источник: http://habrahabr.ru/post/196030/
Нажмите здесь для печати.