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

MUI5的sx属性是否支持动态样式?MUI4 makeStyles迁移方案咨询

MUI sx动态样式问题解答

MUI的sx属性本身完全支持动态样式,你当前的写法不可行存在两个核心问题:

  1. JS对象语法错误:不能直接在对象字面量中嵌套条件返回的对象,需要配合展开运算符实现条件样式注入
  2. 动画语法不兼容:@keyframes定义不能放在实例级的条件分支中,且你使用的$fadeIn是MUI4 JSS/makeStyles的专属语法,sx中无需添加$前缀引用动画

可行替代方案

方案1:直接在sx中实现条件动画(最简单,适合快速迁移)

不需要动态插入@keyframes定义,提前将动画定义在sx顶层,仅对animation属性做条件判断即可:

<Box
  key={index}
  sx={{
    height: "100%",
    width: "100%",
    "@keyframes fadeIn": {
      from: { opacity: 0 },
      to: { opacity: 1 }
    },
    animation: index === imgIndex ? "fadeIn 2.5s ease-in-out" : "none"
  }}
>
  {child}
</Box>

方案2:使用styled API封装组件(更符合MUI5规范,适合复用场景)

MUI5官方推荐使用styledAPI替代已废弃的makeStyles,你可以将轮播项封装为独立样式组件,通过prop控制激活状态:

import { styled } from '@mui/material/styles';
import Box from '@mui/material/Box';

// 定义带动态状态的轮播项组件,shouldForwardProp避免自定义prop透传到DOM
const SwiperItem = styled(Box, {
  shouldForwardProp: (prop) => prop !== 'isActive'
})(({ isActive }) => ({
  height: "100%",
  width: "100%",
  "@keyframes fadeIn": {
    from: { opacity: 0 },
    to: { opacity: 1 }
  },
  animation: isActive ? "fadeIn 2.5s ease-in-out" : "none"
}));

// 组件使用示例
<SwiperItem key={index} isActive={index === imgIndex}>
  {child}
</SwiperItem>

方案3:sx回调写法(适合需要依赖主题的动态场景)

如果你的动态样式需要结合MUI主题变量,可以使用sx支持的回调函数写法:

<Box
  key={index}
  sx={(theme) => ({
    height: "100%",
    width: "100%",
    "@keyframes fadeIn": {
      from: { opacity: 0 },
      to: { opacity: 1 }
    },
    // 可结合主题变量做动态判断,比如根据断点调整动画时长
    ...(index === imgIndex && {
      animation: `fadeIn ${theme.transitions.duration.leavingScreen}ms ease-in-out`
    })
  })}
>
  {child}
</Box>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:06:02