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

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

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

<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 в качестве своей библиотеки, и было бы здорово, если бы я мог использовать его также для организации этой проблемы.

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

12 ответов


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

body::after{
    position:absolute; width:0; height:0; overflow:hidden; z-index:-1;
    content:url(img01.png) url(img02.png) url(img03.png) url(img04.png);
}

демо


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


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

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

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

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; }

попробуйте с помощью этого:

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

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


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

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

CSS-изображение спрайты!--6-->

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

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


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

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

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

  • prefetch: загрузите данный ресурс во время рендеринга страницы
  • поджатия: загрузите данный ресурс до начала рендеринга страницы

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

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

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

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

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

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

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


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

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

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

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


когда нет возможности изменить код 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
    });
});

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


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

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

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