变量类型
需要在 StyleX Babel 配置中启用 unstable_moduleResolution
选项以启用主题 API。
声明变量类型是一种高级用例。对于大多数用例来说,这不是必需的。
默认情况下,变量值是字符串。对于大多数用例来说,这是正确的选择。但是,现代浏览器支持为 CSS 变量定义类型。可以使用指定变量
这样做可以启用一些在没有 CSS 的情况下不可能实现的有趣的用例。一些示例包括
- 通过动画化角度或颜色变量来动画化渐变
- 捕获元素上
1em
的值并在后代元素上使用它 - 将浮点数转换为整数
API
要在 StyleX 中为变量分配类型,可以使用各种函数,例如 stylex.types.color
或 stylex.types.length
。
参考 API 文档 以获取可用函数的完整列表。
用法
要为变量分配类型,可以使用相应的类型函数包装变量的值。
例如,考虑以下变量集
import * as stylex from '@stylexjs/stylex';
export const tokens = stylex.defineVars({
primaryText: 'black',
secondaryText: '#333',
borderRadius: '4px',
angle: '0deg',
int: '2',
});
目前,所有值都可以是任意字符串。要为变量分配类型,可以使用相应的类型函数包装它们
import * as stylex from '@stylexjs/stylex';
export const tokens = stylex.defineVars({
primaryText: stylex.types.color('black'),
secondaryText: stylex.types.color('#333'),
borderRadius: stylex.types.length('4px'),
angle: stylex.types.angle('0deg'),
int: stylex.types.integer(2),
});
条件值
即使在值中使用 at 规则,用法也保持不变。以下是完全有效的
import * as stylex from '@stylexjs/stylex';
export const colors = stylex.defineVars({
primaryText: stylex.types.color({default: 'black', [DARK]: 'white'}),
});
源代码中的类型安全
stylex.types.*
函数的主要用途是通过在生成的 CSS 中声明变量类型来启用功能。但是,StyleX API 还可以增强您自己代码库中的类型安全。
当在 stylex.defineVars
中使用特定类型声明变量时,静态类型将强制在 stylex.createTheme
调用中对变量进行主题化时使用相同的类型函数。
import * as stylex from '@stylexjs/stylex';
import {tokens} from './tokens.stylex.js';
export const highContrast = stylex.createTheme(tokens, {
primaryText: stylex.types.color('black'),
secondaryText: stylex.types.color('#222'),
borderRadius: stylex.types.length('8px'),
angle: stylex.types.angle('0deg'),
int: stylex.types.integer(4),
});
由于变量的类型已在 stylex.defineVars
调用中声明,因此 stylex.createTheme
中的用法类型函数在功能上是无操作的,但静态类型需要它来确保类型安全。
示例用例
模拟 round()
现代浏览器开始支持 CSS 中的 round()
函数。但是,可以使用具有 integer
类型的变量来模拟此功能
const styles = stylex.create({
gradient: {
// Math.floor
[tokens.int]: `calc(16 / 9)`
// Math.round
[tokens.int]: `calc((16 / 9) + 0.5)`
},
})
由于 tokens.int
使用 integer
类型声明,因此在分配值时,任何小数值都会被丢弃,并且该值会被转换为整数类型。
动画化渐变
通常无法动画化渐变。但是,通过使用类型化的 angle
变量,可以通过动画化其中使用的角度来动画化渐变。
无需动画化普通 CSS 属性,可以使用 stylex.keyframes
动画化 angle
变量
import * as stylex from '@stylexjs/stylex';
import {tokens} from './tokens.stylex';
const rotate = stylex.keyframes({
from: { [tokens.angle]: '0deg' },
to: { [tokens.angle]: '360deg' },
});
const styles = stylex.create({
gradient: {
backgroundImage: `conic-gradient(from ${tokens.angle}, ...colors)`,
animationName: rotate,
animationDuration: '10s',
animationTimingFunction: 'linear',
animationIterationCount: 'infinite',
},
})
这可用于创建旋转的圆锥形渐变