页面性能优化之内容加载优化

图片按需加载
现在大部分门户或电子商务网站的产品列表页,都比较长,且图片较多,如果全部加载,通常会耗费较多时间,而且有数据表明长时间的等待页面响应会流失大部分的用户,
所以此时我们就可以考虑只加载第一屏的内容,第一屏内容以外的图片按需加载,用户滚动到该屏时再加载(包括tab切换也可以考虑未显示的区域图片不加载),这样用户在不进行任何操作时,加载页面会很快.
看下面的简单demo:

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>按需加载的图片</title>
</head>
<body>
<script type="text/javascript">
for(var i=0; i<60; i++){
    document.write("这里是正文内容 <span style='color:#999;font-size:12px;'>[往下拉动滚动条]</span><br />");
}
</script>
<p style="color:red">这是按需加载的图片</p>
<p><img data_src="http://www.ueder.net/testhtml/picshow/datapic/0e0c883622903fb1a61e12be.jpg" width="400" height="600" src="" alt="" /></p>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
var itv;
$(window).scroll(function(){
    clearTimeout(itv);
    itv = setTimeout(function(){
        var winHeight = $(window).height();
        var scrolltop = $(window).scrollTop();
        var oTop = $("img").offset().top;
        if((oTop-scrolltop)>0 && (oTop-scrolltop)<winHeight){
            var src = $("img").attr("data_src");
            $("img").attr("src",src)
        }
    },500);
});
</script>
</body>
</html>

点运行可查看结果,这里测试代码略显粗糙,其实可以利用JQuery好好的用插件形式封装一下,比如可以判断img是否有src属性,没有再执行赋值操作,避免重要赋值,以及setTimeout的使用可以避免滚动过程中大量scroll事件引起性能损耗.

页面DOM结构按需渲染
按需渲染与按需加载不同, 按需渲染是指DOM结构在浏览器的呈现过程, 这无关网络, 是浏览器构建盒模型,渲染页面的过程,
一个页面通常内容有轻有重,有时候我们会希望最先呈现给用户的是一些重要信息, 这个一方面可以在页面结构上做一些小技巧, 像经典的负边距三列布局,就可以让中间重要内容列,在代码上首先呈现,
另一方面则可以通过把次要内容放置于textarea中并且隐藏它,此时页面会加载相关文本,但不会渲染页面DOM结构,等到需要呈现的时候,再把textarea中的内容赋给相应的容器,再进行渲染..
看下面的代码:

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>页面DOM按需渲染</title>
<style>
.unimportant { float:left; 300px; height:200px; background:red; color:#fff; }
.important { float:left; margin-left:20px; 400px; height:300px; background:blue; color:#fff; }
.undis { display:none; }
</style>
</head>
<body>
<div>
<textarea id="txtarea1" name="" cols="" class="undis" rows="">
<div class="unimportant"> 这里的是先加载后渲染的次要内容 </div>
</textarea>
</div>
<div class="important"> 这里显示的是重要内容 </div>
<script type="text/javascript">
    var txtarea1 = document.getElementById("txtarea1"),
        parentnode = txtarea1.parentNode;
    parentnode.innerHTML += txtarea1.value;
</script>
</body>
</html>

以上代码可以看到实现原理很简单,次要内容在代码上置前,如果不做处理,是会比重要内容先呈现的,此时就先放置于textarea中,需要时再加入到页面渲染.

sprites图片预加载
现在大部分页面上都会使用sprites图片技术, 因sprites图片一般较小, 且对页面显示完整较重要, 可考虑在页面开始时就预加载进sprites图片, 像下面这段代码即可:

[隐藏代码]

var img =newImage();
img
.src ="sprites.png";

这样即可达到预加载的效果,也可以在任何你认为需要的地方进行预加载.

script及css的预加载
因为浏览器会缓存外部JS及CSS文件 ,所以script与css文件同样可以进行预加载,
很多门户首页或流量大的页面,为了节省http请求数,常常会把JS及css直接写在页面上, 但子页一般是使用外调的CSS及JS文件,此时就可以考虑在首页加载完毕时, 在用户空闲时,在后台加载子页所需要的CSS及JS文件即可,同时又不影响用户操作,可以使用setTimeout动态加载外部JS及CSS.
动态加载外调 js及CSS可参考 这个Der微型库,提供的方法,用法也很简单:

[隐藏代码]

//加载js带回调
Der.loadScript("http://www.ueder.net/derjs/Der.js",function(){
   
//这里是加载完毕的回调函数
});
//加载CSS
Der.loadCss("http://www.ueder.net/wp-content/themes/DerStyle/style.css");

预加载与按需加载(或延迟加载)似乎听起来矛盾, 事实上并不冲突, 根据用户体验可以适当的选择预加载或按需加载.

转载:http://www.ueder.net/2011/01/23/%E9%A1%B5%E9%9D%A2%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%8C%89%E9%9C%80%E5%8A%A0%E8%BD%BD%E5%8F%8A%E6%8C%89%E9%9C%80%E6%B8%B2%E6%9F%93/

原文地址:https://www.cnblogs.com/huanlei/p/2842248.html