Img не отвечает на заданные размеры srcset

Я хотел бы реализовать отзывчивые изображения с помощью srcset, как описано здесь, поэтому изображение src, которое загружает пользователь, является наиболее похожим на его резолюция.

Дело в том, что я сделал этот тест и не ответил на изменения в видовом экране,

<img src="https://lorempixel.com/400/200/sports/"
      alt=""
      sizes="(min-width:1420px) 610px,
             (min-width:1320px) 500px,
             (min-width:1000px) 430px,
             (min-width:620px)  280px,
             280px"
      srcset="https://lorempixel.com/620/200/sports/ 280w,
              https://lorempixel.com/1000/300/animals/ 430w,
              https://lorempixel.com/1320/400/cats/ 610w,
              https://lorempixel.com/1420/500/abstract/ 1000w,
              https://lorempixel.com/1600/600/fashion/ 1220w" />

jsfiddle: http://jsfiddle.net/ad857m1r/9/

Любая идея, что мне не хватает?

Ответ 1

srcset интерпретируется браузером при первой загрузке, затем загруженное изображение сохраняется в cache и браузер может не загружать любое другое изображение, пока вы не очистите cache и не перезагрузите страницу.

Если вы хотите, чтобы srcset переинтерпретировался при каждом событии resize страницы, вам нужно обновить его, добавив случайную переменную в конце каждого url, тогда браузер перезагрузит правильную для этого размера экрана.

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

var img = document.getElementById("myImage");
var srcset = img.getAttribute("srcset");
var delay;

window.onresize = function() {

    clearTimeout(delay);

    delay = setTimeout(refreshImage, 500);

}

function refreshImage() {

    var reg = /([^\s]+)\s(.+)/g;
    var random = Math.floor(Math.random() * 999999);

    img.setAttribute("srcset", srcset.replace(reg, "$1?r=" + random + " $2"));

}

jsfiddle

Ответ 2

когда вы пытаетесь применить код в примере для упомянутой ссылки, вы сделали несколько изменений для кода в примере:

1-, когда вы устанавливаете значения атрибутов размеров, которые вы устанавливаете последним, а по умолчанию - 280 в качестве примера, но значение перед тем, как оно было напрямую 580, не так, как вы сделали 280

2-, когда вы используете один из фиктивных генераторов изображений, которые вы сделали слэш в конце ссылки изображения, затем пробел перед связыванием изображения с его размером, и это было переведено на сайт генератора изображений с текстом на изображении вам нужно изменить код на следующее, чтобы быть таким же, как описано в приведенной ссылке примера

<img src="https://lorempixel.com/400/200/sports/"
  alt=""
  sizes="(min-width:1420px) 610px,
         (min-width:1320px) 500px,
         (min-width:1000px) 430px,
         (min-width:620px)  580px,
         280px"
  srcset="https://lorempixel.com/620/200/sports 280w,
          https://lorempixel.com/1000/300/animals 430w,
          https://lorempixel.com/1320/400/cats 610w,
          https://lorempixel.com/1420/500/abstract 1000w,
          https://lorempixel.com/1600/600/fashion 1220w" />

Ответ 3

Вы просто скопируете и вставьте его. Прежде всего, вам нужно знать, что вам нужно упорядочить размер изображений в порядке возрастания, а затем вам нужно будет отрегулировать в соответствии с этим.

Пример

<img src="http://lorempixel.com/400/200/sports/"
      alt=""
      sizes="(min-width:1420px) 610px,
             (min-width:1320px) 500px,
             (min-width:1000px) 430px,
             (min-width:620px)  280px,
             280px"
      srcset="http://lorempixel.com/620/200/sports/ 620w,
              http://lorempixel.com/1000/300/animals/ 1000w,
              http://lorempixel.com/1320/400/cats/ 1320w,
              http://lorempixel.com/1420/500/abstract/ 1420w,
              http://lorempixel.com/1600/600/fashion/ 1600w" />

К этому вы можете просмотреть свой результат, я просто попробовал это и его работу

img {
  width: 100%;  
}
<img src="http://lorempixel.com/400/200/sports/"
      alt=""
      sizes="(min-width:1420px) 610px,
             (min-width:1320px) 500px,
             (min-width:1000px) 430px,
             (min-width:620px)  280px,
             280px"
      srcset="http://lorempixel.com/620/200/sports/ 620w,
              http://lorempixel.com/1000/300/animals/ 1000w,
              http://lorempixel.com/1320/400/cats/ 1320w,
              http://lorempixel.com/1420/500/abstract/ 1420w,
              http://lorempixel.com/1600/600/fashion/ 1600w" />