我讨厌你怎么能真正看到网页加载。我认为等待页面完全加载并准备好显示(包括所有脚本和图像),然后让浏览器显示它会更具吸引力。所以我有两个问题...
- 我怎样才能做到这一点?
- 我对Web开发一无所知,但这是常见的做法吗?如果没有,为什么?
在此先感谢您的智慧!
我讨厌你怎么能真正看到网页加载。我认为等待页面完全加载并准备好显示(包括所有脚本和图像),然后让浏览器显示它会更具吸引力。所以我有两个问题...
在此先感谢您的智慧!
Answers:
出于所有给出的原因,这是一个非常糟糕的主意,甚至更多。就是说,这是使用jQuery的方法:
<body>
<div id="msg" style="font-size:largest;">
<!-- you can set whatever style you want on this -->
Loading, please wait...
</div>
<div id="body" style="display:none;">
<!-- everything else -->
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#body').show();
$('#msg').hide();
});
</script>
</body>
如果用户禁用了JavaScript,则他们将永远看不到该页面。如果该页面从未完成加载,则他们将永远看不到该页面。如果页面加载时间太长,他们可能会认为出了点问题,只是去别的地方,而不是*请稍候... *。
<noscript>
标签“撤消”display:none
效果。
我认为这是一个非常糟糕的主意。用户喜欢简单明了地查看进度。将页面保持在一种状态几秒钟,然后立即显示已加载的页面,将使用户感觉好像什么都没有发生,并且您很可能会失去访问权限。
一种选择是在后台进行填充处理时在页面上显示加载状态,但这通常保留给站点在实际使用用户输入进行处理时使用。
http://www.webdeveloper.com/forum/showthread.php?t=180958
最重要的是,您至少需要在页面加载时显示一些视觉活动,而且我认为一次将页面分成几小块并不是一件很糟糕的事情(假设您没有做会严重降低页面速度的事情)加载时间)。
display: none
。加载完所有内容后,微调框将逐渐消失,内容也会逐渐淡入。由于微调框现在被普遍理解为“正在加载,请稍候”,因此效果很好。注意:它使用jQuery。
这是使用jQuery的解决方案:
<script type="text/javascript">
$('#container').css('opacity', 0);
$(window).load(function() {
$('#container').css('opacity', 1);
});
</script>
我将此脚本放在</body>
标签后面。只需将“ #container”替换为要隐藏的DOM元素的选择器即可。我尝试了几种方法(包括.hide()
/ .show()
,和.fadeOut()
/ .fadeIn()
),并且仅设置不透明度似乎具有最少的不良影响(闪烁,更改页面高度等)。您也可以替换css('opacity', 0)
用fadeTo(100, 1)
一个平滑的过渡。(不,fadeIn()
至少在jQuery 1.3.2中不起作用。)
现在需要注意的是:之所以实现上述功能,是因为我使用的是TypeKit,刷新页面时会出现烦人的闪烁,并且加载字体需要几百毫秒的时间。因此,在TypeKit加载之前,我不希望任何文本出现在屏幕上。但是显然,如果您使用上面的代码,并且页面上的某些内容无法加载,您将遇到很大的麻烦。有两种明显的方法可以对其进行改进:
我不会在这里实施加载指示器,但是时间限制很容易。只需将其添加到上面的脚本中:
$(document).ready(function() {
setTimeout('$("#container").css("opacity", 1)', 1000);
});
因此,现在,在最坏的情况下,您的页面将需要多一秒钟的时间才能显示出来。
肯定有一个有效的用法。一种是防止人们单击链接/导致JavaScript事件在加载所有页面元素和JavaScript之前发生。
在IE中,您可以使用页面转换,这意味着直到完全加载页面才显示:
<meta http-equiv="Page-Enter" content="blendTrans(Duration=.01)" />
<meta http-equiv="Page-Exit" content="blendTrans(Duration=.01)" />
注意持续时间短。仅需确保页面在完全加载之前不显示即可。
在FireFox和其他浏览器中,我使用的解决方案是创建一个DIV,该DIV是页面大小和白色,然后在页面的最后放入JavaScript隐藏它。另一种方法是使用jQuery并隐藏它。不像IE解决方案那样轻松,但是两者都可以很好地工作。
在您的<body>标签之后,立即添加如下内容...
<style> body {opacity:0;}</style>
在<head>的第一件事中添加以下内容:
<script>
window.onload = function() {setTimeout(function(){document.body.style.opacity="100";},500);};
</script>
无论是好的做法还是坏的做法,都取决于您的访客以及等待所花费的时间。
仍然悬而未决的问题是,如何确保页面稳定,我在这里看不到任何答案。例如,如果您要加载字体,则页面可能会稍微重新排列,直到加载并显示所有字体。我想知道是否有一个事件告诉我页面已完成渲染。
还要确保服务器缓冲页面,并且不会立即(在构建时)将页面流式传输到客户端浏览器。
由于您尚未指定技术堆栈:
尽管这并不总是一个好主意,但是您可以自由决定是否真的要这样做。有几种不同的方法可以做到,我在这里找到了一个简单的例子:
http://www.reconn.us/content/view/37/47/
可能不是最好的解决方案,但是它应该可以帮助您开发自己的解决方案。祝好运。
在PHP-Fusion开源CMS(http://www.php-fusion.co.uk)中,我们在核心部分采用这种方式-
<?php
ob_start();
// Your PHP codes here
?>
YOUR HTML HERE
<?php
$html_output = ob_get_contents();
ob_end_clean();
echo $html_output;
?>
您将看不到任何东西一一加载。唯一的加载器将是您的浏览器选项卡微调器,它会在加载所有内容后立即显示所有内容。试试看。
此方法与html文件完全兼容。
除了Trevor Burnham的答案之外,如果您想处理禁用的javascript并推迟CSS加载
HTML5
<html class="no-js">
<head>...</head>
<body>
<header>...</header>
<main>...</main>
<footer>...</footer>
</body>
</html>
的CSS
//at the beginning of the page
.js main, .js footer{
opacity:0;
}
JAVASCRIPT
//at the beginning of the page before loading jquery
var h = document.querySelector("html");
h.className += ' ' + 'js';
h.className = h.className.replace(
new RegExp('( |^)' + 'no-js' + '( |$)', 'g'), ' ').trim();
JQUERY
//somewhere at the end of the page after loading jquery
$(window).load(function() {
$('main').css('opacity',1);
$('footer').css('opacity',1);
});
资源
您可以从让站点的主索引页面仅包含一条消息“正在加载”开始。在这里,您可以使用ajax来获取下一页的内容并将其嵌入到当前页面中,完成后删除“ Loading”消息。
您可能只需要在页面顶部添加一个加载消息容器(宽度/高度为100%),然后在加载完成时删除所述div就可以摆脱困境。
后者可能无法在两种情况下都完美运行,并且将取决于浏览器呈现内容的方式。
我不确定这是否是个好主意。对于简单的静态网站,我不会。但是,最近我从设计公司那里看到了很多笨拙的javascript网站,这些网站使用的是复杂的动画,并且只有一页。这些站点使用加载消息来等待所有脚本/ html / css加载,以便页面按预期运行。
我知道这是一个旧线程,但是仍然。另一个简单的选择是该库:http : //gayadesign.com/scripts/queryLoader2/
希望这段代码对您有所帮助
<html>
<head>
<style type="text/css">
.js #flash {display: none;}
</style>
<script type="text/javascript">
document.documentElement.className = 'js';
</script>
</head>
<body>
<!-- the rest of your code goes here -->
<script type="text/javascript" src="/scripts/jquery.js"></script>
<script type="text/javascript">
// Stuff to do as soon as the body finishes loading.
// No need for $(document).ready() here.
</script>
</body>
</html>