重点突出的检查类似乎无法正常工作。我需要始终使用!important或使用material-ui提供的jss样式。例如:
https://codesandbox.io/s/css-modules-nvy8s?file=/src/CssModulesButton.js
CssModulesButton.module.css
.checkboxtest {
color: blue;
}
.checkboxtestworking {
color: blue !important;
}
CssModulesButton.js
import React from "react";
// webpack, parcel or else will inject the CSS into the page
import styles from "./CssModulesButton.module.css";
import Checkbox from "@material-ui/core/Checkbox/Checkbox";
export default function CssModulesButton() {
return (
<div>
<Checkbox classes={{ checked: styles.checkboxtest }}>testasd</Checkbox>
<Checkbox classes={{ checked: styles.checkboxtestworking }}>
testasd
</Checkbox>
</div>
);
}
index.js
import React from "react";
import { render } from "react-dom";
import { StylesProvider } from "@material-ui/core/styles";
import CssModulesButton from "./CssModulesButton";
import CssBaseline from "@material-ui/core/CssBaseline";
const App = () => <CssModulesButton />;
render(<App />, document.querySelector("#root"));
除了使用!important之外,我无法以其他任何方式覆盖Checkbox颜色。使用classes = {{focused:styles.focused}}和其他许多类时,问题仍然存在。
有没有一种方法可以用没有!important的类简单地覆盖组件?有时甚至!important都不起作用
使用injectFirst的inb4 im
您injectFirst
在问题中提到了您,尽管您的沙盒示例未使用它。您应该使用它,因为这将确保将CSS模块中的CSS插入到<head>
元素中的Material-UI CSS之后。当特异性相同时,以后出现的样式将取代以前的样式。
复选框颜色的默认样式如下:
colorSecondary: {
'&$checked': {
color: theme.palette.secondary.main,
'&:hover': {
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity),
// Reset on touch devices, it doesn't add specificity
'@media (hover: none)': {
backgroundColor: 'transparent',
},
},
},
'&$disabled': {
color: theme.palette.action.disabled,
},
},
以下是JSS生成的相应CSS:
.MuiCheckbox-colorSecondary.Mui-checked {
color: #f50057;
}
.MuiCheckbox-colorSecondary.Mui-disabled {
color: rgba(0, 0, 0, 0.26);
}
.MuiCheckbox-colorSecondary.Mui-checked:hover {
background-color: rgba(245, 0, 87, 0.04);
}
@media (hover: none) {
.MuiCheckbox-colorSecondary.Mui-checked:hover {
background-color: transparent;
}
}
需要注意的重要方面是checked
样式是通过两个类完成的。为了覆盖这些样式,您需要相同或更高的特异性。
下面是一个覆盖checked
复选框颜色的完整示例:
index.js(这里很重要<StylesProvider injectFirst>
)
import React from "react";
import { render } from "react-dom";
import { StylesProvider } from "@material-ui/core/styles";
import CssModulesButton from "./CssModulesButton";
const App = () => (
<StylesProvider injectFirst>
<CssModulesButton />
</StylesProvider>
);
render(<App />, document.querySelector("#root"));
CssModulesButton.module.css
checkboxtest
-CSS模块类和Mui-checked
(Material-UI为检查状态添加的全局类).checkboxtest:global(.Mui-checked) {
color: blue;
}
CssModulesButton.js
import React from "react";
import styles from "./CssModulesButton.module.css";
import Checkbox from "@material-ui/core/Checkbox";
export default function CssModulesButton() {
return (
<div>
<Checkbox className={styles.checkboxtest} />
</div>
);
}
来自评论的后续问题:
您能解释一下为什么我不能使用课程吗?是否应该
classes={{checked:styles.AnyClass}}
成功覆盖样式?我知道为什么不这样做,但是上课的目的是什么?
您可以使用classes
道具,但在这种情况下没有任何令人信服的理由。只要样式的声明是相同的(使用两个CSS类),那么下面的内容也将起作用,以便您具有适当的特异性:
<Checkbox classes={{ checked: styles.checkboxtest }} />
至于问题的第二部分(“类的目的是什么?”),使用该道具有两个主要原因classes
。该classes
道具的一些CSS类将应用于组件内的不同元素,而有些仅在组件处于特定状态或组件上已使用某些道具时才应用。在这种情况下,您尝试将这些样式定位为组件的特定状态。在Material-UI的v3中,您将需要使用classes
prop提供仅适用于该checked
状态的类名,但是在v4中,Material-UI切换为对这些状态使用全局类名(更多详细信息,请参见:https ://material-ui.com/customization/components/#pseudo-classes),例如Mui-checked
。这使得通过单个生成的类更容易将这些状态作为目标(此更改的一个主要推动因素是,使使用可以更轻松地自定义Material-UI组件styled-components
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句