Фоновое изображение с запасным вариантом WebP и data-src

Итак, я занимаюсь оптимизацией своего веб-сайта, чтобы улучшить показатели Page Insights, два момента, на которые я могу обратить внимание:

  • Подавайте изображения в форматах нового поколения
  • Отложить закадровые изображения

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

Отложите закадровые изображения; Я использую data-src с небольшим количеством JS-скрипта, чтобы установить фоновое изображение в качестве источника данных, JS заменяет исходный SRC, который является src = "data:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs = ".

Взяв приведенный ниже пример, как мне использовать встроенное фоновое изображение с WebP с запасными вариантами, откладывая закадровые изображения?

HTML

<div id = "working-bg" class = "parallax" data-src = "/wp-content/uploads/2016/08/silva-planning-parralax.jpg" style = "background-image: url(/wp-content/uploads/2016/08/silva-planning-parralax.jpg)"></div>

JS для источника данных

<script>
function init() {
    var imgDefer = document.getElementsByTagName('img');
    for (var i=0; i<imgDefer.length; i++) {
    if (imgDefer[i].getAttribute('data-src')) {
        imgDefer[i].setAttribute('src',imgDefer[i].getAttribute('data-src'));
    } }

    var imgDeferSpan = document.querySelectorAll('span[data-src]');
    var styleSpan = "background-image: url({url})";
    for (var i = 0; i < imgDeferSpan.length; i++) {
        imgDeferSpan[i].setAttribute('style', styleSpan.replace("{url}", imgDeferSpan[i].getAttribute('data-src')));
    }

    var imgDeferDiv = document.querySelectorAll('div[data-src]');
    var styleDiv = "background-image: url({url})";
    for (var i = 0; i < imgDeferDiv.length; i++) {
        imgDeferDiv[i].setAttribute('style', styleDiv.replace("{url}", imgDeferDiv[i].getAttribute('data-src')));
    }

}

window.onload = init;

</script>

Заранее спасибо!

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
0
12 038
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Подавайте изображения в формате следующего поколения: Используйте CDN для изображений, например imagekit.io, и он сделает это за вас автоматически. У большинства CDN изображений есть бесплатный план, который отлично подходит для тестирования и небольших сайтов.

Отложить закадровые изображения: Используйте готовое решение, такое как lozad.js, которое заботится как об изображениях, так и о фоновых изображениях. Для фонового изображения вы можете пропустить настройку начального встроенного стиля, так как элемент имеет установленный размер и не вызовет перекомпоновки при загрузке изображения. Для <img> используйте пустой <svg> в качестве начального значения src, где 6 9 в viewBox ниже определяет соотношение между шириной (6) и высотой (9) => измените эти значения в соответствии с вашим контекстом.

data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 9'%3E%3C/svg%3E

Обратите внимание, что lozad.js использует Intersection Observer API, который до сих пор не поддерживается браузером, поэтому обязательно добавьте полифилл.

Удачи!

Я только что придумал решение, которое может сработать Тег уже выполняет свою работу, поэтому нам нужно немного js. Просто поместите тег внутри объекта, где вы хотите фоновое изображение с display: none;, и творите чудеса:

<div id = "bghere" style = "height: 400px; width: 400px;">
    <h1>Some content</h1>
    <picture style = "display:none;">
        <source srcset = "picture.webp"/>
        <img src = "picture.jpg"/>
    </picture>
</div>
<script>
function init(){
    var bghere = document.getElementById('bghere');
    bghere.style.backgroundImage = "url("+bghere.getElementsByTagName('picture')[0].getElementsByTagName('img')[0].currentSrc.toString()+")";
}
</script>

Подавайте изображения в формате следующего поколения:

Преобразуйте изображения *.jpeg или *.png в *.jpeg.webp или *.png.webp и настройте сервер для условной доставки webp.

<IfModule mod_mime.c>
    AddType image/webp .webp
</IfModule>
<ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_ACCEPT} image/webp
    RewriteCond %{REQUEST_URI} (?i)(.*)\.(jpe?g|png)$
    RewriteCond %{DOCUMENT_ROOT}%1\.%2.webp -f
    RewriteRule (?i)(.*)\.(jpe?g|png)$ %1\.%2\.webp [T=image/webp,E=webp:1,L]
    <IfModule mod_headers.c>
        Header append Vary Accept env=REDIRECT_webp
    </IfModule>
</IfModule>

Отложить закадровые изображения:

Добавьте атрибут loading=lazy к элементам <img>.

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