2009-11-09 83 views
8

我有一页充满图像,我希望每个人加载时淡入。我有以下代码,它的作品,但似乎越野车,基本上有时并不是所有的图像淡入。使用jquery使图像淡入图像加载

有没有人有任何建议,如何改善这一点。

感谢

$('.contentwrap img').hide().load(function() { 
    $(this).fadeIn(1000); 
}); 

回答

0

你打的的document.ready该功能?

$(document).ready(function() { 
     // put all your jQuery goodness in here. 
    }); 

http://www.learningjquery.com/2006/09/introducing-document-ready

+0

是的,我有。我有很多其他的jquery也是如此工作正常 – James 2009-11-09 13:07:53

+0

$(document).ready'应该在加载完所有HTML(包括图像)后触发 – chelmertz 2009-11-09 13:46:53

+4

在DOM加载后触发 – James 2009-11-09 14:57:53

9

有时并不是所有的图像淡入

呀,这通常是一个相当基本的问题:一些图像加载完成您指定它们的负载之前事件处理器。当图像被缓存时,这尤其可能。

如果图像是在HTML的唯一可靠的方法是,不幸的是,包括(极其丑陋)内嵌onload属性:

<img src="..." alt="..." onload="$(this).fadeIn();"> 
+0

是的,我猜想这是问题,即时通讯想知道如果在某个地方夹住setTimeout可能会解决这个问题... – James 2009-11-09 14:59:28

+0

好吧,你可以有一个任意的超时时间,你希望*图像将被加载,而不是等待加载事件,但当然你不能保证他们真的是...... – bobince 2009-11-09 15:18:57

+0

刚刚意识到我正在以错误的方式思考问题。超时不会解决这个问题。嗯 – James 2009-11-09 17:36:56

2

你可以首先确保您的图片默认情况下隐藏(不需要再为你的jQuery hide电话)与一些CSS,

.contentwrap img { 
    display:none; 
} 

,然后在你的document.ready,你可以尝试以下。我承认在这里会有一些冗余,因为一些图像可能会(在幕后)试图淡化两次,但最终的结果看起来也是一样的。这是我试图给出一个简单答案的承诺。

这种情况将会出现在你的document.ready中,一些图像可能已经加载(特别是那些已经被缓存了的图像),有些图像可能还未被加载。

// fade in images already loaded: 
$('.contentwrap img').fadeIn(1000); 
// and tell pending images to do the same, once they've finished loading: 
$('.contentwrap img').load(function() { 
    $(this).fadeIn(1000); 
}); 

由于jQuery将“堆栈”你的动画效果,一旦事情是完全消退时,您可以再次调用淡入就可以了,并没有什么应该(明显)发生。

如果这是不可接受的,你可能会设计一些更复杂的方式来检查哪些图像已经淡入,哪些没有,在你设置加载事件之前。

祝你好运!

+1

可悲的是,即使没有完全加载,图像也会消失。我想知道是否可以只隐藏/淡入图像,如果它们在文档准备好执行时没有加载。所以缓存的图像是孤立的。 – James 2009-11-10 09:41:16

0

把你的代码,这个函数的内部。如果你使用$(document),它会在dom加载后立即生效。如果你使用身体,它会在身体完全加载后启动。这样,您的图片将在主体加载后始终淡入。

$('body').ready(function() { 
    //your code here 
}); 
+0

问题是关于图片加载,而不是页面加载 – 2012-12-05 20:27:46

0

为了处理缓存的图像,bobince的解决方案很有效,但正如他所说的,这很丑陋。

另一种解决办法是隐藏自己的图像,CSS和使用以下的javascript:

$(window).load(function(){ 
    $('.contentwrap img').not(':visible').fadeIn(1000); 
}); 

function showImages() { 
    $('.contentwrap img').load(function() { 
     $(this).fadeIn(1000); 
    }); 
}); 

showImages(); 

这样,大多数图像正确加载,如果他们被缓存起来,并隐藏马上(负载功能没有时间被解雇),页面的加载事件将使它们出现。 页面的加载事件确保一切都已加载。

7

如果从浏览器缓存中加载图像,则可能不会触发加载事件。为了说明这种可能性,我们可以测试图像的.complete属性的值。

$(document).ready(function() { 

    $('img').hide(); 
    $('img').each(function(i) { 
     if (this.complete) { 
      $(this).fadeIn(); 
     } else { 
      $(this).load(function() { 
       $(this).fadeIn(); 
      }); 
     } 
    }); 
}); 
+1

你怎么能得到这个工作的div背景图片? – 2014-01-16 17:50:46

4

将这段代码在网站的部分:

<script> 
     $('body').ready(function() { 

     $('img').hide(); 
     $('img').each(function(i) { 
      if (this.complete) { 
       $(this).fadeIn(); 
      } else { 
       $(this).load(function() { 
        $(this).fadeIn(2000); 
       }); 
      } 
     }); 
    }); 
</script> 

这可能不是最有说服力的解决方案,但它能够完成任务。如果你想看到它的一个例子,请查看我使用它的site

0

我使用David DeSandro的酷脚本检查图像是否已加载。 (例如,你可以写一个函数,它增加了一个类加载的图像,所以他们会在使用CSS过渡淡出检查出来:
http://desandro.github.io/imagesloaded/

0

你可以把所有的图像,并把它们放到一个图像和褪色,但他们都在同一时间进来,这将是一个大文件,这取决于你想使用它。