0

我正在使用 Jimdo 并且有一个给定的 div(包含 3 个子 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-script 包含正确并且 .jtpl-background-area 的不透明度在 css 中设置为 0)。

有任何想法吗?

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

导致背景经常出现得太晚。当图片仍未准备好/完全加载时显示页面。

-

编辑:

关于 Scott Marcus 和 'adeneo' 的答案(等待 CSS 中的背景图像完全加载):

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

这在这里“有效”-但我的背景图像出现得太晚了。但是,如果我交换这个,为什么什么都没有发生

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>

确切地?

4

3 回答 3

1

除了使用背景图像,您可以使用img元素和 CSS 定位将其置于其 parent 的内容后面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>

于 2018-11-24T18:52:49.863 回答
0

所以这就是我想出的。我们基本上是在创建图像,等待文件加载,然后将样式应用于容器。

基本上,我们通过设置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>

于 2018-11-24T22:09:12.807 回答
0

您可能会这样做:
脚本在document加载之前开始工作。它在应用之前
拦截style您的内联。 然后使用object 加载图像并设置onload。div
Imagebackground-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>

希望这可以帮助。

于 2018-11-25T01:26:04.927 回答