Белая вспышка / мерцание в Safari при установке src фонового изображения с наблюдателем пересечения?

Я довольно много исследовал и не могу решить эту проблему. Отображается только в 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 предварительно загруженным полноразмерным изображением.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 059
1

Ответы 1

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

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