繁体   English   中英

如何创建具有透明背景颜色的 MUI 对话框?

[英]How to create MUI Dialog with transparent background color?

我正在尝试使用 MUI 创建加载状态指示器。 但我希望对话框的背景颜色为none ,并且还想调整高度。 但是我无法通过他们提供的样式选项来做到这一点。 任何解决方案?

现在看起来像这样..

1个

代码如下所示:

<Dialog
  open={true}
  style={{width: '200px', marginLeft: '40%', backgroundColor: 'transparent'}}
  title= 'Loading'
  titleStyle={{paddingTop: '0px', paddingLeft: '45px', fontSize: '15px', lineHeight: '40px'}}
>
    <RefreshIndicator
      style= {{display: 'inline-block'}}
      size={50}
      left={50}
      top={30}
      loadingColor="#FF9800"
      status="loading"    
    />
</Dialog>

在材料 v4 或最新版本中。 您可以使用BackdropProps ,请参阅在线演示

对于最新版本( "@material-ui/core": "^1.2.3" ),以下是它的完成方式:

<Dialog
  {...otherProps}
  PaperProps={{
    style: {
      backgroundColor: 'transparent',
      boxShadow: 'none',
    },
  }}
>
  {/* ... your content ... */}
</Dialog>

记下新的PaperProps道具。 它不在文档中,但是如果你查看源代码,他们使用PaperProps作为你可以传递的道具之一 - 因为这不在文档中,但是这可能会随着未来的版本而改变,所以在这里要小心。

您可以在Dialog上设置overlayStyle prop以更改背景颜色,如下所示:

 <Dialog
  open={true}
  style={{width: '200px', marginLeft: '40%', backgroundColor: 'transparent'}}
  overlayStyle={{backgroundColor: 'transparent'}}
  title= 'Loading'
  titleStyle={{paddingTop: '0px', paddingLeft: '45px', fontSize: '15px', lineHeight: '40px'}}
  >

直接你可以使用带有css属性, zIndexopacity CircularProgress ,试试这个:

<CircularProgress size={2} style={Styles.mainLoader}/>

mainLoader: { 
    position: 'absolute',
    paddingTop: '15%',      
    width: '100%',
    height: '100%',
    zIndex: 1000,
    backgroundColor: '#000000',
    opacity: 0.5,
    textAlign: 'center',
}

它将以.5不透明度和指定背景覆盖整个屏幕。

您可以直接使用组件CircularProgress (而不是使用Dialog构建loding指示器: http//www.material-ui.com/#/components/circular-progress

您可以将加载指示器放在位于页面中间的div中:

JSX:

<div className="my-spinner">
    <CircularProgress size={59.5} />
</div>

CSS:

.my-spinner {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translateX(-50%) translateY(-
}

像这样使用bodyStyle道具:

<Dialog
  bodyStyle={{margin:0, padding:0}}
  open={true}
  style={{width: '200px', marginLeft: '40%', backgroundColor: 'transparent'}}
  title= 'Loading'
  titleStyle={{paddingTop: '0px', paddingLeft: '45px', fontSize: '15px', lineHeight: '40px'}}
>
    <RefreshIndicator
      style= {{display: 'inline-block'}}
      size={50}
      left={50}
      top={30}
      loadingColor="#FF9800"
      status="loading"    
    />
</Dialog>

您不必使用透明的Dialog ,MUI 会公开Dialog在幕后使用的Backdrop组件。 Backdrop让您可以将任何内容放在变暗的图层中,而无需处理物理容器:

<Backdrop
  sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }}
  open={open}
  onClick={handleClose}
>
  <Stack gap={1} justifyContent="center" alignItems="center">
    <CircularProgress color="inherit" />
    <Typography>Loading...</Typography>
  </Stack>
</Backdrop>

现场演示

代码沙盒演示

另一个可能的替代方案(取决于您想要实现的目标)是避免为Dialog容器使用Paper组件。 例如,如果您改用Box组件,用户将看不到它:

<Dialog
  className="MyDialog"
  open={!!openProp}
  onClose={handleDialogClose}
  maxWidth="xl"
  PaperComponent={Box}
>

请注意,默认情况下它仍将包含一个“不可见”的填充(如果您使用fullWidth ,甚至会覆盖大部分屏幕),这可能会让用户感到困惑,因为在这个不可见的范围内单击时对话框不会关闭零件。

<Dialog
  open={true}
  style={{width: '200px', marginLeft: '40%', backgroundColor: 'transparent'}}
  title= 'Loading'
  titleStyle={{paddingTop: '0px', paddingLeft: '45px', fontSize: '15px', lineHeight: '40px'}}
BackdropProps={{invisible: true}}
>
    <RefreshIndicator
      style= {{display: 'inline-block'}}
      size={50}
      left={50}
      top={30}
      loadingColor="#FF9800"
      status="loading"    
    />
</Dialog>
  • 项目清单

删除 backgroundColor: 'transparent' 并添加 BackdropProps={{invisible: true}}

如果您使用的是styled-components
我们也可以通过.MuiDialog-paper class来覆盖更多的CSS方式,如下:

import styled from "styled-components";
import { Dialog } from "@mui/material";

const StyledDialog = styled(Dialog)`
  & .MuiDialog-paper {
    background-color: transparent !important;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM