Как правильно использовать спрайты высокого разрешения на iOS с CSS?

У меня возникли серьезные проблемы с попыткой заставить мои спрайты отображаться прямо на iPhone4+, используя версию моего навигационного спрайта с высоким разрешением (2x). Вот код, который я использую прямо сейчас.

.pixelj a, .games a, .team a, .forums a {
    width: 156px;
    height: 35px;
    background-image: url('/assets/blogtext2x.png');
    background-repeat: no-repeat;
/*  background-size: 156px 17px;*/  
    text-indent: -9999px;
    overflow: hidden;
    display: block;
    float: left;
    }

Как вы можете видеть, это для навигации, где у меня есть все элементы слова навигации в одном спрайт-изображении. Я попытался использовать «размер фона», но это просто сжало весь спрайт в предоставленную ширину/высоту. Если я избавлюсь от него, он покажет 2-кратные изображения, но не сделает их 50%, чтобы они отображались правильно.

Что я здесь делаю неправильно? Вот запрос @media, который я использую для таргетинга на устройства с высоким разрешением:

@media (min--moz-device-pixel-ratio: 1.5),
  (-o-min-device-pixel-ratio: 3/2),
  (-webkit-min-device-pixel-ratio: 1.5),
  (min-device-pixel-ratio: 1.5),
  (min-resolution: 1.5dppx),
  (max-device-width: 640px) {

person ChaBuku Bakke    schedule 06.06.2013    source источник


Ответы (1)


Вы здесь абсолютно на правильном пути.

По сути, процесс здесь с предоставлением графики «сетчатки» в спрайте через CSS:

  • Настройте свой обычный спрайт с соответствующим позиционированием/и т. д. в вашем CSS для подачи на устройства без сетчатки,
  • Установите размер фона этого изображения,
  • Используйте медиа-запрос, чтобы передать вариант @2x изображения на те устройства, которые его поддерживают.

Есть несколько ключевых моментов, о которых следует помнить:

  • для настройки background-size требуется несколько объявлений с разными префиксами поставщиков, чтобы получить наилучшее покрытие браузера — см. мой код ниже, чтобы понять, что я имею в виду
  • background-size – это размер варианта фонового изображения без сетчатки, а не размер элемента, внутри которого оно находится. Итак, если изображение спрайта нормального размера имеет размер 200 на 400 пикселей (а версия с высоким разрешением — 400 на 800 пикселей), то вы объявляете 200px 400px.
  • background-size значения объявляются как <width> <height>.
  • Вы должны объявить background-size в первом объявлении, а не в перезаписи медиа-запроса сетчатки.
  • Хотя использование @2x становится общепринятой практикой, в веб-разработке это не обязательно: вы можете использовать совершенно другое имя изображения.

Очень сложно помочь вам с вашим конкретным вопросом без всего кода или живого URL-адреса, на который можно посмотреть, но вот пример высокого уровня.

В этом примере у меня есть фоновое изображение шириной 100 пикселей и высотой 50 пикселей, которое расположено в середине элемента.

/* the element */
.element{
    background: url(../img/site/background-image.png) 50% 50% no-repeat;

    /* vendor-specfic declarations for background-size */
    -webkit-background-size: 100px 50px;
    -moz-background-size:  100px 50px;
    -o-background-size:  100px 50px;
    background-size:  100px 50px;
}

/* for retina users */
@media screen and (-webkit-min-device-pixel-ratio: 2), 
screen and (max--moz-device-pixel-ratio: 2),
screen and (min-device-pixel-ratio: 2){ 
    .element{
        /* we only over-write background-image here */
       background-image: url(../img/site/[email protected]);
    }
}

Это будет означать, что те устройства, которые попадают во второй медиа-запрос, будут загружать @2x версию фонового изображения и масштабировать его до размеров background-size, как заявлено.

Поскольку изображение уменьшено до установленных вами размеров, если вы используете спрайты, вам нужно объявить все background-positions элемента только один раз, как обычно, а не дважды, чтобы учесть большие размеры графики сетчатки.

РЕДАКТИРОВАТЬ: Теперь, увидев ваш сайт, я точно вижу проблему, с которой вы столкнулись при навигации:

Снимок экрана

Причина, по которой это выглядит так, это ваш CSS здесь (строка 972 из style2.css):

.pixeljam a, .games a, .team a, .forums a {
    background: no-repeat url('/assets/blogtext2x.png');
}

Если вы измените это на background-image и удалите no-repeat, тогда это сработает (иначе background сбрасывает ваши предыдущие фоновые позиции).

.pixeljam a, .games a, .team a, .forums a {
    background-image: url('/assets/blogtext2x.png');
} 
person johnkavanagh    schedule 06.06.2013
comment
Я понял это, у меня были проблемы, потому что я устанавливал размер фона как размер видимой области, а не размер всего изображения 1x. Теперь это выглядит великолепно. Это видно на моем сайте разработки, вот [ссылка]mindevo.com/pj - person ChaBuku Bakke; 06.06.2013
comment
Привет @ChaBuku - рад слышать, что вы смогли решить эту проблему, я ожидал, что это может быть причиной того, что у вас возникли проблемы (это довольно распространенное недоразумение - спецификация на тот момент немного сбивает с толку). Если это ответ на ваш вопрос, не забудьте отметить правильный ответ в своем вопросе (рядом с каждым ответом есть зеленая галочка). Это гарантирует, что люди, которые в будущем будут заходить на сайт с похожими проблемами, смогут найти ответ как можно проще. Кстати, мне очень нравится шрифт, который вы используете для заголовков на своем сайте! - person johnkavanagh; 06.06.2013
comment
Я только что заметил на вашем сайте кое-что, о чем стоит упомянуть (чтобы помочь с элементами навигации) - я отредактирую свой ответ для вас. - person johnkavanagh; 06.06.2013
comment
Отлично, да, мне было интересно, почему мне пришлось сбросить свое позиционирование в медиа-запросе, и это исправило это. На чем ты сделал этот скриншот? Я проверял это с помощью iPhone 4, и теперь все выглядит хорошо. Я собираюсь начать ориентироваться на альбомные версии, теперь, когда портрет работает. - person ChaBuku Bakke; 06.06.2013
comment
У меня MacBook с сетчаткой, вот откуда взялся скриншот. Взгляните на ту строку CSS, которую я определил в своем редактировании. Причина, по которой это происходит, заключается в том, что вы используете background для объявления фонового изображения @2x, которое позиционирует его обратно в 0 0. Если вместо этого вы используете ` и удаляете no-repeat, все вернется на свои места. - person johnkavanagh; 07.06.2013