Docusaurus 文档侧边栏增加 New 标识

在使用 Docusaurus 搭建文档站点的时候,我们经常要给某个侧边栏菜单增加一些醒目的标识,比如针对新创建的文档给它一个 New 的标识,提醒过来看文档的用户 这是一个新增加项(不要遗漏)。

然而这个功能是 Docusaurus 本身没有的,但是它却提供了我们定制改造的支持。就是这个 Swizzling 特性。

有人可能不太认识这个单词,下面是它的翻译:

说白它的作用就是支持自定义布局样式

我们安装 Docusaurus 的时候根目录 src 里面并没有 theme 目录,当我们通过终端命令 npm run swizzle 会创建一个 theme 目录来放主题结构和样式代码。我们可以根据自己的需求对里面的 代码进行改造。

在这里我们需要找到文档侧边栏菜单功能所在的组件,可以通过 npm run swizzle -- --list 来查询都有哪些组件支持 Swizzle 操作。

从命名不难发现 DocSidebarItem 就是渲染侧边栏的菜单每一项的组件。找到相关代码:

jsx 复制代码
export default function DocSidebarItemCategory({
  item,
  onItemClick,
  activePath,
  level,
  index,
  ...props
}) {
  const {items, label, collapsible, className, href, customProps} = item;
  //...
  return (
    <li
      //...
      <div
        className={clsx('menu__list-item-collapsible', {
          'menu__list-item-collapsible--active': isCurrentPage,
        })}>
        <Link
          //...
          aria-current={isCurrentPage ? 'page' : undefined}
          aria-expanded={collapsible ? !collapsed : undefined}
          href={collapsible ? hrefWithSSRFallback ?? '#' : hrefWithSSRFallback}
          {...props}>
          {label}{ customProps && customProps.featured ? <sup className="new">New</sup> : '' }
        </Link>
      </div>
    </li>
  );
}

这里滤除无关的代码,直接定位到显示菜单名称的地方。

这里还有个问题就是,如果可以针对某一个菜单进行配置是否显示这个 New 的标识就好了。然而这个 Docusaurus 的作者也替你想好了。侧边栏项支持 customProps 属性。 你可以添加自己需要的额外的定义。

js 复制代码
 topicSidebar: [
    'topic/intro',
    {
      type: 'category',
      label: 'Next.js',
      collapsible: false,
      items: [
        {
          type: 'autogenerated',
          dirName: 'topic/nextjs',
        }
      ],
      customProps: {
        featured: true
      }
    }
  ]

好了接下来,就只用给它定义样式了,参考 MDN:

css 复制代码
sup.new {
  align-self: flex-start;
  text-transform: uppercase;
  font-size: 0.45rem;
  border-radius: 1rem;
  color: #fff;
  background-color: #fa383e;
  text-rendering: optimizeLegibility;
  padding: 0 0.4em;
  line-height: 1.7;
  display: inline-block;
}

这里其它的 CSS 属性都好理解,就是 text-rendering 属性好像没怎么见过。特意查了一下 MDN 文档

text-rendering CSS 属性定义浏览器渲染引擎如何渲染字体。浏览器会在速度、清晰度、几何精度之间进行权衡。

一个视觉上很明显的效果是,optimizeLegibility 属性值会在某些字体(比如,微软的 Calibri、Candara、Constantia 和 Corbel,或者 DejaVu 系列字体)小于 20px 时 把某些相邻字符连接起来(比如 ff、fi、fl 等)。

css 复制代码
/* Keyword values */
text-rendering: auto;
text-rendering: optimizeSpeed;
text-rendering: optimizeLegibility;
text-rendering: geometricPrecision;

/* Global values */
text-rendering: inherit;
text-rendering: initial;
text-rendering: revert;
text-rendering: revert-layer;
text-rendering: unset;

下面看下这几个值所代表的含义:

  • auto

    浏览器依照某些根据去推测在绘制文本时,何时该优化速度,易读性或者几何精度。对于该值在不同浏览器中解释的差异,请看兼容性表。

  • optimizeSpeed

    浏览器在绘制文本时将着重考虑渲染速度,而不是易读性和几何精度。它会使字间距和连字无效。

  • optimizeLegibility

    浏览器在绘制文本时将着重考虑易读性,而不是渲染速度和几何精度。它会使字间距和连字有效。该属性值在移动设备上会造成比较明显的性能问题

  • geometricPrecision

    浏览器在绘制文本时将着重考虑几何精度,而不是渲染速度和易读性。字体的某些方面---比如字间距---不再线性缩放,所以该值可以使使用某些字体的文本看起来不错。

我们这里为了清楚地显示 New 字样,将它的值设置为 optimizeLegibility

下面就是最终实现的效果:

这篇就写到这里,谢谢你的阅读~

相关推荐
用户2031196600962 分钟前
clipped的基本用法
前端
用户20311966009611 分钟前
Toggle的基本用法
前端
400分12 分钟前
SSE AI问答实现打字机效果实践-vue3版
前端
晴殇i12 分钟前
抛弃 try-catch,错误处理的新方案
前端·javascript·面试
阿白的白日梦17 分钟前
package.json的workspaces配置
前端·javascript
胖方Hale19 分钟前
09.Typescript 元组、枚举、never类型
前端·typescript
Aiolimp19 分钟前
React Router V7 基本使用
前端·react.js
胖方Hale21 分钟前
08. Typescript class 类
前端·typescript
用户527096487449021 分钟前
rsbuild-插件
前端