Не работают адаптивные изображения srcset

Я пытался реализовать новый подход srcset к адаптивным изображениям, используя следующий HTML

        <img class="swapImages"
        srcset="assets/images/content/large.jpg 1200w,
                assets/images/content/medium.jpg 800w,
                assets/images/content/small.jpg 400w"
        sizes="100vw"
        src="assets/images/content/small.jpg"
        alt="responsive image">

Я использую Chrome 40, и все, что я получаю, это самое большое изображение, изменение размера моего браузера, очистка кэша ничего не делает.

Я читал где-то, что мне пришлось заполнить, поэтому я использовал плагин picturefill, хотя Chrome должен поддерживать его..... по-прежнему не работает.

Я собрал демонстрационную страницу для этого: http://www.darrencousins.com/lab/resp-img-srcset/

Что я делаю неправильно / не получаю?

Любая помощь очень ценится.

10 ответов

Вы правильно поняли.

Дело в том, что, как только ваш браузер имеет изображение с более высоким разрешением (загружено, в кеше), у него нет смысла загружать изображение более низкого качества, даже когда вы уменьшаете размер окна (смысл в том, чтобы сэкономить трафик).

Поэтому, если вы хотите проверить это, просто уменьшите окно и загрузите страницу (после очистки кеша или использования режима инкогнито). Вы получите мобильную или планшетную версию. Затем, увеличив окно, вы в какой-то момент увидите, что ваш браузер переключается на изображение с более высоким разрешением.

При использовании в теге img атрибут srcset оставляет за браузером решения о том, какое изображение загружать, как указано в TondaCZE. Если вы хотите заставить браузеры загружать изображения в указанных окнах просмотра, вы должны использовать элемент picture.

<picture>
  <source srcset="large.jpg" media="(min-width: 1200px)" />
  <source srcset="medium.jpg" media="(min-width: 800px)" />
  <img src="small.jpg" />
</picture>

Я только что заметил, что ваша демонстрационная страница ( http://www.darrencousins.com/lab/resp-img-srcset/) никогда не отображала мобильную версию (даже при изменении размера браузера или использовании DevTools - Режим устройства) в Google Chrome (версия 48).

Изменение отношения пикселей устройства к 1, кажется, загружает правильное изображение.

введите описание изображения здесь

введите описание изображения здесь

Я не знаю почему, мне интересно, учитывают ли w дескрипторы соотношение пикселей устройства

Мы столкнулись с той же проблемой при работе с srcsets впервые в нашем проекте. Потратив некоторое время, один из членов нашей команды, наконец, смог решить эту проблему. Причина, по которой ваш код не работает, заключается в несоответствии размеров в атрибуте srcset и sizes. Вы должны предоставить двойную ширину в srcset, чтобы браузер мог сопоставить ее с шириной в размерах. Например,

 <img
        srcSet="image1920w.png 1920w,image720w.png 720w"
        sizes="(min-width: 960px) 960px,
        360px"
        src="www.image1920w.com"
         alt="Sample"
     />

Вот пример рабочего кода, который вы можете попробовать.

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

Я предполагаю, что вы тестируете браузер Chrome, и единственная причина, по которой он там не работает, заключается в том, что это функция Chrome. См. Ниже поток переполнения стека (он также подходит для последней версии Chrome v54):

Проблемы с атрибутом srcset в Google Chrome версии 40

Проверил свою страницу на IE8 и Firefoxv49, и все работает как шарм!

Еще одна вещь, которую я заметил, заключается в том, что хотя chrome не загружает другие изображения, он изменяет размер загруженного файла довольно хорошо. Таким образом, в некотором смысле мы все еще в гораздо лучшем состоянии, если бы это было только на странице:

<img srcset="assets/images/content/large.jpg 1200w" alt="large image">

Для любого, кто использует боковую панель Chrome DevTools, вы можете указать Chrome отключить кэш, когда DevTools открыт. Изменение вашего окна просмотра и обновление затем будет отображать правильное адаптивное изображение, если оно дает вам самое большое (кэшированное) изображение все время.

  1. Открыть DevTools (F12)
  2. Перейти в настройки
  3. Прокрутите вниз до сети
  4. Установите флажок Отключить кэш (пока открыт DevTools)

Вы пробовали менять DPR на 1.0? Вы можете найти его на верхней панели Chrome DevTools в адаптивном режиме (попробуйте ширину 380 пикселей). После изменения DPR щелкните правой кнопкой мыши значок перезагрузки страницы, затем выберите «Очистить кеш и выполнить полную перезагрузку», лучше всего сделать это в режиме инкогнито. Браузер должен предварительно загрузить изображение 400 Вт.

В моем случае проблема заключалась в пробеле в имени изображения webp. Я переименовал файл, чтобы удалить символ пробела, и это сработало!

      <picture>
    <source srcset="img/landing-small.webp" type="image/webp">
    <source srcset="img/landing - small.jpg" type="image/jpeg">
    <img src="img/landing - small.jpg" alt=""/>
</picture>

Это работа, основанная на device pixel ratio (DPR). Например, предположим, что у нас есть устройство с шириной области просмотра 412 пикселей и DPR 2,6. Таким образом, браузер выбирает изображение, близкое к 803 px (412 _ .75 _ 2.6).

Если вы хотите выбрать изображение только на основе области просмотра, попробуйте использовать media атрибут вроде этого:

      <amp-img
  alt="grey cat"
  media="(max-width: 469px)"
  width="226"
  height="340"
  src="/static/inline-examples/images/cat-small.jpg">
</amp-img>
<amp-img
  alt="grey cat"
  media="(min-width: 470px) and (max-width: 669px)"
  width="450"
  height="340"
  src="/static/inline-examples/images/cat-medium.jpg">
</amp-img>
<amp-img
  alt="grey cat"
  media="(min-width: 670px)"
  width="650"
  height="340"
  src="/static/inline-examples/images/cat-large.jpg">
</amp-img>

Open your development tool then go to network tab and disable catch. that's all nothing else.

Другие вопросы по тегам