Dosu LogoDosu Logo
Ask
Join our Discord
Ant DesignPublic
Ant Design
DocumentsAnt Design
fix-switch-theme-fouc.zh-CN
fix-switch-theme-fouc.zh-CN
Type
External
Status
Published
Created
Jun 12, 2026
Updated
Jun 12, 2026
Source
docs/best-practice/fix-switch-theme-fouc.zh-CN.md

暗色模式下首屏会 “闪” 一下#

在使用 antd-style 时,首屏一般是亮色的。这就会导致暗色模式下,用户的界面先显示亮色主题,再切换到暗色主题。用户感受上就是会 “闪” 一下,体验很差。这一类问题有一个专业术语叫做 FOUC 。

如何解决?

本文预设你已经了解了 antd-style 在 SSG、SSR 下的解决方案。

原理分析:

  1. SSG 产出亮色 HTML;
  2. JS 水合后 cssinjs 运行,重新生成暗色类名与样式;

FOUC 的根本原因是,服务端不知道客户端此时的主题状态。

因此解决思路有两种:

  1. SSR:将用户客户端的主题状态让服务端可以感知,例如使用 query url、cookie 等机制;
  2. 颜色变量抽取为 CSS 变量;

SSR 解决方案#

以 next.js App Router 为例:

const RootLayout = ({ children }: PropsWithChildren) => {
  // 从 cookie 中获取 主题变化情况
  const cookieStore = cookies();
  const appearance = cookieStore.get('theme');

  return (
    <html lang="en">
      <body>
        <StyleRegistry>
          <Layout defaultAppearance={appearance?.value}>{children}</Layout>
        </StyleRegistry>
        <Analytics />
      </body>
    </html>
  );
};

export default RootLayout;
export interface AppThemeProps {
  children?: ReactNode;
  defaultAppearance?: ThemeAppearance;
}

const Layout = memo<AppThemeProps>(({ children, defaultAppearance }) => {
  console.log('server:appearance', defaultAppearance);

  return (
    <ThemeProvider
      defaultAppearance={defaultAppearance}
      onAppearanceChange={(appearance) => {
        document.cookie = `theme=${appearance};`;
      }}
      themeMode={themeMode}
      {children}
    </ThemeProvider>
  );
});

export default Layout;
Documents
Masonry Server-Side Rendering
2026-03-17-doctor-enhancements
2026-03-17-doctor-enhancements-design
2026-03-20-bug-fixes-round-2
2026-03-23-bug-report-commands
2026-03-23-bug-report-commands-design
2026-03-24-antd-mcp-server-design
2026-03-24-doctor-ecosystem-peerdeps
2026-03-24-doctor-ecosystem-peerdeps-design
2026-03-26-env-command
2026-03-26-env-command-design
2026-04-02-antd-v3-support-design
2026-04-02-antd-v3-support-plan
2026-04-17-opt-out-auto-report-design
2026-05-26-upgrade-command-design
AGENTS
CHANGELOG
CHANGELOG
CHANGELOG
CHANGELOG.zh-CN
CLAUDE
HISTORY
HISTORY
README
README
README
README
README
README
README
README
README
README
README.zh-CN
README.zh-CN
RFC-createStaticStyles
SKILL
antd-based-components.en-US
antd-based-components.zh-CN
antd-override.en-US
antd-override.zh-CN
babel-plugin.en-US
babel-plugin.zh-CN
bug_report
changelog.en-US
changelog.zh-CN
clay.en-US
clay.zh-CN
color-panel
compare.en-US
compare.zh-CN
components-usage.en-US
components-usage.zh-CN
controlled
create-instance.en-US
create-instance.zh-CN
create-static-styles.en-US
create-static-styles.zh-CN
create-styles.en-US
create-styles.en-US
create-styles.zh-CN
create-styles.zh-CN
create-stylish.en-US
create-stylish.zh-CN
css-in-js-intro.en-US
css-in-js-intro.zh-CN
cssinjs-compiler-difference.en-US
cssinjs-compiler-difference.zh-CN
custom-theme.en-US
custom-theme.zh-CN
custom-token-types.en-US
custom-token-types.zh-CN
design-v6
feature_request
fix-switch-theme-fouc.en-US
fix-switch-theme-fouc.zh-CN
genStyleUtils
global-styles.en-US
global-styles.zh-CN
index
index
index
index
index
index
index.en-US
index.en-US
index.zh-CN
index.zh-CN
index.zh-CN
intro
intro
introModal
introModal
mac-select.en-US
mac-select.zh-CN
migrate-less-application.en-US
migrate-less-application.zh-CN
migrate-less-codemod.en-US
migrate-less-codemod.zh-CN
migrate-less-component.en-US
migrate-less-component.zh-CN
mirgration-less-global-style.en-US
mirgration-less-global-style.zh-CN
motivationHelp
motivationHelp
nest-element-style.en-US
nest-element-style.zh-CN
overview
performance-comparsion.en-US
performance-comparsion.zh-CN
performance.en-US
performance.zh-CN
previewer-token-panel
proposalHelp
proposalHelp
question
reproHelp
reproHelp
reproModal
reproModal
setup-styled.en-US
setup-styled.zh-CN
spec
ssr.en-US
ssr.zh-CN
static-message.en-US
static-message.zh-CN
stepsHelp
stepsHelp
strategy.en-US
strategy.zh-CN
style-provider.en-US
style-provider.zh-CN
styled.en-US
styled.en-US
styled.zh-CN
styled.zh-CN
stylish.en-US
stylish.zh-CN
switch-theme.en-US
switch-theme.zh-CN
theme
theme-provider.en-US
theme-provider.zh-CN
use-responsive.en-US
use-responsive.zh-CN
use-theme-mode.en-US
use-theme-mode.zh-CN
use-theme.en-US
use-theme.zh-CN