CSS | 如何来避免 FOUC(无样式内容闪烁)现象的发生?

一、什么是 FOUC(无样式内容闪烁)?

‌**FOUC(Flash of Unstyled Content)是指网页在加载过程中,由于CSS样式加载延迟或加载顺序不当,导致页面出现闪烁或呈现出未样式化的内容的现象。**‌

这种现象通常发生在HTML文档已经加载,但CSS样式表尚未加载或加载顺序不正确时,导致页面内容在没有应用样式的情况下短暂显示,随后样式表加载完成,页面内容才呈现出最终的样式效果。这种闪烁现象不仅影响用户体验,还可能对网站的整体形象和品牌形象造成负面影响。

FOUC 的原因是由于浏览器在渲染页面时,会先加载 HTML 文件,然后再加载 CSS 文件。如果 CSS 文件加载时间过长或者放置位置不当,浏览器就会先加载 HTML 文件并显示页面内容,而没有样式的 CSS 文件则会在加载完成后才被应用于页面,从而导致页面出现无样式的内容闪烁现象。

示例: ‌FOUC - FlashOf Unstyled Content 文档样式闪烁现象的产生

html 复制代码
<style media="all">
  @import"../fouc.css";
</style>

而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,然后再去导入外部的CSS文件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。

解决方法 简单的出奇,只要在**<head>** 之间加入一个**<link>** 或者**<script>**元素就可以了。

下面我们就来总结一下,都有哪些方法可以避免 FOUC现象的发生?

二、如何来避免 FOUC现象的发生?

为了避免FOUC现象,可以采取以下几种方法:

  1. ‌‌‌使用内联CSS或内部样式:使用内联CSS或在<head> 中使用内部样式------内嵌样式表:将CSS样式放在**<head>** 中‌:将CSS链接或样式块放在HTML文档的**<head>**部分,确保浏览器在渲染页面内容之前首先加载和应用样式。这样做可以确保页面在显示之前已经应用了所需的样式,避免了无样式内容的短暂显示。‌‌‌总之,使用内联CSS或内部样式都可以确保样式立即可用于渲染页面内容,避免FOUC现象的发生。

  2. 预加载样式表: 使用**<link>** 标签的**preload属性------在<link>标签中使用preload**属性,可以确保浏览器尽早加载CSS文件。这有助于减少FOUC现象的发生,因为样式表可以在页面内容渲染之前被加载。

  3. ‌**优化样式表的加载顺序和位置:通过合理规划样式表的加载顺序和位置,可以避免因样式表加载延迟而导致的FOUC现象。例如,将样式表放在<head>**中,或者使用媒体查询(media queries)来控制样式表的加载条件。

  4. **使用样式回退:**在CSS样式加载之前,可以使用基本的HTML样式来避免FOUC,确保页面在加载完成前依然有可用的样式。

  5. 合理使用Web 字体: Web 字体加载也可能导致 FOUC,可将字体文件嵌入到CSS中,也可以使用 **font-display: swap**或其他字体加载策略,确保在字体加载期间使用后备字体(如系统字体),避免内容无样式闪烁。

  6. 避免使用 JavaScript 动态加载样式表 :尽量避免通过 JavaScript 动态加载 CSS 文件。如果必须使用,可以确保在 DOM 加载之前完成样式表的加载。

  7. 避免使用阻塞CSS加载的脚本:确保JavaScript脚本不会阻塞CSS样式的加载,可以使用**asyncdefer**属性来异步加载脚本。

  8. 服务器端渲染(SSR)和样式提取 :对于使用 React、Vue 等框架的应用,使用服务器端渲染(SSR)和样式提取工具(如 styled-componentsServerStyleSheet )可以确保样式在服务器端渲染时已经被注入到 HTML 中。

  9. **使用样式表链接的 media 属性:**在 <link> 标签中添加 media 属性,指定样式表适用的媒体类型,例如 screen、print 或者 all 等,可以避免不必要的样式表加载,从而提高页面的性能和速度。

总之,避免FOUC现象需要从多个方面入手,包括优化CSS的加载方式、合理规划样式表的加载顺序和位置,以及使用成熟的样式表框架等。通过这些方法,可以有效减少FOUC现象的发生,提升用户体验和网站的整体形象‌。


参考资料

什么是FOUC(无样式内容闪烁)?你如何来避免FOUC?

相关推荐
Book_熬夜!5 小时前
HTML和CSS做一个无脚本的手风琴页面(保姆级)
前端·css·平面·html·html5
心.c15 小时前
植物大战僵尸【源代码分享+核心思路讲解】
前端·javascript·css·数据结构·游戏·html
我码玄黄20 小时前
HTML翻牌器:用CSS和HTML元素创造动态数字展示
前端·css·html
面包会有的,牛奶也会有的。20 小时前
python测试开发---css基础
css·python
LJ小番茄20 小时前
关于wordPress中的用户登录注册等问题
前端·javascript·css·html·wordpress
安冬的码畜日常1 天前
【CSS in Depth 2 精译_036】5.6 Grid 网格布局中与对齐相关的属性 + 5.7本章小结
前端·css·css3·html5·网格布局·grid·css网格
Zww08911 天前
html,css基础知识点笔记(二)
css·笔记·html
给bug两拳1 天前
HTML/CSS/JS学习笔记 Day5(CSS--C2 元素的显示模式)
css
界面开发小八哥1 天前
DevExpress WinForms v24.1新版亮点:升级的HTML & CSS支持
css·html·界面控件·winform·devexpress·用户界面