You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Docusaurus的浅色/深色模式?实现主题切换时替换图片

检测Docusaurus主题模式并切换图片的实现方案

当然可以搞定这个需求!Docusaurus其实已经给我们提供了现成的方式来检测主题模式,不管是在React组件里还是全局脚本中都能实现,下面我给你详细拆解几种方案:

方案一:React组件内用官方主题上下文(最推荐)

如果你是在自定义React组件里使用图片,直接用Docusaurus提供的useThemeContext钩子是最方便的——它能直接获取当前的主题状态,而且会自动响应主题切换。

import React from 'react';
import { useThemeContext } from '@docusaurus/theme-common';

export default function ThemedImage() {
  // 从主题上下文里拿到是否是深色模式的状态
  const { isDarkTheme } = useThemeContext();

  return (
    <img
      // 根据主题状态切换图片地址
      src={isDarkTheme ? '/img/dark-bg-image.png' : '/img/white-bg-image.png'}
      alt="适配主题的图片"
      // 可以加个过渡动画,切换更丝滑
      style={{ transition: 'opacity 0.3s ease' }}
    />
  );
}

之后你就可以在文档或者页面里直接引入这个组件啦,主题切换时图片会自动跟着变。

方案二:全局监听主题切换事件(适合非React场景)

如果你的图片是直接写在静态HTML里,或者需要在全局脚本中处理,那可以通过监听Docusaurus的themeChange事件来实现,同时初始加载时也能检测当前主题:

// 先获取目标图片元素
const themedImage = document.getElementById('your-image-id');

// 定义更新图片的函数
function updateImageForTheme() {
  // Docusaurus会给html元素加对应的主题类:theme-dark或theme-light
  const isDarkMode = document.documentElement.classList.contains('theme-dark');
  themedImage.src = isDarkMode ? '/img/dark-bg-image.png' : '/img/white-bg-image.png';
}

// 页面加载时先执行一次,确保初始状态正确
updateImageForTheme();

// 监听主题切换事件,每次切换时更新图片
window.addEventListener('themeChange', (event) => {
  const { isDarkTheme } = event.detail;
  themedImage.src = isDarkTheme ? '/img/dark-bg-image.png' : '/img/white-bg-image.png';
});

可选方案:用picture元素(仅跟随系统偏好)

如果你只需要跟随系统的深色/浅色偏好设置,可以用HTML的picture元素,让浏览器自动匹配:

<picture>
  <!-- 当系统偏好深色模式时加载这张图 -->
  <source media="(prefers-color-scheme: dark)" srcset="/img/dark-bg-image.png">
  <!-- 默认加载浅色模式的图 -->
  <img src="/img/white-bg-image.png" alt="适配主题的图片">
</picture>

⚠️ 注意:这个方法只跟着系统设置走,如果用户在Docusaurus里手动切换了和系统不同的主题,这个图片不会同步切换,所以如果要支持手动主题切换,还是优先用前两种方案。

内容的提问来源于stack exchange,提问作者Adegoke Temitope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:42:35