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。

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

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

相关推荐
এ慕ོ冬℘゜2 小时前
如何在 HTML 中嵌入音频和视频?
前端·html·音视频
变与不变80610 小时前
jQuery怎么使用
前端·javascript
神膘护体小月半10 小时前
flex 布局的 order 属性
前端·css
paopaokaka_luck11 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.11 小时前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
前端 贾公子11 小时前
vite-plugin-uni-manifest 升级指南
前端
小码哥_常11 小时前
iPhone 用户传了张 HEIC,我的前端崩了
前端
小码哥_常11 小时前
你发的原图可能暴露你家地址——聊聊图片 EXIF 隐私
前端
java1234_小锋11 小时前
【技术专题】CSS3 网页技术 - CSS3 优先级
前端·css·css3
鸿蒙开发12 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos