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

Docusaurus移动端自定义Logo:Swizzling实现及配置修改

Docusaurus移动端切换导航栏Logo解决方案

一、自定义Navbar Logo组件的逻辑验证与重构

你通过Swizzling覆盖src/theme/Navbar/logo/index.js的思路完全可行,下面是验证过的稳定逻辑,同时附带重构优化建议:

1. 基础可行版组件代码

import React, { useMemo, useState, useEffect } from 'react';
import { useThemeContext } from '@docusaurus/theme-common';
import Logo from '@theme/Logo';

const CustomNavbarLogo = () => {
  const { isDarkTheme } = useThemeContext();
  const [isMobile, setIsMobile] = useState(false);
  const MOBILE_BREAKPOINT = 768; // 自定义移动端断点,可根据需求调整

  // 监听屏幕尺寸变化
  useEffect(() => {
    const checkScreenSize = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
    
    checkScreenSize();
    window.addEventListener('resize', checkScreenSize);
    return () => window.removeEventListener('resize', checkScreenSize);
  }, []);

  // 缓存Logo配置,避免不必要的重渲染
  const logoProps = useMemo(() => {
    if (isMobile) {
      return {
        src: isDarkTheme ? '/img/mobile-logo-dark.png' : '/img/mobile-logo-light.png',
        alt: 'Mobile Site Logo'
      };
    }
    // 非移动端复用原配置的Logo
    return {
      src: isDarkTheme ? '/img/logo-dark.png' : '/img/logo-light.png',
      alt: 'Site Logo'
    };
  }, [isMobile, isDarkTheme]);

  return <Logo {...logoProps} />;
};

export default CustomNavbarLogo;

2. 重构优化:使用Docusaurus内置断点钩子

Docusaurus自带useBreakpoint钩子,可以直接判断当前屏幕断点,无需手动监听resize事件,代码更简洁规范:

import React, { useMemo } from 'react';
import { useThemeContext, useBreakpoint } from '@docusaurus/theme-common';
import Logo from '@theme/Logo';

const CustomNavbarLogo = () => {
  const { isDarkTheme } = useThemeContext();
  const { isMobile } = useBreakpoint(); // 默认断点为996px,可通过themeConfig.customizeTheme调整

  const logoProps = useMemo(() => {
    if (isMobile) {
      return {
        src: isDarkTheme ? '/img/mobile-logo-dark.png' : '/img/mobile-logo-light.png',
        alt: 'Mobile Site Logo'
      };
    }
    return {
      src: isDarkTheme ? '/img/logo-dark.png' : '/img/logo-light.png',
      alt: 'Site Logo'
    };
  }, [isMobile, isDarkTheme]);

  return <Logo {...logoProps} />;
};

export default CustomNavbarLogo;

二、适配JSON格式的docusaurus.config.js

由于JSON格式的配置文件无法写入逻辑,你可以按以下方式配置,兼顾静态配置与自定义组件的灵活性:

  1. 保留原有深浅模式Logo的静态配置,作为非移动端的默认值:
{
  "themeConfig": {
    "navbar": {
      "logo": {
        "src": "/img/logo-light.png",
        "srcDark": "/img/logo-dark.png",
        "alt": "Site Logo"
      }
    }
  }
}
  1. 在自定义Logo组件中复用配置文件里的路径,避免硬编码:
import React, { useMemo } from 'react';
import { useThemeContext, useBreakpoint, useThemeConfig } from '@docusaurus/theme-common';
import Logo from '@theme/Logo';

const CustomNavbarLogo = () => {
  const { isDarkTheme } = useThemeContext();
  const { isMobile } = useBreakpoint();
  const { navbar } = useThemeConfig();
  const defaultLogo = navbar.logo;

  const logoProps = useMemo(() => {
    if (isMobile) {
      return {
        src: isDarkTheme ? '/img/mobile-logo-dark.png' : '/img/mobile-logo-light.png',
        alt: 'Mobile Site Logo'
      };
    }
    // 复用config里的Logo路径
    return {
      src: isDarkTheme ? defaultLogo.srcDark : defaultLogo.src,
      alt: defaultLogo.alt
    };
  }, [isMobile, isDarkTheme, defaultLogo]);

  return <Logo {...logoProps} />;
};

export default CustomNavbarLogo;

这样后续修改config中的Logo路径时,组件会自动同步,无需手动修改组件代码。

内容的提问来源于stack exchange,提问作者Miss Shrivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:40:17