我正在使用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,并且在css中将.jtpl-background-area的不透明度设置为0)。
有什么想法吗?
$(window).on('load', function() {
$(".jtpl-background-area").css('-webkit-animation', 'fadein 4s');
});
导致背景弹出通常太晚了。图片仍未准备好/未完全加载时显示页面。
编辑:
关于斯科特·马库斯(Scott Marcus)以及'adeneo'(Wait for background images in CSS to be fully loaded)的回答:
$(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>
是吗?
答案 0 :(得分:1)
您可以使用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>
答案 1 :(得分: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>
答案 2 :(得分:0)
您可能会这样:
在加载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>
希望这会有所帮助。