样式与主题
本页涵盖使用 styled-components 结合 Material UI 的样式方案为 Decentraland Web UI 制定的完整样式标准。
核心原则
仅使用对象语法 - 使用对象表示法以获得良好的 TypeScript 支持
以主题为先 - 所有值都来自 UI2 主题
不使用内联样式 - 所有样式均使用 styled 组件
全部类型化 - 利用 TypeScript 为 props 和 theme 提供类型
默认响应式 - 使用主题断点
对象语法标准
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 以避免在鼠标点击时显示焦点环:
排版
使用主题排版变体,而不是自定义字体属性。
性能优化
不要在渲染中创建样式组件
对派生属性进行记忆化
命名规范
组件名称
帕斯卡命名法 用于组件
描述性名称
文件结构
下一步
最后更新于