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

如何修改MUI 5中TextField select组件的下拉菜单背景色?

问题示例截图

问题说明

需要修改MUI下拉选择菜单的背景色,将默认的白色背景调整为黑色。
初始实现代码:

const styles={ 
  textField:{
    '& .MuiPopover-paper':{
      backgroundColor: 'black'
    }
  }
}

...

<TextField select id='version' label='Version' variant='outlined' sx={styles.textField}>
  <MenuItem value={10}>1</MenuItem>
  <MenuItem value={20}>2</MenuItem>
  <MenuItem value={30}>3</MenuItem>
</TextField>

多次调整.MuiPopover-paper相关的样式写法,都没有生效。

失效原因

MUI Select的下拉弹出层(Popover)默认通过React Portal挂载到页面根节点(通常是body),并不是TextField组件的子元素,因此写在TextField sx属性内的后代选择器无法匹配到弹出层的DOM节点,样式不会应用。

解决方法

方法1:通过MenuProps直接给弹出层传样式(优先推荐)

TextField的select模式原生支持MenuProps属性,可直接透传配置给内部的下拉弹出菜单,不需要纠结DOM层级问题,直接指定Paper的样式即可:

<TextField 
  select 
  id="version" 
  label="Version" 
  variant="outlined"
  MenuProps={{
    PaperProps: {
      sx: {
        backgroundColor: "#000",
        // 黑底需要搭配浅色文字,避免MenuItem内容看不清
        "& .MuiMenuItem-root": {
          color: "#fff"
        }
      }
    }
  }}
>
  <MenuItem value={10}>1</MenuItem>
  <MenuItem value={20}>2</MenuItem>
  <MenuItem value={30}>3</MenuItem>
</TextField>

方法2:禁用Portal挂载,让弹出层渲染在TextField内部

如果需要统一在TextField的sx中管理所有样式,可以给菜单设置disablePortal: true,关闭Portal挂载逻辑,此时弹出层会成为TextField的子节点,原有的后代选择器就可以生效:

const styles={ 
  textField:{
    "& .MuiPopover-paper":{
      backgroundColor: "#000",
      color: "#fff"
    }
  }
}

...

<TextField 
  select 
  id="version" 
  label="Version" 
  variant="outlined" 
  sx={styles.textField}
  MenuProps={{
    disablePortal: true
  }}
>
  <MenuItem value={10}>1</MenuItem>
  <MenuItem value={20}>2</MenuItem>
  <MenuItem value={30}>3</MenuItem>
</TextField>

注意:该方案下如果TextField的父级元素设置了overflow: hidden,下拉弹出层可能会被截断,非特殊场景不推荐使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:17