繁体   English   中英

在所有图像完全加载之前,如何隐藏页面内容?

[英]How can I hide a page contents until all the images are fully loaded?

我正在尝试优化一个加载非常糟糕的网站。 我已经重新排序、压缩和缩小了 js 和 css,但最大的问题是图像。 该站点中有一些非常重的图像,因此当它开始加载内容时会在加载所有图像的同时跳转。

我无法手动设置包含图像的 div 的高度,因为它们是用户提交的,虽然宽度是固定值,但高度不是。

我知道这可能不是一个好习惯,但我认为页面在显示内容之前需要两秒钟更好,那两秒钟内它会变得跳跃且无法使用。

1.) 这在技术上可行吗? 如何? (我想知道这一点,即使这不是一个好习惯)

2.) 如果这不是一个好习惯,你将如何避免这个问题?

使用JQuery非常容易。 无论如何,我建议使用该框架,即使它不是针对此特定解决方案:

function preload(arrayOfImages) {
    $(arrayOfImages).each(function(){
        $('<img/>')[0].src = this;
    });
}

像这样使用它:

preload([
    'img/apple.jpg',
    'img/banana.jpg',
    'img/pear.jpg'
]);

使用 CSS 和 JQuery 可以轻松隐藏您的站点:

CSS:

body {
    display:none;
}

JQuery:

$(function(){
    $('body').show();
    // or fade it in: $('body').fadeIn();
});

在 Body 标签之后,添加一个 Div 元素以覆盖页面的整个长度和宽度,使其成为白色背景或添加“加载”图像,将其 z-index 设置为 Max(9999 或其他东西),使其位于顶部一切,并给它一些ID /名称

并使用带有 Body onLoad 事件的 Javascript 来隐藏或删除该 Div 元素。

就像是

<body onload='document.body.removeChild(document.getElementById("bigDiv"));'>

<div style="width:100%;height:100%;background:white;" id=bigDiv>Loading...</div>

首先要检查的重要事项 - 确保图像是可缓存的。 有时会禁用图像缓存。 检查的方法是直接调用网络服务器:

 telnet localhost 8080
 GET /images/flibble.gif HTTP/1.0

并查看返回的内容。 它应该返回类似 Expires: 或 Cache-Control 的内容。

这个页面似乎描述得很好: http://www.web-caching.com/mnot_tutorial/how.html

另一个技巧是在标签中指定图像的大小。 这极大地提高了性能,因为浏览器不需要等到页面加载完毕。

我以前写过自己的 js 图像预加载器,我要发布的内容与它伪相似,但需要一些工作。 基本上,为了使您的页面加载良好,答案不是隐藏主体以阻止它跳来跳去,而是美化图像加载发生的情况。 除了把婴儿和洗澡水一起扔掉之外,如果用户在等待时可以看到发生的事情,通常网站似乎加载速度更快。

因此,您需要做的(对于每个图像,或至少每个主要或大图像)是在图像加载时显示一个加载 gif(查看http://ajaxload.info ),然后当它完成时,您可以使用 jQuery 来将其容器设置为正确的高度并淡入图像。 这会阻止你的页面跳来跳去(或者更确切地说,让它在跳转时看起来更漂亮)。

为了达到这种效果,这样的事情应该可以解决问题:

function imageLoader(elem)
{
  //set all images in this elem to opacity 0
  elem.children('img').css('opacity', '0');
  var image = new Image();
  //show loading image
  elem.append('html for loading image');

  //when the image loads, animate the height of the elem and fade in image
  image.onload=function()
  { 
       var h = image.height;
       elem.animate({height:h+'px'}, function(){
         elem.children('img').fadeIn();
         elem.children('html for loading image').remove(); 
       });
  };

  image.src=elem.children('img').attr('src');
}

像这样使用它:

imageLoader($('someElementWithAnImageTagInside'));

同样,这实际上只是伪代码,但希望能给您一些想法。

希望这可以帮助

你可以使用阻止插件来阻止页面。 关联

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM