Адаптируем графику под Retina экран

в 7:28, , рубрики: css, javascript, media queries, retina display, server-side, svg, метки: , , , , ,

image
Очень часто мне встречаются сайты которые отвратительно выглядят на iPhone4, и дело даже не в том, что большинство из них не адаптированы под маленький экран, а в том, что разработчики не учитывают новый тип экранов. На иконки не хочется смотреть, на кнопки не хочется нажимать, а от картинок вообще хочется… закрыть сайт. То, что призвано завлечь пользователя на сайт, вникнуть в его суть, а не покинуть его тут же — теперь работает совершенно наоборот. Но пользователи iPhone в целом привыкли к такой ситуации, т.к. телефон не может заменить полноценного браузинга.

Однако, совсем недавно Apple дала нам iPad 3 небольшую фору, для того, чтобы привести дела впорядок. iPad'ом уже пользуются вполне себе полноценно, поэтому сайты должны выглядеть на нем ничуть не хуже, чем на ноутбуке или стационарном компьютере. И я считаю, что iPad 3 — это лишь первый шаг к полноценному внедрению Retina экранов в те же ноутбуки, а за ними и в стационарные мониторы. Apple уже готовит свою OS для Retina, у Windows 8 скорее всего с этим тоже проблем не будет, с их новым подходом в дизайне интерфейсов.

Теперь, когда вы тут, перейдем непосредственно к самим методам адаптации графики под экраны с высокой плотностью пикселей.

Метод 1. Использование SVG

.selector { background: url(../path_to_png/apple.png) no-repeat; }
html.svg .selector { background-image: url(../path_to_svg/apple.svg); }

Идеально подходит для логотипов, иконок, а также любой векторной графики.

Это метод дает самый качественный результат, т.к. графика будет выглядеть одинаково четко при любом приближении. Однако SVG — это векторный формат, и ваша графика должна быть соответственно в векторе. Чтобы подготовить SVG файл можно воспользоваться Adobe Illustrator, или другим аналогом (Inkscape, CorelDRAW).

Дальше все очень просто. Достаточно указать путь до SVG файла в CSS свойстве background-image. Однако есть браузеры, которые не поддерживают SVG. В этом случае я рекомендую использовать Modernizr, в составе шаблона HTML5 Boilerplate, это позволит определять непосредственно поддерживаемые функции, а не версии браузеров.

 

Метод 2. CSS Media Query и свойство background-size

.selector { background: url(../path_to_png/apple.png) no-repeat; }
  
@media (-webkit-min-device-pixel-ratio: 2) {
  .selector { background-image: url(../path_to_png/apple@2x.png); background-size: cover; }
}

С помощью селектора «min-device-pixel-ratio» определяются устройства с плотностью пикселей 2 и выше, для них подключается картинка в 2 раза больше, а свойство «background-size: cover» сообщает браузеру, что имеющуюся эту картинку необходимо отмасштабировать до размеров блока сохранив пропорции. Почитать о свойстве «background-size» и о значениях, которые оно может принимать

 

Метод 3. Замена src у картинок

jQuery( document ).ready(function(){
  if( 'devicePixelRatio' in window && window.devicePixelRatio == 2 ){
    var img_to_replace = jQuery( 'img.replace-2x' ).get();
 
    for (var i=0,l=img_to_replace.length; i<l; i++) {
      var src = img_to_replace[i].src;
      src = src.replace(/.(png|jpg|gif)+$/i, '@2x.$1');
      img_to_replace[i].src = src;
    };
  }
});

В HTML коде прописываем тегу <img> необходимый класс, ширину или высоту, чтобы увеличенная картинка не испортила дизайн.

<img src="../path_to_png/apple.png"
     width="200" height="200"
     class="replace-2x" />

Этот метод использует свойство window.devicePixelRatio для определения экрана с увеличенной плотностью, находит все картинки, которые необходимо адаптировать и заменяет их src на аналогичный, но с дополнением в «@2x». Если не хочется каждой картинке писать класс, то довольно просто модифицировать код выше, чтобы он находил любые картинки. На мой взгляд данный метод не самый лучший и я бы использовал его с особой осторожностью.

 

Метод 4. Cookies и решение не сервере

(function(){
  if( document.cookie.indexOf('device_pixel_ratio') == -1
      && 'devicePixelRatio' in window
      && window.devicePixelRatio == 2 ){
        
    document.cookie = 'device_pixel_ratio=' + window.devicePixelRatio + ';';
    window.location.reload();
  }
})();

Используя JavaScript, этот метод позволяет один раз установить куку и перезагрузить страницу. Далее на основе этой куки сервер может принять решение сразу выдать адаптированную картинку для экранов с увеличенной плотностью.

 
И наконец ссылка на демо, разницу заметят только владельцы устройств с Retina экраном.
 

Напоследок

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

Буду рад услышать от вас о проблемах, с которыми вы сталкивались при адаптации под Retina экраны и решения, которые я упустил.

Автор: hmelyoff


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js