什么是FOUC无样式内容闪烁,如何避免

什么是FOUC无样式内容闪烁,如何避免

FOUC(Flash of Unstyled Content,无样式内容闪烁)是指在网页加载过程中,内容在样式表(CSS)完全加载和应用之前短暂显示为未样式化的状态,导致页面出现闪烁或布局跳动的现象。这种现象会影响用户体验,尤其是在网络较慢或样式表加载延迟的情况下。

FOUC 的原因

  1. CSS 加载延迟

    • 如果 CSS 文件较大或网络较慢,浏览器可能会先渲染 HTML 内容,再应用样式。
  2. CSS 放置在页面底部

    • 如果 CSS 文件在 <body> 底部引入,浏览器会先渲染未样式化的内容。
  3. JavaScript 阻塞渲染

    • 如果 JavaScript 阻塞了 CSS 的加载或渲染,可能导致 FOUC。
  4. 浏览器渲染机制

    • 某些浏览器(如旧版 IE)在样式表完全加载之前会先显示未样式化的内容。

如何避免 FOUC

  1. 将 CSS 放在 <head>
  • 方法

    • <head> 部分引入 CSS 文件,确保浏览器在渲染内容之前加载样式。
xml 复制代码
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <!-- 页面内容 -->
  </body>
</html>
  1. 使用内联关键 CSS
  • 方法

    • 将关键路径的 CSS(即首屏渲染所需的样式)内联到 <head> 中,确保页面初始渲染时样式已加载。
xml 复制代码
<!DOCTYPE html>
<html>
  <head>
    <style>
      /* 关键 CSS */
      body { font-family: Arial, sans-serif; }
      .header { background-color: #f0f0f0; }
    </style>
    <link rel="stylesheet" href="non-critical-styles.css">
  </head>
  <body>
    <!-- 页面内容 -->
  </body>
</html>
  1. 避免使用 @import 引入 CSS
  • 问题

    • @import 会导致 CSS 文件串行加载,增加 FOUC 的风险。
  • 解决方案

    • 使用 <link> 标签直接引入 CSS 文件。
  1. 使用 media 属性加载非关键 CSS
  • 方法

    • 为非关键 CSS 文件添加 media 属性,使其在页面加载完成后才应用。
ini 复制代码
<link rel="stylesheet" href="non-critical-styles.css" media="print" onload="this.media='all'">
  1. 避免阻塞渲染的 JavaScript
  • 方法

    • 将 JavaScript 放在页面底部,或使用 asyncdefer 属性异步加载。
xml 复制代码
<script src="script.js" defer></script>
  1. 隐藏内容直到样式加载完成
  • 方法

    • 使用 JavaScript 或 CSS 隐藏内容,直到样式完全加载。
xml 复制代码
<style>
  .hidden { display: none; }
</style>
<script>
  document.addEventListener('DOMContentLoaded', function() {
    document.body.classList.remove('hidden');
  });
</script>
<body class="hidden">
  <!-- 页面内容 -->
</body>
  1. 使用预加载(Preload)
  • 方法

    • 使用 <link rel="preload"> 提前加载关键 CSS 文件。
ini 复制代码
<link rel="preload" href="styles.css" as="style" onload="this.rel='stylesheet'">
  1. 优化 CSS 文件大小
  • 方法

    • 压缩 CSS 文件,减少文件大小,加快加载速度。
  • 工具

    • 使用工具如 CSSNano 或 Webpack 的 mini-css-extract-plugin
  1. 使用服务器端渲染(SSR)
  • 方法

    • 在服务器端渲染页面时直接注入样式,避免客户端渲染时的 FOUC。

总结

FOUC 的主要原因是样式表加载延迟或未正确加载。通过以下方法可以有效避免 FOUC:

  1. 将 CSS 放在 <head> 中。

  2. 内联关键 CSS。

  3. 避免使用 @import

  4. 使用 media 属性加载非关键 CSS。

  5. 避免阻塞渲染的 JavaScript。

  6. 隐藏内容直到样式加载完成。

  7. 使用预加载优化关键资源加载。

通过合理优化 CSS 加载和页面渲染流程,可以显著减少 FOUC,提升用户体验。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github

相关推荐
Fantasywt3 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
IT、木易3 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
张拭心5 小时前
2024 总结,我的停滞与觉醒
android·前端
念九_ysl5 小时前
深入解析Vue3单文件组件:原理、场景与实战
前端·javascript·vue.js
Jenna的海糖5 小时前
vue3如何配置环境和打包
前端·javascript·vue.js
星之卡比*6 小时前
前端知识点---库和包的概念
前端·harmonyos·鸿蒙
灵感__idea6 小时前
Vuejs技术内幕:数据响应式之3.x版
前端·vue.js·源码阅读
烛阴6 小时前
JavaScript 构造器进阶:掌握 “new” 的底层原理,写出更优雅的代码!
前端·javascript
Alan-Xia6 小时前
使用jest测试用例之入门篇
前端·javascript·学习·测试用例
浪遏6 小时前
面试官😏 :文本太长,超出部分用省略号 ,怎么搞?我:🤡
前端·面试