文档Stylingsx 属性

sx 属性

sx 属性是一种用于定义可访问主题的自定义样式的快捷方式。

sx 属性提供一个 CSS 超集,除包含所有 CSS 属性和选择器之外,还有 Nex UI 内置的自定义属性和选择器, 而 CSS 属性值可以直接使用预定义的主题。如果您不满足于已有的 CSS 自定义属性和选择器以及主题,Nex UI 还提供了扩展能力,在 定制主题 了解更多信息。

使用 sx 属性

下面的例子演示了如何使用 sx 属性。注意,并不是所有的值都是有效的 CSS 属性,这是因为 sx 的键映射到了特定的 Token 类型。接下来将更详细地介绍这个概念。

Nex UI

nexui.dev


Make beautiful websites with ease and efficiency.

Visit source code on GitHub.

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

colorbackgroundColor 等属性可以接收 tokens.colorssemanticTokens.colors 中的路径:

<Box sx={{ color: 'blue.400' }} />

backgroundColor 属性还可以通过别名 bg 访问:

<Box sx={{ bg: 'blue.400' }} />

Colors 了解更多的信息。

Borders

borderWidth 属性可以接收 tokens.borderssemanticTokens.borders 中的路径:

<Box sx={{ border: 'sm', borderColor: 'blue.500' }} />

Borders 了解更多的信息。

Sizes

widthheight 等属性可以接收 tokens.sizessemanticTokens.sizes 中的路径:

<Box sx={{ width: '2', height: '1' }} />

widthheight 还可以分别通过别名 wh 访问:

<Box sx={{ w: '2', h: '1' }} />

Sizes 了解更多的信息。

Spaces

paddingmargin 等属性可以接收 tokens.spacessemanticTokens.spaces 中的路径:

<Box sx={{ padding: '1', margin: '1' }} />

paddingmargin 还可以分别通过别名 pm 访问:

<Box sx={{ p: '1', m: '1' }} />

Spaces 了解更多的信息。

Radii

borderRadius 属性可以接收 tokens.radiisemanticTokens.radii 中的路径:

<Box sx={{ borderRadius: 'sm' }} />

Radii 了解更多的信息。

Typography

fontWeight 属性可以接收 tokens.fontWeightssemanticTokens.fontWeights 中的路径:

<Box sx={{ fontWeight: 'medium' }} />

fontSize 属性可以接收 tokens.fontSizessemanticTokens.fontSizes 中的路径:

<Box sx={{ fontSize: 'lg' }} />

fontFamily 属性可以接收 tokens.fontFamiliessemanticTokens.fontFamilies 中的路径:

<Box sx={{ fontFamily: 'heading' }} />

lineHeight 属性可以接收 tokens.lineHeightssemanticTokens.lineHeights 中的路径:

<Box sx={{ lineHeight: 'base' }} />

Typography 了解更多的信息。

BorderWidths

borderWidth 属性可以接收 tokens.borderWidthssemanticTokens.borderWidths 中的路径:

<Box sx={{ borderWidth: 'sm' }} />

BorderWidths 了解更多的信息。

Shadows

box-shadow 属性可以接收 tokens.shadowssemanticTokens.shadows 中的路径:

<Box sx={{ boxShadow: 'sm' }} />

Shadows 了解更多的信息。

Transitions

transition 属性可以接收 tokens.transitionssemanticTokens.transitions 中的路径:

<Box sx={{ transition: 'all' }} />

Transitions 了解更多的信息。

Z-Indexes

zIndex 属性可以接收 tokens.zIndexessemanticTokens.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>

然而,在诸如 borderpadding 这类特殊的简写 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.smcolors.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 了解更多信息。

最后更新时间