继续关于 使用变量为 Discourse 设置样式:展示与交流 的讨论:
我非常赞赏为改善 Discourse 的主题化体验所做的努力!但是,我并不完全相信如上主题中所述添加大量 CSS 变量的方法是最佳解决方案。我想分享一些关于原因的看法。
我一直在通过 Canvas 主题模板 试验这种方法,该模板本质上提供了一组可调变量,用于构建基础主题:
:root {
/* Layout */
--d-max-width: 1110px;
--canvas-nav-space: 0.75rem;
--canvas-content-padding: 1.5rem;
--canvas-topic-list-padding: 0.8em;
/* Base Styles */
--canvas-background: var(--secondary);
--canvas-surface: var(--secondary);
--canvas-border: 1px solid var(--primary-500);
--canvas-border-light: 1px solid var(--primary-200);
/* Border Radius */
--d-border-radius: 2px;
--d-border-radius-large: 2px;
--d-button-border-radius: 2px;
--d-input-border-radius: var(--d-button-border-radius);
--d-nav-pill-border-radius: var(--d-button-border-radius);
/* Button Styles */
--canvas-button-padding: 0.5em 0.65em;
--canvas-button-primary-padding: 0.5em 0.65em;
/* Header */
--canvas-header-height: 4rem;
--canvas-header-background: var(--header_background);
--canvas-header-border: none;
--canvas-header-shadow: var(--shadow-header);
/* Sidebar */
--d-sidebar-width: 17em;
--d-sidebar-background: var(--secondary);
--canvas-sidebar-border: 1px solid var(--primary-low);
--canvas-sidebar-scrollbar: var(--scrollbarWidth);
--d-sidebar-row-height: 2.2em;
--d-sidebar-highlight-background: var(--primary-low);
/* And several more... */
}
虽然这对于简单的调整来说效果相当不错,但在尝试扩展这种方法时,我遇到了一些限制:
认知负担和可发现性
大量的变量本质上需要一个查找表。这感觉与您在组件化框架中通常的工作方式脱节,而我实际上期望在那里设置组件的样式。也许只是我,但我感觉它将心智模型从“我想设置这个组件的样式”转移到了“我需要找到正确的变量名”。
缺乏级联逻辑
当前的实现将硬编码值直接分配给变量,而没有建立适当的级联层次结构:
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
这意味着没有来自更通用变量(如 --link-color 或 --border-width)的继承。如果我想进行系统性更改,我需要更新多个特定变量,而不是更改一个基础值。
设计到开发差距
我认为这种方法在设计工具(如 Figma)和实现之间工作时会产生摩擦。设计系统通常使用语义变量,这些变量与这些非常具体的实现变量不一一对应。
一种拥抱组件架构的替代方法
我认为我们可以通过结合基本的语义变量和可靠的组件定位来实现相同的目标,而且更加自然。与其拥有一个长长的特定变量列表,不如如果我们能够依赖 Discourse 中唯一且命名一致的组件类怎么办?例如 .d-sidebar、.d-topic-list、.d-header。
然后,将其与一小组基础变量配对,这些变量能够以 CSS 应有的方式进行级联:
/* Set the design foundation */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Override at the component level when you need to */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
对我来说,这更像是 CSS 的自然工作方式。我设置全局样式,然后在需要的地方进行细化。当我想更改应用程序中边框的外观时,我更改一个变量。当我想让侧边栏有所不同时,我专门定位侧边栏。

