Я довольно много исследовал и не могу решить эту проблему. Отображается только в Safari (Mac и iOS). Работает в Chrome, FF, Edge и т. д.
ОБНОВЛЕНИЕ: мерцание происходит и в FireFox ...
Я использую IntersectionObserver API вместе с необходимым полифилом для отложенной загрузки изображений. Когда они попадают в поле зрения, наблюдатель пересечения заменяет изображение с низким разрешением, заданное как background-image, и заменяет его изображением с высоким разрешением, хранящимся в атрибуте данных в div.
Поведение «работает», когда задано размытое исходное изображение, которое затем заменяется на высококачественное, но между ними происходит белое мерцание или вспышка ... (Фон страницы белый, так что, может быть, это то, что просвечивает? )
Прочитав: (Как предотвратить мерцание фонового изображения при изменении) Я исправил проблему с прыжком, предварительно загрузив образы с помощью конструктора new Image().
const setBackgroundImage = (e) => {
let image = new Image();
image.onload = () => e.style.backgroundImage = `url(${e.dataset.bgImage})`;
image.src = e.dataset.bgImage;
};
Пример HTML-элемента (PHP):
<div class = "my-div"
style = "background-image: url('<?= $imagePreload ?? $image; ?>');"
data-bg-image = "<?= $image; ?>"
</div>
Я пробовал поиграть с backface-visibility: hidden, но там не повезло. Я ничего не анимирую, просто заменяю src на div предварительно загруженным полноразмерным изображением.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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