For the complete documentation index, see llms.txt. This page is also available as Markdown.

样式与主题

本页涵盖使用 styled-components 结合 Material UI 的样式方案为 Decentraland Web UI 制定的完整样式标准。

本文档中的所有代码示例仅用于说明。它们并不代表生产组件,而是用于展示模式和标准。

核心原则

  1. 仅使用对象语法 - 使用对象表示法以获得良好的 TypeScript 支持

  2. 以主题为先 - 所有值都来自 UI2 主题

  3. 不使用内联样式 - 所有样式均使用 styled 组件

  4. 全部类型化 - 利用 TypeScript 为 props 和 theme 提供类型

  5. 默认响应式 - 使用主题断点


对象语法标准

UI2 组件 必须 使用对象语法。这可确保良好的 TypeScript 支持、csstype 验证以及与主题的直接集成。

基本示例

// ✅ 好:对象语法
const Button = styled('button')({
  color: 'turquoise',
  padding: '8px 16px',
});

// ❌ 差:模板字面量语法
const Button = styled.button`
  color: turquoise;
  padding: 8px 16px;
`;

结合主题和 Props


元素语法

在为原生 HTML 元素添加样式时,始终使用函数调用形式 styled('tag').

正确语法

错误语法


不使用内联样式

内联样式(style={...}) 绝不能 用于 UI2 组件。

为什么不使用内联样式?

  • 绕过主题类型

  • 更难维护

  • 阻碍复用

  • 无法优化

  • 没有 TypeScript 验证

正确方式


断点

将 theme.breakpoints 辅助方法,而不是硬编码像素值。

断点辅助方法

辅助方法
用法
描述

up(key)

theme.breakpoints.up('md')

最小宽度及以上

down(key)

theme.breakpoints.down('md')

最大宽度及以下

between(start, end)

theme.breakpoints.between('sm', 'lg')

位于两个断点之间

only(key)

theme.breakpoints.only('md')

仅在此断点

示例

多个断点


间距比例

将 theme.spacing 专门用于外边距、内边距和间距。

间距约定

  • theme.spacing(n) 其中 n 是一个数字

  • 基础单位通常为 8px

  • spacing(1) = 8px, spacing(2) = 16px,等等。

  • 允许小数: spacing(1.5) = 12px

常见间距模式


Z-Index 与层叠

遵循主题的 z-index 级别。切勿使用任意 z-index 值。

主题 Z-Index 值

正确用法

层叠上下文最佳实践

  • 注意创建新的层叠上下文

  • 避免不必要的 position: relative 用于父元素

  • 记录为什么需要 z-index

  • 如果你需要新的层级,先将其添加到主题中


颜色令牌

始终从以下来源使用颜色: theme.palette 和 dclColors。不要使用临时拼凑的十六进制值。

调色板结构

Decentraland 颜色

示例


交互状态

所有交互控件都必须显示 hover、focus、active 和 disabled 的可见状态。

完整的交互组件

聚焦可见模式

始终使用 :focus-visible 而不是 :focus 以避免在鼠标点击时显示焦点环:


排版

使用主题排版变体,而不是自定义字体属性。


性能优化

不要在渲染中创建样式组件

对派生属性进行记忆化


命名规范

组件名称

  • 帕斯卡命名法 用于组件

  • 描述性名称

文件结构


下一步

最后更新于