跳到主要内容

Docusaurus 文档侧边栏增加 New 标识

· 阅读需 6 分钟
编程范儿

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

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

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

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

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

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

从命名不难发现 DocSidebarItem 就是渲染侧边栏的菜单每一项的组件。

执行命令:

npm run swizzle @docusaurus/theme-classic DocSidebarItem -- --eject

执行完命令,目录 src/theme 下会多出一个 DocSidebarItem 目录,找到相关代码:

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 属性。 你可以添加自己需要的额外的字段。

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

好了接下来,就只用给它定义样式了,参考 MDN 上的 BETA 标识:

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 等)。

/* 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

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

后面如果哪个侧边栏菜单项需要增加 New 标识,只需要在侧边栏配置文件 sidebars.js 对应的菜单配置属性 customProps 里面 增加 featured: true 即可。

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

太空编程
分享硬核的前端编程知识。
想及时了解前端相关资讯,请关注作者公众号“太空编程”,回复关键字,获取丰富的学习资料。