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

news2024/9/24 20:55:40

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

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

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

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

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

<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-components 的 ServerStyleSheet)可以确保样式在服务器端渲染时已经被注入到 HTML 中。
     
  9. 使用样式表链接的 media 属性:<link> 标签中添加 media 属性,指定样式表适用的媒体类型,例如 screen、print 或者 all 等,可以避免不必要的样式表加载,从而提高页面的性能和速度。

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


参考资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么数据需要 QA 流程

当有人问我做什么工作时&#xff0c;我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯&#xff0c;我做数据测试&#xff0c;”我试图解释&#xff0c;但常常无济于事。我有一些从事技术和软件开发的朋友&#xff0c;他们不太了解数据测试是什么&#…

[LLM 学习笔记] Transformer 基础

Transformer 基础 Transformer 模型架构 主要组成: Encoder, Decoder, Generator. Encoder (编码器) 由 N N N 层结构相同(参数不同)的 EncoderLayer 网络组成. In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}] I…

【WorldView系列卫星】

WorldView系列卫星 WorldView系列卫星是美国DigitalGlobe公司推出的一系列先进商业遥感卫星&#xff0c;旨在提供高分辨率的地球成像服务。该系列卫星以其卓越的成像能力&#xff0c;如高分辨率、快速重访时间和宽幅扫描能力&#xff0c;引领了地球观测技术的新标准。以下是对…

LCD1602

LCD1602 是一种工业字符型液晶显示屏&#xff0c;能够同时显示 16x2 即 32 个字符。 LCD的显示控制 通过向 LCD1602 发送指令和数据来控制其显示内容。指令包括清屏、设置光标位置、显示模式等&#xff1b;数据则是要显示的字符的 ASCII 码。LCD1602 内部有一个控制器&#x…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

ChatGLM-6B:部署指南与实战应用全解析

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 SD3ComfyUI文生图部署步骤DAMODEL-ChatGLM-6B 服务端部署1.1、实例创建1.2、模型准备1.3、模型启动 SD3ComfyUI文生图部署步骤 Chat…

centos系统配置本地镜像源

今天在安装docker相关的依赖包时&#xff0c;在centos系统上&#xff0c;发现很多原本的镜像地址&#xff0c;拉取rpm依赖包失败&#xff0c;因为我的centos系统&#xff0c;安装的时候使用的是最小化安装&#xff0c;很多rpm包没有安装好&#xff0c;所以在后续安装一些常规命…

电脑共享同屏的几种方法分享

实时共享屏幕的方法多种多样&#xff0c;适用于不同的设备和场景。以下是几种常见的实时共享屏幕的方法&#xff1a; 1. 使用无线投屏技术 原理&#xff1a;无线投屏技术允许设备通过Wi-Fi网络或其他无线连接方式&#xff0c;将屏幕内容实时投射到另一台设备上。 操作步骤&a…

如何分析开源项目

如何分析开源项目 教程&#xff1a;【狂神说Java】手把手教你如何分析开源项目_哔哩哔哩_bilibili 一.开源项目下载 1.下载 因为GitHub下载太慢了&#xff0c;下载完毕进行解压。 后端&#xff1a;eladmin: eladmin-jpa 版本&#xff1a;项目基于 Spring Boot 2.1.0 、 Jpa、…

如何在openEuler上安装和配置openGauss数据库

本文将详细介绍如何在openEuler 22.03 LTS SP1上安装和配置openGauss数据库&#xff0c;包括数据库的启动、停止、远程连接配置等关键步骤。 1、安装 使用OpenEuler-22.03-LTS-SP1-x64版本的系统&#xff0c;通过命令行安装openGauss数据库。 1.1、确保系统软件包索引是最新…

Anaconda安装保姆级教程

1.下载Anaconda 可以在官网下载地址链接: Anaconda官网 推荐&#xff1a;清华大学镜像 2.安装 推荐&#xff0c;允许其他程序&#xff0c;如VSCode、PyCham等自动检测anaconda作为系统上的主Python。 3.配置环境变量 D:\Anaconda3为安装路径 D:\Anaconda3 D:\Anaconda3\S…

HT6819 3.3W带数字音量控制/防削顶低EMI立体声D类音频功率放大器

特点 降低了内阻和热耗的EDMA专利技术&#xff0c;极大提升了 输出功率和产品可靠性 Po3.3 W(VDD5.0V,RL4Ω,THDN10%) Po1.7 W(VDD3.6V,RL4Ω,THDN10%) 优异的全带宽EMI抑制性能 a)独创的主动边沿控制专利(AROC&#xff0c;Active edge Ringing and Overshoot Control circuitr…

monaco-editor基本使用

前言 公司项目需要代码编辑器&#xff0c;多方参考之后用了monaco-editor。 一、monaco-editor是什么&#xff1f; Monaco Editor 是微软开源的基于 VS Code 的代码编辑器&#xff0c;运行在浏览器环境中。 二、使用步骤 1.npm下载插件 //我下载的版本 npm i monaco-edit…

Java_Day05学习

Object类被子类经常重写的方法 方法说明toString()返回当前对象本身的有关信息&#xff0c;按字符串对象返回equals()比较两个对象是否是同一个对象&#xff0c;是则返回****truehashCode()返回该对象的哈希代码值getClass()获取当前对象所属的类信息&#xff0c;返回Class对象…

使用 Loki、Loki4j、Grafana 和 Spring Boot 搭建一个轻量级、简单、易用的 Java 日志系统

要使用 Loki、Loki4j、Grafana 和 Spring Boot 搭建一个轻量级、简单、易用的 Java 日志系统&#xff0c;您可以按以下步骤进行。这个系统将利用 Loki 作为日志存储和聚合系统&#xff0c;Loki4j 作为 Java 的日志插件&#xff0c;Grafana 用于日志的可视化。 1.工具介绍&…

中兴数通产品厉害了,获得CC EAL3+认证!

不知道朋友们最近听说没有&#xff0c;中兴的数通产品是真争气&#xff0c;有25款成功通过了国际信息技术安全评估通用准则CC的EAL 3级别认证。中兴一直是通讯行业的领先企业&#xff0c;这次CC EAL 3级别认证覆盖了多款主流设备型号&#xff0c;证明了它在网络安全领域的实力确…

TraceId在线程池及@Async异步线程中如何传递

何时使用线程池 提起线程池相信大家都不陌生&#xff0c;什么情况下会考虑使用线程池呢&#xff1f;我总结了一下大概是这么几种情况 第一种情况&#xff1a;程序中有任务需要异步执行。这样不可避免的要分配线程去执行&#xff0c;如果这个异步任务执行的频次很低&#xff0…

模拟实现 string 类的一些常用函数

目录 构造函数 析构函数 拷贝构造 赋值重载 迭代器( begin() 和 end() ) 运算符重载流插入( operator << ( ) ) size() capacity() 运算符重载operator[ ] clear() reserve ( ) push_back ( ) append ( ) 运算符重载 operator ( ) insert ( ) erase ( )…

IO相关流

IO流 一、C语言的输入与输出1、介绍2、输入输出缓冲区&#xff08;1&#xff09;介绍&#xff08;2&#xff09;示意图 二、流1、介绍2、主要特点 三、CIO流1、介绍2、示意图 四、iostream1、介绍2、基本概念3、注意 五、类型转换1、operator bool&#xff08;1&#xff09;介绍…

计算机毕业设计非遗项目网站 登录注册搜索 评论留言资讯 前后台管理/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

遗项目网站需求&#xff0c;以下是一个基于Spring Boot、Java Web、J2EE技术栈&#xff0c;使用MySQL数据库&#xff0c;并结合Vue实现前后端分离的简要设计方案&#xff1a; 系统功能概述 ‌用户登录与注册‌&#xff1a;实现用户的注册、登录功能&#xff0c;确保用户信息的…