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

相关推荐
向日葵花籽儿9 分钟前
#运维 | 前端 # Linux http.server 实践:隐藏长文件名,简短路径 (http://IP:port/别名 ) 访问
linux·运维·前端
zheshiyangyang22 分钟前
uni-app学习【pages】
前端·学习·uni-app
nightunderblackcat1 小时前
新手向:异步编程入门asyncio最佳实践
前端·数据库·python
前端工作日常1 小时前
我的 Jasmine 入门之旅
前端·单元测试·测试
前端小巷子2 小时前
Vue 3 运行机制
前端·vue.js·面试
奋斗的小羊羊9 小时前
HTML5关键知识点之多种视频编码工具的使用方法
前端·音视频·html5
前端呆猿9 小时前
深入解析HTML5中的object-fit属性
前端·css·html5
再学一点就睡9 小时前
实现大文件上传全流程详解(补偿版本)
前端·javascript·面试
你的人类朋友10 小时前
【Node&Vue】什么是ECMAScript?
前端·javascript·后端
路灯下的光10 小时前
用scss设计一下系统主题有什么方案吗
前端·css·scss