Предварительная загрузка изображений CSS

У меня есть скрытая форма контакта, которая развертывается нажатием кнопки. Его поля заданы как фоновые изображения CSS, и они всегда появляются немного позже, чем div, которые были переключены.

Я использовал этот фрагмент в разделе <head>, но не повезло (после того, как я очистил кеш):

<script>
$(document).ready(function() {
        pic = new Image();
        pic2 = new Image();
        pic3 = new Image();
        pic.src="<?php bloginfo('template_directory'); ?>/images/inputs/input1.png";
        pic2.src="<?php bloginfo('template_directory'); ?>/images/inputs/input2.png";
        pic3.src="<?php bloginfo('template_directory'); ?>/images/inputs/input3.png";
});
</script>

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

Спасибо за ваши слова.

Ответ 1

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

Вот тест: http://paragraphe.org/slidetoggletest/test.html

<script>
    var pic = new Image();
    var pic2 = new Image();
    var pic3 = new Image();
    pic.src="images/inputs/input1.png";
    pic2.src="images/inputs/input2.png";
    pic3.src="images/inputs/input3.png";
</script>

Ответ 2

Предварительная загрузка изображений только с использованием CSS

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

Чтобы "трюк" сработал, мы будем использовать свойство content, которое позволяет удобно устанавливать несколько URL-адресов для загрузки, но, как показано, псевдоэлемент ::after скрыт, поэтому изображения получаются быть предоставлено:

body::after{
   position:absolute; width:0; height:0; overflow:hidden; z-index:-1; // hide images
   content:url(img1.png) url(img2.png) url(img3.gif) url(img4.jpg);   // load images
}

Demo


Лучше использовать спрайт-изображение, чтобы уменьшить число http-запросов... (если имеется много сравнительно небольших изображений) и убедиться, что изображения размещены там, где используется HTTP2.

Ответ 3

Предварительная загрузка изображений с помощью HTML-тега <link>

Я полагаю, что большинство посетителей этого вопроса ищут ответ "Как я могу предварительно загрузить изображение до начала рендеринга страницы?" и лучшим решением для этой проблемы является использование <link> поскольку тег <link> способен блокировать дальнейшую визуализацию страницы. См упреждающий

Эти два значения значения rel (отношения между текущим документом и связанным документом) наиболее актуальны для данной проблемы:

  • prefetch: загрузить указанный ресурс при отображении страницы
  • preload: загрузить данный ресурс перед началом рендеринга страницы

Поэтому, если вы хотите загрузить ресурс (в данном случае это изображение) до начала процесса рендеринга <body>, используйте:

<link rel="preload" as="image" href="IMAGE_URL">

и если вы хотите загрузить ресурс во время рендеринга <body> но планируете использовать его динамически позже и не хотите беспокоить пользователя временем загрузки, используйте:

<link rel="prefetch" href="RESOURCE_URL">

Ответ 4

http://css-tricks.com/snippets/css/css-only-image-preloading/

Техника № 1

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

#grass { background: url(images/grass.png) no-repeat -9999px -9999px; }
#grass:hover { background-position: bottom left; }

Техника № 2

Если в рассматриваемом элементе уже применено фоновое изображение, и вам нужно изменить это изображение, вышеуказанное не будет работать. Обычно вы можете найти спрайт здесь (комбинированное фоновое изображение) и просто сдвинуть положение фона. Но если это невозможно, попробуйте это. Примените фоновое изображение к другому элементу страницы, который уже используется, но не имеет фонового изображения.

#random-unsuspecting-element { background: url(images/grass.png) no-repeat -9999px -9999px; }
#grass:hover { background: url(images/grass.png) no-repeat; }

Ответ 5

попробуйте следующее:

var c=new Image("Path to the background image");
c.onload=function(){
   //render the form
}

С помощью этого кода вы предварительно загружаете фоновое изображение и визуализируете форму при загрузке

Ответ 6

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

$(':hidden').each(function() {
  var backgroundImage = $(this).css("background-image");
  if (backgroundImage != 'none') {
    tempImage = new Image();
    tempImage.src = backgroundImage;
  }
});

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

Ответ 7

Если вы повторно используете эти изображения bg в любом месте на вашем сайте для ввода форм, вы, вероятно, захотите использовать спрайт изображения. Таким образом, вы можете централизованно управлять своими изображениями (вместо pic1, pic2, pic3 и т.д.).

Спрайты, как правило, быстрее для клиента, поскольку они запрашивают один (хотя и немного больший) файл с сервера вместо нескольких файлов. См. Статью SO для получения дополнительных преимуществ:

CSS спрайты

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

http://www.alistapart.com/articles/sprites

Ответ 8

как насчет загрузки этого фонового изображения где-то скрытым. Таким образом, он будет загружен, когда страница будет открыта и не будет выполняться в любое время после создания формы с помощью ajax:

body {
background: #ffffff url('img_tree.png') no-repeat -100px -100px;
}

Ответ 9

Единственный способ - Base64 закодировать изображение и поместить его внутри HTML-кода, чтобы ему не нужно было связываться с сервером для загрузки изображения.

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

body {
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
}

Ответ 10

Вы можете использовать этот плагин jQuery waitForImage, или вы можете поместить изображения в скрытый div или (width: 0 и height: 0 ) и использовать событие onload на изображениях.

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

Ответ 11

Если нет способа изменить CSS-код и предварительно загрузить изображения с помощью правил CSS для псевдонимов :before или :after, будет использоваться другой подход с использованием кода JavaScript, который можно использовать для CSS-правил загруженных таблиц стилей. Чтобы заставить его работать скрипты должны быть включены после таблиц стилей в HTML, например, перед закрытием тега body или сразу после стилей.

getUrls() {
    const urlRegExp = /url\(('|")?([^'"()]+)('|")\)?/;

    let urls = [];
    for (let i = 0; i < document.styleSheets.length; i++) {
        let cssRules = document.styleSheets[i].cssRules;
        for (let j = 0; j < cssRules.length; j++) {
            let cssRule = cssRules[j];
            if (!cssRule.selectorText) {
                continue;
            }

            for (let k = 0; k < cssRule.style.length; k++) {
                let property = cssRule.style[k],
                    urlMatch = cssRule.style[property].match(urlRegExp);
                if (urlMatch !== null) {
                    urls.push(urlMatch[2]);
                }
            }
        }
    }
    return urls;
}

preloadImages() {
    return new Promise(resolve => {
        let urls = getUrls(),
            loadedCount = 0;

        const onImageLoad = () => {
            loadedCount++;
            if (urls.length === loadedCount) {
                resolve();
            }
        };

        for (var i = 0; i < urls.length; i++) {
            let image = new Image();
            image.src = urls[i];
            image.onload = onImageLoad;
        }
    });
}

document.addEventListener('DOMContentLoaded', () => {
    preloadImages().then(() => {
        // CSS images are loaded here
    });
});

Ответ 12

Если элементы страницы и их фоновые изображения уже находятся в DOM (т.е. вы не создаете/не изменяете их динамически), тогда их фоновые изображения уже будут загружены. В этот момент вы можете посмотреть методы сжатия:)