sx 属性
sx
属性是一种用于定义可访问主题的自定义样式的快捷方式。
sx
属性提供一个 CSS 超集,除包含所有 CSS 属性和选择器之外,还有 Nex UI 内置的自定义属性和选择器,
而 CSS 属性值可以直接使用预定义的主题。如果您不满足于已有的 CSS 自定义属性和选择器以及主题,Nex UI 还提供了扩展能力,在 定制主题 了解更多信息。
使用 sx
属性
下面的例子演示了如何使用 sx
属性。注意,并不是所有的值都是有效的 CSS 属性,这是因为 sx
的键映射到了特定的 Token 类型。接下来将更详细地介绍这个概念。
import { Box } from '@nex-ui/react'
export default function Example() {
return (
<Box
sx={{
'max-width': 390,
borderRadius: 'lg',
boxShadow: 'lg',
}}
>
<Box sx={{ display: 'flex', gap: '3', alignItems: 'center', p: '3' }}>
<Box as='img' src={logo.src} width={50} height={50} />
<Box>
<Box>Nex UI</Box>
<Box
sx={{
fs: 'md',
color: 'rgb(113, 113, 122)',
}}
>
nexui.dev
</Box>
</Box>
</Box>
<Box as='hr' sx={{ m: 0, border: 'none', bg: 'gray.200', height: 1 }} />
<Box sx={{ p: '3' }}>
Make beautiful websites with ease and efficiency.
</Box>
<Box as='hr' sx={{ m: 0, border: 'none', bg: 'gray.200', height: 1 }} />
<Box
sx={{
p: '3',
display: 'inline-block',
textDecoration: 'none',
color: 'blue.600',
}}
as='a'
href='github.com'
>
Visit source code on GitHub.
</Box>
</Box>
)
}
具备主题感知能力的属性
通过 Scales 可将 Tokens、SemanticTokens 与 CSS 属性关联,使得 CSS 属性能够映射到相应的 Token 类型,进而允许 CSS 属性能够使用相应类型的 Tokens 作为值。
import { Box, defineTheme, NexUIProvider } from '@nex-ui/react'
const theme = defineTheme({
tokens: {
colors: {
primary: 'blue',
},
sizes: {
1: '10px',
},
},
scales: {
color: 'colors',
width: 'sizes',
height: 'sizes',
},
})
export default function Example() {
return (
<NexUIProvider theme={theme}>
<Box
sx={{
// 只有在 scales 中定义 color: 'colors', color 才可以使用 tokens.colors.primary
color: 'primary',
// 此时 width 属性值会被编译为 tokens.sizes.1,
width: '1',
// 当值仅为 string 时才可能映射到 tokens, 此时 width 为 1px
height: 1,
}}
/>
</NexUIProvider>
)
}
注意,CSS 属性值仅为 string
时才可能映射到 tokens。
上述示例中, width
实际为 10px
,而 height
实际为 1px
。
在 Scales 了解更多的信息。
Colors
color
和 backgroundColor
等属性可以接收 tokens.colors
和 semanticTokens.colors
中的路径:
<Box sx={{ color: 'blue.400' }} />
backgroundColor
属性还可以通过别名 bg
访问:
<Box sx={{ bg: 'blue.400' }} />
在 Colors 了解更多的信息。
Borders
borderWidth
属性可以接收 tokens.borders
和 semanticTokens.borders
中的路径:
<Box sx={{ border: 'sm', borderColor: 'blue.500' }} />
在 Borders 了解更多的信息。
Sizes
width
和 height
等属性可以接收 tokens.sizes
和 semanticTokens.sizes
中的路径:
<Box sx={{ width: '2', height: '1' }} />
width
和 height
还可以分别通过别名 w
和 h
访问:
<Box sx={{ w: '2', h: '1' }} />
在 Sizes 了解更多的信息。
Spaces
padding
和 margin
等属性可以接收 tokens.spaces
和 semanticTokens.spaces
中的路径:
<Box sx={{ padding: '1', margin: '1' }} />
padding
和 margin
还可以分别通过别名 p
和 m
访问:
<Box sx={{ p: '1', m: '1' }} />
在 Spaces 了解更多的信息。
Radii
borderRadius
属性可以接收 tokens.radii
和 semanticTokens.radii
中的路径:
<Box sx={{ borderRadius: 'sm' }} />
在 Radii 了解更多的信息。
Typography
fontWeight
属性可以接收 tokens.fontWeights
和 semanticTokens.fontWeights
中的路径:
<Box sx={{ fontWeight: 'medium' }} />
fontSize
属性可以接收 tokens.fontSizes
和 semanticTokens.fontSizes
中的路径:
<Box sx={{ fontSize: 'lg' }} />
fontFamily
属性可以接收 tokens.fontFamilies
和 semanticTokens.fontFamilies
中的路径:
<Box sx={{ fontFamily: 'heading' }} />
lineHeight
属性可以接收 tokens.lineHeights
和 semanticTokens.lineHeights
中的路径:
<Box sx={{ lineHeight: 'base' }} />
在 Typography 了解更多的信息。
BorderWidths
borderWidth
属性可以接收 tokens.borderWidths
和 semanticTokens.borderWidths
中的路径:
<Box sx={{ borderWidth: 'sm' }} />
在 BorderWidths 了解更多的信息。
Shadows
box-shadow
属性可以接收 tokens.shadows
和 semanticTokens.shadows
中的路径:
<Box sx={{ boxShadow: 'sm' }} />
在 Shadows 了解更多的信息。
Transitions
transition
属性可以接收 tokens.transitions
和 semanticTokens.transitions
中的路径:
<Box sx={{ transition: 'all' }} />
在 Transitions 了解更多的信息。
Z-Indexes
zIndex
属性可以接收 tokens.zIndexes
和 semanticTokens.zIndexes
中的路径:
<Box sx={{ zIndex: 'min' }} />
在 Z-Indexes 了解更多的信息。
响应式值
与 sx
属性相关的所有 CSS 属性也都支持针对特定断点的响应式值,sx
属性可以简化定义和实现响应式断点的过程。
在 响应式设计 了解更多信息。
深色模式
与 sx
属性相关的所有 CSS 属性也都支持深色模式。sx
属性搭配 Nex UI 提供的 Color Mode 系统,只需使用 _dark
即可为组件设置深色模式的样式,_light
为组件设置浅色模式的样式。_DEFAULT
为组件的默认样式。
下面的例子演示了如何对不同模式下的组件设置相应的样式:
Color Mode
<Box
sx={{
bg: {
_dark: 'white',
_light: '#27272a',
_DEFAULT: '#27272a',
},
color: {
_dark: '#27272a',
_light: 'white',
_DEFAULT: 'white',
},
width: 300,
textAlign: 'center',
}}
>
深色模式
</Box>
在 深色模式 了解更多信息。
colorPalette
属性
colorPalette
属性可以创建一个颜色占位符,以便更好地进行主题设置和自定义。
使用 colorPalette
的基本要求是,使用的颜色必须有一致的命名规范。默认情况下,NexUI 会为每种颜色提供 50 到 900 的颜色值。这会让你更容易创建和使用 colorPalette
。
假设我们需要从头开始创建一个可应用主题样式的按钮。
Hello World
<Box
sx={{
colorPalette: 'blue',
bg: {
_DEFAULT: 'colorPalette.500',
_hover: 'colorPalette.400',
_active: 'colorPalette.600',
},
p: '5px 15px',
color: '#fff',
borderRadius: 'md',
textAlign: 'center',
}}
>
Hello World
</Box>
Token 引用语法
通常情况下,只有在 scales
中定义 CSS 属性与 Token 类型之间的映射关系才可以在定义 CSS
时引用相应类型的 Tokens。Nex UI 默认设置 Scales
:
{
color: 'colors',
backgroundColor: 'colors',
...
}
因此在 sx
属性中可使用:
<Box
sx={{
color: 'gray.100',
bg: 'blue.500',
}}
>
Box
</Box>
然而,在诸如 border
、padding
这类特殊的简写 CSS 属性中,无法通过上述方式引用 Tokens。为此 Nex UI 提供了 Token 引用语法,
使得您可以在简写属性中引用 Tokens:
<Box
sx={{
border: '{borderWidths.sm} solid {colors.blue.500}',
}}
>
Box
</Box>
不仅如此,您还可以在 Token 引用语法使用 colorPalette
:
<Box
sx={{
border: '{borderWidths.sm} solid {colors.colorPalette.500}',
colorPalette: 'blue',
}}
>
Box
</Box>
此时,border
将应用borderWidths.sm
和 colors.colorPalette.500
对应的值 。
数组类型
当您想部分覆盖前一个索引中的某些样式时,数组类型会很有用。
<Box
sx={[
{
'&:hover': {
color: 'red',
backgroundColor: 'white',
},
},
foo && {
'&:hover': { backgroundColor: 'grey' },
},
bar && {
'&:hover': { backgroundColor: 'yellow' },
},
]}
/>
当你悬浮到元素时,color:red; backgroundColor: white
将被应用。
如果 foo: true
,那么 color: red; backgroundColor: grey;
将在悬浮状态应用。
如果 bar: true
,那么 color: red; backgroundColor: yellow;
将在悬浮状态应用,无需关心 foo
的值,因为在数组中更高的索引具有更高的优先级。
Aliases
您可以通过 Aliases 定义 CSS 属性的别名,从而简化 CSS 属性名并支持组合 CSS 属性。
<Box sx={{ bg: 'blue.400', px: '2' }} />
Selector
当您想组合 CSS 选择器,例如 '&:not(:disabled):not([data-disabled=true]):hover'
, 您可以通过 Selectors 自定义更多的选择器,并解锁额外的使用方式。
在 Selectors 了解更多信息。