确保浏览器一次显示所有内容
Posted
技术标签:
【中文标题】确保浏览器一次显示所有内容【英文标题】:Make sure that the browser displays everything at once 【发布时间】:2012-10-15 20:07:54 【问题描述】:我的这个网站包含大量图像和文本,并且在连接速度慢、互联网浏览器或 RAM 低的计算机上,首先加载文本,然后加载图像需要一段时间。如何确保同时显示所有内容?
我想到的解决方案:
-
输出缓冲 - 我的 php 脚本顶部和底部的
ob_start
和 ob_end_flush
以确保在处理脚本之前没有发送任何内容。
将整个 DOM 加载到 javascript 变量中,然后在全部加载完毕后将其回显。
您认为哪种方式最适用于所有浏览器,甚至适用于速度较慢的计算机?我还没有在具有不同速度和 RAM 的各种平台和计算机上对其进行测试。如果您有媒体重网站的经验或有更好的方法,请告诉我要采取的路径。
【问题讨论】:
不要坐在浏览器制造商的椅子上。保持一切尽可能小,浏览器将异步加载大部分内容 唯一的解决方案是在window.onload
之后隐藏您的整个页面,但这可能会导致用户离开您的网站,因为他们必须等待多长时间才能访问您的内容。解决此问题的更好方法是通过优化图像、用 css 样式替换图像、在必要时在图像精灵中组合图像等来减少图像对页面加载的影响。
你为什么要这个?愿用户体验之神来打败你。
考虑将图像组合成精灵。这将显着提高性能。发出了多少图像 HTTP 请求?所有图片都在同一个域中吗?
分析页面vie gtmetrix.com
【参考方案1】:
如果您有能力依赖 JavaScrip,有一个简单而有效的解决方案一次显示所有内容。
-
在整个窗口的顶部放置一个白色层。这会隐藏所有内容。
使用事件
window.onload
隐藏/移除覆盖层。
使用事件window.onunload
再次显示隐藏层。
图层:
...
<style>
html, body height: 100%;
#hiding
display: block;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background: #fff;
</style>
</head>
<body>
<div id="hiding"></div>
...
JavaScript 事件:
...
<script>
window.onload = function ()
document.getElementById('hiding').style.display = 'none';
;
window.onunload = function ()
document.getElementById('hiding').style.display = 'block';
;
</scritp>
</body>
</html>
注意:请勿将这些样式或 JavaScript 代码放入外部文件中。
注意 2:最好在隐藏层的中间放置一个加载微调器。您可以将此添加到#hiding ...
样式块:background: #fff url(/images/spinner.gif) center center;
【讨论】:
【参考方案2】:当 php 结束时,它会输出 HTML 代码,并在其中输出图像源路径(以及 css、js 等文件)。然后,浏览器将开始新的请求以获取页面所需的外部内容。 .
如果您尝试一次打印所有内容(一旦图像和其他资源完全加载),那么您可以使用 css 和 js 来执行此操作..
使用 css,您可以隐藏页面的“主包装器”,使用 display: none 规则。如果您愿意,您可以使用“加载”文本或基于 gif 的图像来向最终用户显示页面是正在加载中..
然后,在 javascript 中实现 window.onload 回调(不是 jquery 就绪事件)。一旦 dom 准备好并且所有资源都已完全加载,Window.onload 事件将触发。 You can see this explained in second paragraph
然后,在那个 onload 回调中,您只需要显示:阻止隐藏的“主包装”内容,并删除或隐藏“正在加载”消息。
【讨论】:
【参考方案3】:-
在 CDN 中托管您的图片
使用像 timthumb 这样的图像或页面缓存
使用 javascript 或 jquery 预加载图片
使用 div 或 section 而不是表格进行布局。 (我记得那些旧学校网站以及它们是如何加载的)
使用渐进式图像格式
GZIP 压缩
【讨论】:
+1 用于在 CDN 上托管图像(或以其他方式将请求拆分到多个主机) 他说Lol...I'm doing this because when the page is loading on those computers i've mentioned, it looks like a human being being formed from the skeleton to the meat slowly
所有这些规则都很好,但不会立即显示所有内容。【参考方案4】:
当浏览器请求 HTML 文档时,它会触发 HTTP 调用。然后它开始检查页面内容,当它找到外部资源(css 文件、脚本、图像)时,它会发出 其他异步 HTTP 请求(通常不超过 2 个到同一服务器),当资源被成功检索(甚至之前,如果它是一个 CSS),它开始检查它。
所以在 PHP 端你无能为力(缓冲输出?为什么你认为它应该工作?)
如果您的应用程序需要在启动前加载资源(例如,它就像一个带有加载屏幕的游戏),您必须自己管理它。例如,您的主 HTML 文档将仅包含一个 JS 文件,该文件又将下载资源。当所有资源(本例中的图像,加上一些文本文件)都已加载后,脚本将构建页面(同样,您可能会发现一些技巧来回收现有技术,如 DOM,但仅此而已完全取决于你)。
为了加快图像的检索速度,您可以使用高速服务器 (CDN),或者(如果合适的话甚至更好),您可以将所有图像组合成一个大的,并在客户端拆分它。如果您的应用是真正的游戏,这通常会用到。
【讨论】:
+1 for sprites... 在 CDN 和使用 sprites 之间,它将显着减少交错加载。 sprites会保证所有图片同时显示,CDN会允许客户端同时下载多个依赖文件...以上是关于确保浏览器一次显示所有内容的主要内容,如果未能解决你的问题,请参考以下文章
chrome有些请求成功却没有preview和response没内容
css 在SVG文件中,确保没有内联填充颜色以确保其有效。适用于所有浏览器