Ste*_*fan 79
使用css样式初始隐藏某些页面元素,然后使用javascript将样式更改回页面加载后可见的问题是,没有启用javascript的人永远不会看到这些元素.所以这是一个不会优雅降级的解决方案.
因此,更好的方法是使用javascript初始隐藏以及在页面加载后重新显示这些元素.使用jQuery,我们可能会想要做这样的事情:
$(document).ready(function() {
$('body').hide();
$(window).on('load', function() {
$('body').show();
});
});
Run Code Online (Sandbox Code Playgroud)
但是,如果您的页面非常大且包含大量元素,那么此代码将不会很快应用(文档正文不会很快就绪),您可能仍会看到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>
Run Code Online (Sandbox Code Playgroud)
请注意,jQuery addClass()方法在.ready()(或更好的.on('load'))方法的**之外调用.
Ada*_*ner 22
仅限CSS的解决方案:
<html>
<head>
<style>
html {
display: none;
}
</style>
...
</head>
<body>
...
<link rel="stylesheet" href="app.css"> <!-- should set html { display: block; } -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当浏览器解析HTML文件时:
<html>.与使用JavaScript的解决方案相比,它的优势在于,即使禁用了JavaScript,它也能为用户工作.
注意:你可以放在<link>里面<body>.我确实认为这是一个缺点,因为它违反了惯例.这将是很好,如果有一个defer为属性<link>像有对<script>的,因为这将使我们能够把它的<head>,仍然实现我们的目标.
Law*_*Dol 18
一个不依赖于jQuery的解决方案,它可以在所有当前浏览器上运行,在旧浏览器上不执行任何操作,在头标记中包含以下内容:
<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>
Run Code Online (Sandbox Code Playgroud)
感谢@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>
Run Code Online (Sandbox Code Playgroud)
Jef*_*eff 16
这是对我有用的,不需要javascript,它非常适合包含许多元素和大量CSS的页面:
首先,增加一个专门<STYLE>设置的<HTML>,在你的HTML,如顶部,能见度“隐藏”和不透明度为“0”的标签,在年初<HEAD>元素,例如,在你的HTML加顶:
<!doctype html>
<html>
<head>
<style>html{visibility: hidden;opacity:0;}</style>
Run Code Online (Sandbox Code Playgroud)
然后,在最后一个.css样式表文件的末尾,将可见性和不透明度样式分别设置为“ visible”和“ 1”:
html {
visibility: visible;
opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)
如果您已经具有'html'标记的现有样式块,则将整个'html'样式移至最后一个.css文件的末尾,并如上所述添加'visibility'和'opacity'标记。
https://gist.github.com/electrotype/7960ddcc44bc4aea07a35603d1c41cb0
小智 9
我为避免FOUC所做的是:
将正文部分设置为: <script>
编写<script>JavaScript函数:<script>
使用这种方法,我的网页正文将保持隐藏,直到加载完整页面和CSS文件.加载完所有内容后,onload事件会使主体可见.因此,Web浏览器保持空白,直到屏幕上弹出所有内容为止.
这是一个简单的解决方案,但到目前为止它正在运作.
另一个也适用于Firefox Quantum的快速修复程序是一个空<script>标记<head>.但是,这会影响您的pagespeed洞察力和总体加载时间.
我用它取得了100%的成功.我认为这也是主要原因,为什么上面的解决方案与其他JS一起工作.
<script type="text/javascript">
</script>
Run Code Online (Sandbox Code Playgroud)
此页面上的每个答案都会减慢加载速度,并且只会隐藏潜在的问题。如果您遇到 FOUC,请找出发生这种情况的原因并解决它。
从本质上讲,这正在发生:
linkHTML 中的标签加载,而不是通过 JavaScriptscript标签放在link标签之前,这可能会强制执行“布局操作”,并在浏览器尝试加载样式之前欺骗浏览器进行渲染。作为参考,以下是 FOUC 的示例:
没有人谈论过 CSS@import
这对我来说是个问题,我直接在我的 css 文件中加载两个额外的样式表@import
简单的解决方案:将所有@import链接替换为<link />
| 归档时间: |
|
| 查看次数: |
32407 次 |
| 最近记录: |