#javascript #css #reactjs #material-ui
Вопрос:
TL;DR: Прокрутите до EDIT2
MUIv4 создал для меня следующие классы из моей вложенной тематики:
lt;label class="MuiFormLabel-root-121 MuiInputLabel-root-113 MuiInputLabel-formControl-115 MuiInputLabel-animated-118 MuiInputLabel-shrink-117 MuiInputLabel-marginDense-116 MuiInputLabel-outlined-120 Mui-disabled Mui-disabled MuiFormLabel-filled-123" data-shrink="true"gt;Emaillt;/labelgt;
Теперь я заинтересован в изменении следующего класса:
.MuiInputLabel-outlined-120.MuiInputLabel-shrink-117 { transform: translate(14px, -6px) scale(0.75); }
поэтому у меня есть тематический файл [дубликаты просто имеют цель показать, что я пробовал]:
createTheme({ overrides: { MuiInputLabel: { outlined: { color: red[500], backgroundColor:purple[600], MuiInputLabel: { shrink: { transform: "translate(0px, -15px) scale(0.75) !important", } }, "amp;.MuiInputLabel-shrink": { transform: "translate(0px, -15px) scale(0.75) !important", }, "amp;[class*='MuiInputLabel-shrink']":{ transform: "translate(0px, -15px) scale(0.75) !important", }, } }, }, })
Но ни одно из правил не работает? Что я делаю не так? Как я могу увидеть сгенерированные имена классов из createTheme?
РЕДАКТИРОВАТЬ — Я смог добиться желаемого эффекта с помощью CSS-оболочки:
const MUIWrapper = styled.div` [class*="MuiInputLabel-outlined"][class*="MuiInputLabel-shrink"] { transform: translate(0px, -15px) scale(0.75); } } `
Но на самом деле я не хотел реализовывать это таким образом
РЕДАКТИРОВАТЬ 2: Как указано, @hotcakedev
это возможно с:
createTheme({ overrides: { ... MuiFormLabel: { outlined: { '.MuiInputLabel-shrink*': { // or 'amp;.MuiInputLabel-shrink*' transform: translate(14px, -6px) scale(0.75); } }, } }, })
но я все еще удивляюсь, почему нет возможности написать это так:
createTheme({ overrides: { ... MuiFormLabel: { outlined: { MuiInputLabel: { shrink: { transform: translate(14px, -6px) scale(0.75); } } }, } }, })
Это было бы то, что я хотел бы написать, так как это понятно и легко читается!
Комментарии:
1. Какую версию MUI вы используете, 4 или 5?
2. @hotcakedev спасибо за подсказку. Я добавил информацию о версии, а также ПРАВКУ
Ответ №1:
Не уверен, почему вы создали свою тему таким образом (дублировали MuiInputLabel
).
Пожалуйста, убедитесь, что структура темы не содержит дублирующихся переопределяющих компонентов.
createTheme({ overrides: { ... MuiFormLabel: { outlined: { ... }, shrink: { ... } } }, })
Если вы хотите стилизовать один и тот же компонент внутри определенного компонента, вы можете использовать amp;
и другие css-приемы во вложенной структуре темы.
createTheme({ overrides: { ... MuiFormLabel: { outlined: { '.MuiInputLabel-shrink*': { // or 'amp;.MuiInputLabel-shrink*' transform: translate(14px, -6px) scale(0.75); } }, } }, })
В противном случае вы могли бы создать свои собственные глобальные стили.
// GlobalStyles.js import { createStyles, makeStyles } from '@material-ui/core'; const useStyles = makeStyles(() =gt; createStyles({ '@global': { '*': { boxSizing: 'border-box', margin: 0, padding: 0, }, body: { height: '100%', width: '100%' }, '#root': { height: '100%', width: '100%' } ... '.some-class': { '.MuiInputLabel-shrink*': { // or 'amp;.MuiInputLabel-shrink*' transform: translate(14px, -6px) scale(0.75); } } } })); const GlobalStyles = () =gt; { useStyles(); return null; }; export default GlobalStyles; // App.js ... import GlobalStyles from './GlobalStyles.js'; const App = () =gt; { return ( ... lt;Routergt; lt;GlobalStyles /gt; ... lt;/Routergt; ... ) };
Комментарии:
1. Я поместил туда дублированные переопределения, чтобы показать все правила, которые я пробовал! Нет ли версии JSS вместо:
'.MuiInputLabel-shrink*'
или'amp;.MuiInputLabel-shrink*'
. Я хотел бы придерживатьсяlt;MuiElementgt;: {lt;subgt;: {}}
обозначения-также для комбинаций классов.2. @user2853437 Пожалуйста, проверьте мои обновления.
3. Спасибо вам за ваши усилия! Я снова отредактировал свой ответ и, поскольку я думаю, что нет лучшего способа, я приму ваш ответ. Спасибо!