如何停止网页上未样式化内容(FOUC)的闪烁?
Answers:
为避免FOUC,我要做的是:
将主体部分设置为: <body style="visibility: hidden;" onload="js_Load()">
编写一个js_Load()
JavaScript函数:document.body.style.visibility='visible';
通过这种方法,网页的正文将保持隐藏状态,直到加载整个页面和CSS文件为止。加载完所有内容后,onload事件将使主体可见。因此,Web浏览器将保持为空,直到所有内容都在屏幕上弹出为止。
这是一个简单的解决方案,但到目前为止,它仍然有效。
<noscript><style>body { visibility: visible; }</style></noscript>
在末尾添加,以便该站点也可以在禁用JS的情况下工作。
使用css样式最初隐藏某些页面元素,然后使用javascript在页面加载后将样式更改回可见的问题是,没有启用javascript的人将永远看不到那些元素。因此,这是一个不会优雅降级的解决方案。
因此,一种更好的方法是使用javascript来初始隐藏以及在页面加载后重新显示这些元素。使用jQuery,我们可能会想这样做:
$(document).ready(function() {
$('body').hide();
$(window).on('load', function() {
$('body').show();
});
});
但是,如果您的页面很大,包含许多元素,那么此代码将无法尽快应用(文档主体将无法尽快准备就绪),您仍然可能会看到FOUC。但是,即使在文档准备好之前,只要在头中遇到脚本,我们就可以隐藏一个元素:HTML标记。所以我们可以做这样的事情:
<html>
<head>
<!-- Other stuff like title and meta tags go here -->
<style type="text/css">
.hidden {display:none;}
</style>
<script type="text/javascript" src="/scripts/jquery.js"></script>
<script type="text/javascript">
$('html').addClass('hidden');
$(document).ready(function() { // EDIT: From Adam Zerner's comment below: Rather use load: $(window).on('load', function () {...});
$('html').show(); // EDIT: Can also use $('html').removeClass('hidden');
});
</script>
</head>
<body>
<!-- Body Content -->
</body>
</html>
请注意,jQuery addClass()方法被称为.ready()(或者更好的是.on('load'))方法的* outside *。
$('html').show()'
用$('html').removeClass('hidden');
。这样可以更清楚地知道ready函数正在撤消addClass
。
removeClass
(如我所建议的)而不是show
(如原始答案中的)来完成-否则html将永远不会显示。我相信jQuery的show()现在可以显式查找并恢复css样式中的任何显示状态,以避免干扰样式。因此,有必要实际删除“隐藏”类。
<style>html { display: none; }</style>
中的<head>
,然后是您之前的实际样式的纯CSS解决方案</body>
呢?
仅CSS的解决方案:
<html>
<head>
<style>
html {
display: none;
}
</style>
...
</head>
<body>
...
<link rel="stylesheet" href="app.css"> <!-- should set html { display: block; } -->
</body>
</html>
当浏览器解析HTML文件时:
<html>
。与使用JavaScript的解决方案相比,这样做的优势在于,即使禁用了JavaScript,它也将对用户有效。
注意:您要允许放<link>
里面<body>
。我确实将其视为不利因素,因为它违反了常规做法。如果有一个defer
for属性,<link>
就像for一样,那将是很好的<script>
,因为那将使我们能够将其放入<head>
并且仍然实现我们的目标。
display: none
也将隐藏背景图像或颜色很有用。由于我的网站主题是深色的,因此会闪烁白色。visibility: hidden
对于我来说,使用效果更好。
<head>
而不是中,该解决方案也将起作用<body>
。(尽管我想如果您的页面很长,浏览器可能会在页面末尾加载之前开始显示该页面。但是,这实际上是我的首选行为,因为我的站点正在从数据库中加载大表。)赞成不需要JavaScript的简单解决方案!
这是对我有用的,不需要javascript,它非常适合包含许多元素和大量CSS的页面:
首先,增加一个专门<STYLE>
设置的<HTML>
,在你的HTML,如顶部,能见度“隐藏”和不透明度为“0”的标签,在年初<HEAD>
元素,例如,在你的HTML加顶:
<!doctype html>
<html>
<head>
<style>html{visibility: hidden;opacity:0;}</style>
然后,在最后一个.css样式表文件的末尾,将可见性和不透明度样式分别设置为“ visible”和“ 1”:
html {
visibility: visible;
opacity: 1;
}
如果您已经具有'html'标记的现有样式块,则将整个'html'样式移至最后一个.css文件的末尾,并如上所述添加'visibility'和'opacity'标记。
https://gist.github.com/electrotype/7960ddcc44bc4aea07a35603d1c41cb0
html{display:none;}
在head
和html{display:block;}
样式表中使用基于Chromium的浏览器完全征服FOUC。(我没有遇到过深色背景问题body
。)
不依赖jQuery的解决方案将在所有当前的浏览器上运行,而在旧的浏览器上不执行任何操作,请在您的head标签中添加以下内容:
<head>
...
<style type="text/css">
.fouc-fix { display:none; }
</style>
<script type="text/javascript">
try {
var elm=document.getElementsByTagName("html")[0];
var old=elm.class || "";
elm.class=old+" fouc-fix";
document.addEventListener("DOMContentLoaded",function(event) {
elm.class=old;
});
}
catch(thr) {
}
</script>
</head>
感谢@justastudent,我尝试仅进行设置,elm.style.display="none";
并且它似乎可以按需运行,至少在当前的Firefox Quantum中如此。因此,这是一个更紧凑的解决方案,到目前为止,这是我发现的最简单的方法。
<script type="text/javascript">
var elm=document.getElementsByTagName("html")[0];
elm.style.display="none";
document.addEventListener("DOMContentLoaded",function(event) { elm.style.display="block"; });
</script>
elm.style.display = 'none';
,然后取消elm.style.removeProperty('display');
呢?
我想出了一种方法,不需要任何真正的代码更改,呜呼!我的问题与在一些javascript文件之后导入多个css文件有关。
为了解决这个问题,我刚刚移动了CSS链接,使它们位于我的javascript导入上方。这样就可以导入我所有的CSS并准备好尽快运行,这样,当HTML出现在屏幕上时,即使JS还没有准备好,页面也会被正确格式化。
这是我的代码..希望它能解决您的问题
set <body style="opacity:0;">
<script>
$(document).ready(function() {
$("body").css('opacity', 1);
});
</script>
<body style="opacity:0;">
到目前为止,我发现的最佳解决方案是这样的:
将标头的所有样式添加到中的<style/>
标签中<head/>
在样式标签的顶部添加.not-visible-first{visibility: hidden}
+其他标题样式
在主体末尾通过JS添加CSS
document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeend","<link rel=\"stylesheet\" href=\"/css/main.min.css?v=1.2.4338\" />");
并记得添加.not-visible-first{visibility: visible}
到main.min.css
此选项将创建更好的用户体验
我知道的最简单的方法是隐藏html标记,然后在javascript文件的底部淡入html标记。
的HTML
<html style="display:none;">
...
</html>
Java脚本
/*
* FOUC Fix - Flash of Unstyled Content
* By default, the <html> tag is hidden to prevent the flash of unstyled content.
* This simple fadeIn() function will allow the page to gracefully fade in once
* all assets are loaded. This line of code must remain at the bottom of the js
* assets.
*/
$( 'html' ).fadeIn();
资料来源:https : //gist.github.com/marchershey/139db0e8fd6f03a83578698409d333ce
fadeIn()
是一种jQuery方法,而不是本机JavaScript。