Оптимизация изображений сайта для Retina Display
Я пытался найти хороший подход для решения очень распространенной проблемы в эпоху сетчатки.
Допустим, дано следующее:
- Создать сайт с адаптивными изображениями
- Нет CSS фоновых изображений
- Основной функционал сайтов должен работать без JS
- Изображения на сайтах должны быть оптимизированы для отображения на сетчатке.
Простой способ решить это может быть что-то вроде этого:
<img src="img.jpg" data-highres="img@2x.jpg" />
и напишите какой-нибудь js, чтобы поменять img.jpg с img@2x.jpg, если устройство сетчатки обнаружено. Это будет работать, но если я зайду на сайт на устройстве с сетчаткой, загрузятся и img.jpg, и img@2x.jpg. Не очень дружелюбный к пропускной способности:(
Можно ли как-то перехватить и изменить src изображения перед загрузкой исходного src?
Или у кого-нибудь из вас есть другой подход к решению проблемы?
4 ответа
В будущем вы можете использовать элемент изображения. В то же время, единственный подход, который я видел, может работать:
- Поместите div или span, где вы хотите изображение. Стиль это, чтобы иметь размеры и расположение изображения. Добавьте к нему какой-нибудь идентификационный знак, чтобы вы могли его найти (например,
class="retina-image"
) - Храните информацию о различных размерах изображений на вашем элементе или в нем (например, используя
data-something
атрибуты) - Положить
<noscript><img src="..." alt="..."></script>
внутри див - На DOM готов:
- используйте JS, чтобы найти все элементы с идентификатором из шага 1
- определить тип изображения, которое вы хотите
- найдите атрибут, который говорит вам, какой URL использовать для этого изображения
- добавьте изображение в DOM внутри контейнера с шага 1
Это подход, используемый библиотекой picturefill.
Вероятно, это будет пламенная приманка, но вот мои два цента:
Забота о пропускной способности - это в основном проблема мобильной платформы. Учитывая, что большинство современных мобильных платформ в настоящее время используют дисплеи с высокой плотностью пикселей, спрос на изображения с высоким разрешением с этих устройств будет довольно высоким. Зачем в 3 раза превышать разрешение изображения в 90% случаев (изображение с низким и высоким разрешением), если можно в 2 раза увеличить разрешение сервера в 100% случаев?
Следовательно, в некоторых сценариях может быть проще просто подавать изображения с более высоким разрешением (вдвое уменьшая их стили ширины / высоты) и оставить это в таком положении - тем самым экономя (дорогое) время и энергию в других местах. В отрасли, где все кажется компромиссом, иногда это имеет смысл как подход.
Я думаю, что Квентин по существу ответил на ваш вопрос.
Что я могу добавить, так это то, что хотя элемент img без src технически не соответствует спецификациям, его отсутствие не нарушит ваш код и позволит избежать предварительной загрузки. Тогда вы можете просто иметь <img data-src="" data-src2="">
и меняйте изображения в / из JavaScript. <noscript>
Элемент, вероятно, является "правильным" способом сделать это, но он делает код действительно многословным, и я слышал, что некоторые браузеры будут предварительно загружаться <noscript>
изображения также.
Pixtulate- один из сервисов, с которыми я сталкиваюсь и которые делают изображения отзывчивыми (включая дисплеи Retina). Они также предоставляют JavaScript для правильного определения размера и замены URL-адреса img.src до завершения загрузки страницы. Должно быть довольно просто заскочить.
Если вы делаете что-то с window.devicePixelRatio
и перебирать изображения, которые имеют data-highres
приписывать.
Это довольно грубо, но вы меня поняли.
$(document).ready(function() {
if (window.devicePixelRatio > 1) {
// retina
} else {
// default
}
});
Используйте пустой / прозрачный 1px GIF
<img src="clear.gif" data-basesrc="img1" />
Тогда используйте basesrc
приписать и добавить соответствующее имя файла в вашем JS.