Функция запуска после загрузки фонового изображения - PullRequest
0 голосов
/ 24 ноября 2018

Я использую Jimdo и у меня есть данный div (содержащий 3 sub-div, я думаю, что это моя общая проблема, но я не уверен), я нашел с помощью браузера:

<div class="jtpl-background-area jqbga-container jqbga-web--image" background-area="" style="background-image: url('https://image.jimcdn.com/app/cms/image/transf/dimension=767x/path/s4354a59fbfee63e4/backgroundarea/ibb91266a7f033fa3/version/1529172695/image.jpg');background-position: 54.0833% 41.0025%;"></div>

Как сделатьЯ получаю функцию, запускаемую после загрузки фонового изображения?

Я уже потратил на это часы, испробовал множество способов, которые я нашел здесь, или инструменты, такие как waitforimages, - все еще безуспешно.Что происходит с Jimdo / этот div?Как получить что-то, запускаемое после загрузки фонового изображения?

var src = $('.jtpl-background-area').css('background-image');
var url = src.match(/\((.*?)\)/)[1].replace(/('|")/g,'');

var img = new Image();
img.onload = function() {
$('.jtpl-background-area').css('-webkit-animation', 'fadein 4s');
}
img.src = url;
if (img.complete) img.onload();

не работает.

$('.jtpl-background-area').waitForImages(true).done(function() {
$('.jtpl-background-area').css('-webkit-animation', 'fadein 4s');
});

не работает (скрипт waitforimages-включен правильно и непрозрачность.jtpl-background-area имеет значение 0 в css).

Любые идеи?

 $(window).on('load', function() {
    $(".jtpl-background-area").css('-webkit-animation', 'fadein 4s');
 });

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

-

Редактировать:

Относительно Скотта Маркуса и ответа здесь 'adeneo' ( Подождитедля полной загрузки фоновых изображений в CSS ):

  $(window).on('load', function() {
   $(".jtpl-background-area jqbga-container jqbga-web- 
   image").ready(function() {
  $(".jtpl-background-area").velocity({ opacity: 1 },{ duration: 3000});
   })
  });

Это здесь "работает" - но мои bg-изображения появляются слишком поздно.Но почему ничего не происходит, если я обменяю это на

var src = $(".jtpl-background-area jqbga-container jqbga-web-image");
var url = src.match(/\((.*?)\)/)[1].replace(/('|")/g,'');
var img = new Image();
img.onload = function() {
$('.jtpl-background-area').velocity({ opacity: 1 },{ duration: 3000});
}
img.src = url;
if (img.complete) img.onload();

?Где моя ошибка?Почему это не работает, и моя страница застряла?Он остается белым и вообще не загружается с этим кодом.

Или другими словами - как мне заставить

var src = $('#test').css('background-image');
var url = src.match(/\((.*?)\)/)[1].replace(/('|")/g,'');

var img = new Image();
img.onload = function() {
alert('image loaded');
}
img.src = url;
if (img.complete) img.onload();

работать с моим (данным и неизменным)

<div class="jtpl-background-area jqbga-container jqbga-web--image" background-area="" style="background-image: url('https://image.jimcdn.com/app/cms/image/transf/dimension=767x/path/s4354a59fbfee63e4/backgroundarea/ibb91266a7f033fa3/version/1529172695/image.jpg');background-position: 54.0833% 41.0025%;"></div>

точно?

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

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

По сути, мы следим за тем, чтобы при загрузке страницы не отображалось фоновое изображение, устанавливая background:none !important; в контейнер.

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

Вы можете или не можете возиться с флажком! Important для вашего варианта использования.

Это то, что выимел в виду?

$(document).ready(function() {
  var img = new Image();
  var container = $('.container');
  img.src = "https://placeimg.com/640/480/any";
  img.addEventListener('load', function() {
    container.addClass('hasBackgroundImage')
  });
});
.container {
  opacity: 0;
  background: none !important;
}

.hasBackgroundImage {
  opacity: 1;
  background-image: url('https://placeimg.com/640/480/any') !important;
  background-size: cover;
  height: 500px;
  width: 500px;
  transition: all ease-in-out 4s;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container"></div>
0 голосов
/ 25 ноября 2018

Вы можете сделать это следующим образом:
Скрипт начинает работать до того, как document загружен.
Он перехватывает встроенный style вашего div до его применения.
Затем используетImage объект для загрузки изображения и установка background-image загрузки.

var i = setInterval(function() {
  var div = document.querySelector('.jtpl-background-area');
  if (div) {
    clearInterval(i);
    var src = div.style.backgroundImage.replace(/^url\(['"]?|['"]?\)/ig, '');
    div.style.backgroundImage = 'none';
    var img = new Image();
    img.onload = function() {
      div.style.backgroundImage = 'url(' + src + ')';
      div.classList.add('loaded')
      img = null;
    }
    img.src = src;
  }
}, 10);
.jtpl-background-area {
  width: 330px;
  height: 200px;
  opacity: 0;
}

.loaded {
  transition: opacity 2s linear;
  opacity: 1;
}
<div class="jtpl-background-area jqbga-container jqbga-web--image" background-area="" style="background-image: url('https://image.jimcdn.com/app/cms/image/transf/dimension=767x/path/s4354a59fbfee63e4/backgroundarea/ibb91266a7f033fa3/version/1529172695/image.jpg');background-position: 54.0833% 41.0025%;"></div>

Надеюсь, это поможет.

0 голосов
/ 24 ноября 2018

Вместо использования фонового изображения, вы можете использовать элемент img и позиционирование CSS, чтобы наложить его на слой позади содержимого его родителя div.Затем вы можете использовать событие load элемента img.

document.querySelector(".jtpl-background-area").addEventListener("load", function(){
  console.log("Background loaded!");
  $(".hidden").fadeIn(4000);    // Fade the image in
});
/* by positioning the element absolutely and giving it a negative
   z-index, we put it behind any other items in the same space. */
.jtpl-background-area { position:absolute; z-index:-1; top:0; left:0; }

div div { background-color:rgba(255,255,255, .5); }

.hidden { display:none; } /* Image will start off hidden */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <div>Some other div content</div>
  <!-- The image will be hidden at first -->
  <img class="hidden jtpl-background-area jqbga-container jqbga-web--image" background-area=""  src="http://imgsrc.hubblesite.org/hvi/uploads/image_file/image_attachment/30741/STSCI-H-p1821a-m-1699x2000.png">
</div>
...