You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用vanilla-extract/css设置断点与媒体查询报错问题

解决vanilla-extract/css中媒体查询使用断点变量报错的问题

你遇到的问题是因为CSS自定义属性(变量)不能直接用于媒体查询的条件中,浏览器在解析媒体查询时会先于CSS变量的求值,所以直接写@media var(--breakpoints-large)会被判定为无效语法。

错误原因

你用createGlobalTheme定义的断点会被编译成CSS变量(比如--breakpoints-large__gr35lg1),但媒体查询的min-width这类条件不支持引用变量,浏览器无法在媒体查询阶段解析变量值,因此抛出Invalid media query错误。

正确实现方式

方式一:使用vanilla-extract官方推荐的createMedia

这是最规范的做法,直接用createMedia定义断点集合,自动生成可复用的媒体查询规则:

// breakpoints.css.ts
import { createMedia } from '@vanilla-extract/css';

// 定义断点对应的媒体查询规则
export const media = createMedia({
  medium: 'screen and (min-width: 40em)',
  large: 'screen and (min-width: 64.06em)'
});

在组件样式中直接引用:

// test.css.ts
import { style } from '@vanilla-extract/css';
import { media } from './breakpoints.css.ts';

export const testStyle = style({
  padding: '1rem',
  // 大屏下的样式
  '@media': {
    [media.large]: {
      padding: '2rem'
    }
  }
});

方式二:保留createGlobalTheme但直接使用断点值

如果一定要用全局主题变量的方式,需要同时导出断点的原始值,在媒体查询中直接使用值而非变量:

// globalTheme.css.ts
import { createGlobalTheme } from '@vanilla-extract/css';

// 先定义断点常量
export const breakpointValues = {
  medium: '40em',
  large: '64.06em'
};

// 生成全局主题变量(用于其他非媒体查询场景)
export const globalTheme = createGlobalTheme(':root', {
  breakpoints: breakpointValues
});

在样式文件中直接拼接媒体查询:

// test.css.ts
import { style } from '@vanilla-extract/css';
import { breakpointValues } from './globalTheme.css.ts';

export const testStyle = style({
  padding: '1rem',
  '@media': {
    [`screen and (min-width: ${breakpointValues.large})`]: {
      padding: '2rem'
    }
  }
});

总结

不要尝试在媒体查询中直接引用CSS变量,这是CSS本身的限制,并非vanilla-extract的问题。优先使用createMedia来管理断点,或者直接使用断点的原始值构建媒体查询。

内容的提问来源于stack exchange,提问作者amu03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:16:10