什么是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

相关推荐
coding随想44 分钟前
JavaScript ES6 解构:优雅提取数据的艺术
前端·javascript·es6
小小小小宇1 小时前
一个小小的柯里化函数
前端
灵感__idea1 小时前
JavaScript高级程序设计(第5版):无处不在的集合
前端·javascript·程序员
小小小小宇1 小时前
前端双Token机制无感刷新
前端
小小小小宇1 小时前
重提React闭包陷阱
前端
小小小小宇1 小时前
前端XSS和CSRF以及CSP
前端
UFIT1 小时前
NoSQL之redis哨兵
java·前端·算法
超级土豆粉1 小时前
CSS3 的特性
前端·css·css3
星辰引路-Lefan1 小时前
深入理解React Hooks的原理与实践
前端·javascript·react.js
wyn200011282 小时前
JavaWeb的一些基础技术
前端