Tailwind CSS组件库v6.23:纯CSS原子化组件工厂
简介本资源是 Tailwind CSS 6.23 版本的完整组件实践包面向前端开发者、UI 工程师及响应式项目快速搭建者解决传统 CSS 开发效率低、定制难、响应式适配繁琐等痛点。压缩包含 2007 个文件主体为 1304 个 HTML 示例页展示各类组件用法、605 个 Vue 单文件组件支持主流框架集成、82 张 PNG 素材图含图标与界面截图辅以精简的 CSS/JS 配置文件与 JSON 元数据整体体积 50.94MB结构清晰、即开即用。已有 301 人学习下载适合中高级前端人员系统掌握 utility-first 开发范式。读者可直接复用按钮、卡片、模态框等预构建 UI 组件结合 JIT 编译特性体验按需生成样式通过 Vue 示例深入理解组件封装逻辑借助 HTML 演示页快速验证暗黑模式切换、断点响应行为及无障碍属性实践大幅缩短从设计到落地的开发周期。1. Tailwind CSS 组件库 v6.23不是 UI 框架是「可剪裁的样式原子工厂」你有没有试过在 Vue 项目里引入一个 UI 库结果发现光node_modules就吃掉 42MBimport三行代码后浏览器渲染卡顿半秒调试时点开 DevTools Styles 面板满屏!important和嵌套 7 层的选择器这不是性能问题是样式治理失控的早期症状。Tailwind CSS Components v6.23 不是另一个“开箱即用”的组件库——它压根没打包任何 JS 运行时不注册全局组件不劫持v-model也不提供主题切换 API。它是一套严格遵循 Tailwind 原子化设计哲学的、纯 CSS 的组件实现集合所有按钮、卡片、模态框、表单控件都由bg-blue-500,p-4,rounded-lg,shadow-md这类原生 class 组合而成零抽象层零运行时开销。它解决的不是“怎么快速搭页面”而是“怎么让团队在 30 人协作、5 个子项目、7 种设计规范并存的场景下依然能靠git grep定位到某处圆角值改在哪、谁加的!important、为什么这个 tooltip 在 Safari 下偏移 2px”。适合正在从 Bootstrap 迁移、被 Ant Design 主题定制绕晕、或正为 Next.js Tailwind 构建设计系统打地基的前端工程师。它不教你怎么写 CSS它逼你重新理解 CSS 是什么。2. 组件结构与源码组织看清 v6.23 的「无 JS」本质2.1 文件树即文档6 个核心目录的职责边界v6.23 的源码包解压后呈现极简结构没有dist/、没有build/、没有types/只有src/下 6 个目录每个目录名就是一份隐式契约src/ ├── base/ # 重置、排版、颜色变量非 Tailwind 默认色板而是可覆盖的 CSS 自定义属性 ├── components/ # 所有组件的 .css 文件button.css, card.css, modal.css... ├── utilities/ # 非标准但高频的工具类.sr-only-focusable, .animate-pulse-slow ├── plugins/ # 供 PostCSS 插件调用的 JS 配置仅用于生成变体无运行时 ├── themes/ # light/dark 主题的 CSS 变量定义非 JS 切换逻辑仅变量声明 └── index.css # 入口import 所有依赖含 layer 指令确保层级正确关键点在于components/下每个.css文件都是独立可删的。你要用button.css就只 import 它不用modal.css直接删掉这行import构建后它不会出现在最终 CSS 中。这和import tailwindcss/components的黑匣子完全不同——后者哪怕你只用了一个btn类整个组件层也会全量注入。提示themes/目录下的light.css和dark.css并非媒体查询封装而是两套独立的:root变量声明。实际项目中需配合>layer components { .btn { apply inline-flex items-center justify-center font-medium rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2; } /* 状态变体全部基于 Tailwind 原生 class 衍生 */ .btn-primary { apply bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500; } .btn-secondary { apply bg-gray-100 text-gray-800 hover:bg-gray-200 focus:ring-gray-500; } .btn-sm { apply px-3 py-1.5 text-sm; } .btn-lg { apply px-6 py-3 text-lg; } /* 禁用态显式覆盖 transition 和 pointer-events */ .btn:disabled { apply opacity-50 cursor-not-allowed pointer-events-none; } }这段代码的关键不在apply而在layer components的作用域隔离。它确保.btn类不会被layer utilities中的.p-4覆盖也不会因layer base中的* { box-sizing: border-box }被意外重置。v6.23 的所有组件都严格遵循此分层这意味着当你在项目中自定义.my-btn时只需声明layer components就能保证它与 v6.23 的.btn-*同级且可互斥。逻辑说明layer是 Tailwind 3.0 的核心机制它将 CSS 规则按优先级分组。base最低重置components居中组件utilities最高工具类。v6.23 把所有组件塞进components层等于给你的自定义组件划了一条“安全线”——只要你也用layer components就不会被tailwind utilities里的p-4或text-center意外覆盖。参数说明.btn-sm和.btn-lg并非响应式断点而是固定尺寸。若需响应式需手动扩展/* 在你的项目 css 中 */ layer components { .btn-responsive { apply px-4 py-2; } media (min-width: 768px) { .btn-responsive { apply px-6 py-3; } } }v6.23 不预设响应式因为“在移动端用大按钮”还是“在桌面端用小按钮”是设计决策不是技术约束。2.3 主题变量系统CSS 自定义属性如何替代 JS 主题管理src/themes/light.css的实质是:root[data-themelight] { --color-bg: #ffffff; --color-text: #1f2937; --color-border: #e5e7eb; --color-primary: #3b82f6; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); }而src/themes/dark.css是:root[data-themedark] { --color-bg: #111827; --color-text: #f9fafb; --color-border: #37414f; --color-primary: #60a5fa; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.2); }注意这里没有media (prefers-color-scheme: dark)。v6.23 强制要求你通过 HTML 属性控制主题原因很务实prefers-color-scheme无法支持用户主动切换比如右上角主题开关也无法在 SSR 场景下服务端直出正确主题。>import ./themes/light.css; import ./themes/dark.css; import ./base/variables.css; /* 定义 fallback 值如 --color-bg: #ffffff */ /* 组件中直接使用 */ .card { background-color: var(--color-bg); color: var(--color-text); border-color: var(--color-border); }参数说明variables.css中的 fallback 值至关重要。当># 方案一Git Submodule推荐便于后续更新 git submodule add https://github.com/xxx/tailwindcss-components-6.23.git src/lib/tailwind-components # 方案二直接下载解压适合临时验证 curl -L https://github.com/xxx/tailwindcss-components-6.23/archive/refs/tags/v6.23.zip -o tc-6.23.zip unzip tc-6.23.zip -d src/lib/ mv src/lib/tailwindcss-components-6.23-6.23 src/lib/tailwind-components然后在你的主 CSS 入口如src/index.css中/* src/index.css */ tailwind base; tailwind components; tailwind utilities; /* 导入 v6.23 的基础变量和组件 */ import ./lib/tailwind-components/src/base/variables.css; import ./lib/tailwind-components/src/index.css; /* 你的自定义组件必须放在 v6.23 之后确保 layer 优先级 */ layer components { .my-card { apply bg-white rounded-xl shadow-sm; } }逻辑说明import顺序决定layer优先级。tailwind components是 Tailwind 官方组件层如prose而import ./lib/.../index.css是 v6.23 的组件层。由于layer components是同名层后导入的规则会覆盖先导入的——所以你的.my-card必须写在import之后才能确保它不被 v6.23 的.card覆盖。3.2 PostCSS 配置仅需一行无需插件v6.23 对 PostCSS 配置零要求。它不依赖postcss-import因为所有import都是 CSS 原生语法它不依赖postcss-nested因为内部无嵌套语法它甚至不依赖tailwindcss插件本身——你只需确保项目已安装tailwindcss并配置了content路径扫描 HTML/JSXv6.23 的 class 就会被 PurgeCSS 正确识别。唯一需要确认的是tailwind.config.js中的content字段// tailwind.config.js module.exports { content: [ ./src/**/*.{js,jsx,ts,tsx}, // 扫描你的组件 ./src/lib/tailwind-components/src/components/*.css, // 关键让 PurgeCSS 知道这些 .css 文件里有 class ], theme: { extend: {}, }, plugins: [], }参数说明./src/lib/tailwind-components/src/components/*.css这一行是血泪经验。若遗漏PurgeCSS 会认为.btn-primary是未使用的 class构建时直接删除。v6.23 的 class 全在 CSS 文件里而非 JSX 中因此必须显式告知扫描路径。3.3 在 React/Vue 中使用class 字符串拼接的确定性v6.23 不提供任何 React/Vue 组件封装它只提供 class 名。这意味着你在 JSX 中这样写// React 示例 function MyButton({ variant primary, size md, disabled }: Props) { const baseClasses btn transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2; const variantClasses variant primary ? btn-primary : btn-secondary; const sizeClasses size sm ? btn-sm : size lg ? btn-lg : ; return ( button className{${baseClasses} ${variantClasses} ${sizeClasses}} disabled{disabled} {children} /button ); }Vue 3 Composition API 同理template button :class[ btn transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2, btn-${variant}, btn-${size} ] :disableddisabled slot / /button /template逻辑说明这种写法看似“原始”实则是对样式的完全掌控。btn是基础样式btn-primary是状态样式btn-sm是尺寸样式——三者可自由组合无耦合。对比 Ant Design 的Button typeprimary sizesmall /后者把语义type、尺寸size、状态loading全塞进 props导致你无法单独禁用hover效果而不影响focus环。参数说明transition-all duration-200是 v6.23 的默认过渡若需禁用直接覆盖// 禁用所有过渡 button classNamebtn btn-primary !transition-noneNo transition/button!是 Tailwind 的重要性标记它会生成transition: none !important确保覆盖。4. 避坑 / 常见问题 / 排查v6.23 的 4 个真实翻车现场4.1 现象构建后按钮样式消失DevTools 中.btn类显示为undefined原因PurgeCSS 未扫描到src/lib/tailwind-components/src/components/button.css中的.btn类。v6.23 的 class 全在 CSS 文件里而默认content只扫描*.js, *.jsx导致 PurgeCSS 认为这些 class 是“死代码”。解决在tailwind.config.js的content数组中显式添加 v6.23 的 CSS 路径如./src/lib/tailwind-components/src/components/*.css。不要用./src/lib/**/*glob 太宽泛会导致 PurgeCSS 性能暴跌。4.2 现象暗色模式下卡片背景仍是白色>import ./lib/tailwind-components/src/index.css; layer components { .my-btn { apply btn btn-primary; } /* 正确在 v6.23 之后声明 */ }4.4 现象apply报错Cannot resolve bg-blue-600但 Tailwind 的bg-blue-600在其他地方可用原因v6.23 的src/base/variables.css中定义了--color-primary: #3b82f6但未将其映射到 Tailwind 的theme.colors.primary。apply bg-blue-600依赖 Tailwind 的配置而 v6.23 的bg-blue-600是它自己components/button.css里硬编码的 class不是 Tailwind 生成的。解决不要在apply中混用 v6.23 的 class 和 Tailwind 的 class。v6.23 的.btn-primary已包含bg-blue-600你只需用.btn-primary若需新颜色应扩展 v6.23 的themes/变量而非修改 Tailwind 配置。5. 定制与扩展从“用组件”到“造组件”的临界点5.1 扩展主题新增high-contrast模式只需 3 个文件v6.23 的主题系统设计为“可无限叠加”。要新增高对比度模式你不需要改任何现有文件只需在src/themes/下新建high-contrast.css/* src/themes/high-contrast.css */ :root[data-themehigh-contrast] { --color-bg: #000000; --color-text: #ffffff; --color-border: #ffffff; --color-primary: #ffff00; --shadow-sm: 0 0 0 2px rgba(255, 255, 0, 0.5); }然后在主 CSS 入口追加importimport ./themes/light.css; import ./themes/dark.css; import ./themes/high-contrast.css; /* 新增 */ import ./base/variables.css;最后在 HTML 中切换html>layer components { .accordion { apply w-full border-b border-gray-200; } .accordion-item { apply border-t border-gray-200; } .accordion-header { apply flex justify-between items-center p-4 font-medium text-left; } .accordion-content { apply overflow-hidden transition-all duration-300; } .accordion-content[open] { apply max-h-96; } .accordion-content:not([open]) { apply max-h-0; } }第二步在src/index.css中importimport ./components/button.css; import ./components/card.css; import ./components/accordion.css; /* 新增 */第三步在 HTML 中使用无 JSdiv classaccordion details classaccordion-item summary classaccordion-header标题/summary div classaccordion-content open p内容/p /div /details /div参数说明details是原生 HTML 元素open属性控制展开/收起[open]是 CSS 属性选择器。v6.23 的accordion不依赖任何 JS完全由浏览器原生行为驱动。max-h-0和max-h-96的过渡效果是 CSStransition-all对max-height的平滑插值——这是现代 CSS 的能力不是 v6.23 的魔法。5.3 替换字体不改一行 JS只动 CSS 变量v6.23 的字体系统全由src/base/typography.css控制它不硬编码font-family而是引用 CSS 变量/* src/base/typography.css */ :root { --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; --font-serif: ui-serif, Georgia, Cambria, Times New Roman, Times, serif; } body { font-family: var(--font-sans); }要切换为思源黑体只需在src/themes/light.css中覆盖:root[data-themelight] { --font-sans: Source Han Sans SC, Noto Sans CJK SC, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif; }逻辑说明--font-sans是一个变量body使用var(--font-sans)而:root[data-themelight]重新赋值该变量。整个过程不涉及 Webpack 的file-loader、不触发字体文件下载、不修改任何构建配置——字体替换就是一次 CSS 变量重定义。6. 生产环境验证技巧用三行命令确认 v6.23 是否真正生效6.1 验证 PurgeCSS 是否保留了关键 class构建后检查最终 CSS 文件如dist/assets/index.css是否包含.btn,.btn-primary,.card等 v6.23 的 class。最简单的方法是用grep# 构建后执行 npx tailwindcss -i ./src/index.css -o ./dist/output.css --minify grep -E \.btn|\.card ./dist/output.css | head -10如果输出为空说明 PurgeCSS 删除了它们——立刻检查tailwind.config.js的content字段是否包含了 v6.23 的 CSS 路径。这是上线前必做的第一道防线。6.2 验证主题切换是否无 JS 依赖打开浏览器 DevTools切换到 Elements 面板手动修改html标签的>!-- 初始 -- html>button classbtn btn-primary my-custom-btnTest/button在 DevTools 中检查该按钮的 computed styles确认background-color来自--color-primaryv6.23 变量而padding来自my-custom-btn的apply p-6。如果background-color是#3b82f6硬编码值说明--color-primary未生效如果是rgba(0,0,0,0)说明变量 fallback 失败。注意v6.23 的layer components是它的护城河。我每次在新项目中集成它都会强制执行三步验证grep查 class、手动切style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />

相关新闻

DPDK本质解析:绕过内核的网卡直通与轮询机制

DPDK本质解析:绕过内核的网卡直通与轮询机制

1. 为什么“认识DPDK”不是从官网文档开始,而是从一块网卡的报文丢弃开始?很多人第一次听说DPDK,是在高性能网络服务、NFV或智能网关的招聘JD里看到的——“熟悉DPDK者优先”。也有人在技术分享会上听到“传统Linux协议栈转发10G流量只能到80…

2026/10/16 4:21:18 阅读更多 →
二叉树直径求解:后序遍历与递归返回值设计

二叉树直径求解:后序遍历与递归返回值设计

这是某刷题列表里的第39道经典题,名字叫“二叉树的直径”。别看问题描述只有一句话,它却是很多人栽在二叉树递归上的第一个坎:求一棵二叉树中任意两个节点之间最长路径的长度。我第一次做的时候天真地以为要找“树最宽的位置”,结…

2026/10/16 4:21:18 阅读更多 →
SQL时间计算函数详解:日期加减、时区与边界条件避坑指南

SQL时间计算函数详解:日期加减、时区与边界条件避坑指南

时间计算大概是SQL里最绕的一部分。字符串处理起码逻辑是直白的,但时间这东西,背后有日历、时区、闰年、工作日,还有各种数据库自己的"脾气"。我见过不少项目,功能都做完了,最后卡在时间统计口径上&#xff…

2026/10/16 4:20:18 阅读更多 →

最新新闻

OpenSceneGraph 缩放平移实战:从原理到顺滑交互实现

OpenSceneGraph 缩放平移实战:从原理到顺滑交互实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 5:50:43 阅读更多 →
ASTER GDEM镶嵌全流程:从数据预处理到接边处理与质检

ASTER GDEM镶嵌全流程:从数据预处理到接边处理与质检

1. 为什么我要自己动手做ASTER GDEM镶嵌第一次接触ASTER GDEM是在做一个区域地形分析的小项目,当时需要覆盖三个省份的连续高程数据。我一开始想得很简单,直接去下载现成的分幅数据,用GIS软件拼一下不就完了。结果打开一看,每幅数…

2026/10/16 5:50:43 阅读更多 →
Dijkstra算法三步证明:从贪心选择到最优路径的完整推导

Dijkstra算法三步证明:从贪心选择到最优路径的完整推导

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 5:50:43 阅读更多 →
手写识别技术演进综述:从传统管道到Transformer的深度解读

手写识别技术演进综述:从传统管道到Transformer的深度解读

最近集中啃了一批手写识别相关的文献,这篇《Survey on Handwritten Recognition》算是我收获比较大的一篇。它收录在2022年IEEE旗下一个综合性研讨会上,虽然名字带Survey,但并不是那种罗列论文的流水账,而是把过去几十年的方法脉络…

2026/10/16 5:50:43 阅读更多 →
LAMMPS fix viscous/sphere 命令完全指南:有限尺寸球体角速度阻尼的实现、scale 缩放与实战应用

LAMMPS fix viscous/sphere 命令完全指南:有限尺寸球体角速度阻尼的实现、scale 缩放与实战应用

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 导读:fix viscous/sphere 是 LAMMPS 中专门面向有限尺寸球体…

2026/10/16 5:50:43 阅读更多 →
REA 逆向环境一次装对:装前三问、装中三步、装后一条命令

REA 逆向环境一次装对:装前三问、装中三步、装后一条命令

REA 逆向环境一次装对:装前三问、装中三步、装后一条命令 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea 敲下 rea 的那一刻&#xff0…

2026/10/16 5:49:43 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →