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

SASS中如何在@keyframes动画块内定义屏幕媒体查询?

能否在SASS的@keyframes动画块内定义屏幕媒体查询?

不能直接在@keyframes的关键帧内部嵌套媒体查询——不管是原生CSS还是SASS都不支持这种写法,你提供的示例代码无法生效正是因为这个原因。

CSS规范明确规定,@keyframes的关键帧内部只能包含属性-值对,不允许嵌套@media这类规则;SASS作为预处理器,最终会编译成标准CSS,因此这种嵌套写法要么被编译工具忽略,要么直接报错。

如果你想实现不同屏幕尺寸下动画关键帧的差异化效果,可以参考以下两种实现方式:

方式一:媒体查询包裹@keyframes

直接针对不同视口尺寸定义独立的动画规则,示例代码如下:

// 基础屏幕尺寸下的动画
@keyframes anim {
  0% {
    background: #512da8;
  }
  50% {
    background: #512da8;
    top: 26px;
  }
  100% {
    background: #311b92;
    width: 100%;
    border-radius: 0px;
    top: 26px;
  }
}

// 视口宽度≤1000px时的动画变体
@media(max-width: 1000px) {
  @keyframes anim {
    0% {
      background: #512da8;
    }
    50% {
      background: #512da8;
      top: 26px;
    }
    100% {
      background: #311b92;
      width: 100%;
      height: 250px;
      border-radius: 0px;
      top: 26px;
    }
  }
}

方式二:用SASS混合宏减少代码重复

通过混合宏封装重复的关键帧逻辑,仅传入差异化参数,示例代码如下:

// 封装动画关键帧的混合宏
@mixin anim-keyframes($height: auto) {
  0% {
    background: #512da8;
  }
  50% {
    background: #512da8;
    top: 26px;
  }
  100% {
    background: #311b92;
    width: 100%;
    height: $height;
    border-radius: 0px;
    top: 26px;
  }
}

// 基础动画
@keyframes anim {
  @include anim-keyframes();
}

// 小屏幕下的动画变体
@media(max-width: 1000px) {
  @keyframes anim {
    @include anim-keyframes(250px);
  }
}

以上两种方式都能实现你想要的“不同屏幕下动画关键帧有差异”的效果,且符合CSS和SASS的语法规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:15:39