Как изменить цвет границы Material-UI ‹TextField /›

Кажется, я не могу понять, как изменить цвет контура выделенного варианта. Я просмотрел проблемы с GitHub, и люди, кажется, указывают на использование свойства «InputProps», но это, похоже, ничего не дает. Это поле Вот мой код в его текущем состоянии

import React from 'react';
import { withStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
import PropTypes from 'prop-types';

const styles = theme => ({
field: {
    marginLeft: theme.spacing.unit,
    marginRight: theme.spacing.unit,
    height: '30px !important'
},
});

class _Field extends React.Component {
      render() {
          const { classes, fieldProps } = this.props;
             return (
                <TextField
                {...fieldProps}
                label={this.props.label || "<Un-labeled>"}
                InputLabelProps={{ shrink: true }} // stop from animating.
                inputProps={{ className: classes.fieldInput }}
                className={classes.field}
                margin="dense"
               variant="outlined"
            />
        );
    }
}

_Field.propTypes = {
    label: PropTypes.string,
    fieldProps: PropTypes.object,
    classes: PropTypes.object.isRequired
}

export default withStyles(styles)(_Field);

person kinger6621    schedule 21.10.2018    source источник


Ответы (13)


Вы можете переопределить все имена классов, введенные Material-UI, благодаря свойству classes. Взгляните на раздел с переопределением с помощью классов и реализация компонента подробнее.

и наконец :

Документация API компонента Input React. Подробнее о свойствах и точках настройки CSS…

person amin khademian    schedule 21.10.2018
comment
Можете ли вы привести конкретный пример по делу в вопросе? Как изменить цвет границы? - person Bahax; 26.11.2018
comment
Не уверен, почему у него так много голосов против. Да, здесь не объясняется, как изменить цвет, но есть способы изменения стилей, включая цвета. Это также не ответ "копировать и вставлять", "только код" или "только ссылка". И это было принято ОП, но есть отрицательные голоса? Это подвергает OP не только изменению цвета. Благодаря этому посту люди будут лучше знакомы с системой в целом, избегая возможных повторяющихся вопросов относительно стиля. Другие ответы можно кормить с ложечки, если они хотят, но этот ответ по-прежнему очень полезен для сообщества. Вот почему люди уходят ТАК ... - person Dioxin; 13.02.2020
comment
@Dioxin этот ответ не представляет большой ценности, держу пари, что любой может легко найти эту информацию в документации. Однако я не согласен с ответами "против", особенно с такими, как эти, потому что это по-прежнему добавляет ценности, а "против" отпугивает плакат. Если люди думают, что есть другие ответы получше, им следует просто проголосовать за них. - person ehab; 10.02.2021
comment
У @ehab Jojo 32 голоса за, и все, что они сделали, это вставили код без объяснения причин. Тот факт, что OP не получил с ложечки пример кода, который он может скопировать и вставить, не означает, что значение не было предоставлено. ОП принял это. Я не сомневаюсь, что отрицательные голоса принадлежат людям, которые хотели получить ответ «скопировать и вставить». - person Dioxin; 10.02.2021
comment
@Dioxin Не все так или иначе. Между кодом копирования и вставки и rtfm есть огромная серая зона. Нюансы стилизации элементов формы MUI - отличный пример того, что сложно даже после прочтения документации. Конечно, любой хороший ответ (или вопрос) должен выделять соответствующие документы, но обсуждение конкретных особенностей того, что работает, а что нет, когда вы читали документы и проблемы GH и пытались применить их серьезно, но не добились успеха, чрезвычайно ценно. Документы не всегда идеальны, и OP - не единственный, кто пытался и потерпел неудачу. - person reustin; 18.02.2021

Взгляните на это, я сделал небольшую демонстрацию:

https://stackblitz.com/edit/material-ui-custom-outline-color

Он изменяет цвет границы по умолчанию и цвет метки текстового поля Material-UI, но сохраняет основной цвет при фокусировке.

Также взгляните на эту ссылку, она дала мне "идею":

https://github.com/mui-org/material-ui/issues/13347

Если вы хотите изменить цвет при фокусировке, посмотрите эти примеры из документации:

https://material-ui.com/demos/text-fields/#customized-inputs

person Peter Catalin    schedule 16.11.2018
comment
Ах, в некоторых случаях вам все равно понадобится! Important. Спасибо! - person benihana21; 27.06.2019
comment
пытаетесь заставить это работать с createMuiTheme, есть идеи? - person bsapaka; 22.11.2019
comment
Цвет метки onfocus не меняется, как это тоже изменить? - person Ali Mert Cakar; 05.10.2020
comment
Вы должны добавить! Важно, может плохо. - person Ali Mert Cakar; 05.10.2020

https://codesandbox.io/s/6rx8p

                      <CssTextField      

                       label="Username"

                       className="username"
                       name="username"
                       onChange={this.onChange}
                       type="text"
                       autoComplete="current-password"
                       margin="normal"
                       inputProps={{ style: { fontFamily: 'nunito', color: 'white'}}}

                    />

// объявляем константу и добавляем стиль пользовательского интерфейса материала

const CssTextField = withStyles({
  root: {
    '& label.Mui-focused': {
      color: 'white',
    },
    '& .MuiInput-underline:after': {
      borderBottomColor: 'yellow',
    },
    '& .MuiOutlinedInput-root': {
      '& fieldset': {
        borderColor: 'white',
      },
      '&:hover fieldset': {
        borderColor: 'white',
      },
      '&.Mui-focused fieldset': {
        borderColor: 'yellow',
      },
    },
  },
})(TextField);
person Jojo Joseph    schedule 12.07.2019
comment
Примечание. Текстовое поле должно иметь вариант = 'выделенный'. - person Cong Dan Luong; 12.07.2019
comment
Это должен быть принятый ответ. Я нашел это после повсюду поисков. Спасибо. - person Priyank Vashiar; 09.10.2020

const styles = theme => ({
  notchedOutline: {
    borderWidth: "1px",
    borderColor: "yellow !important"
  }
});

 <TextField
              variant="outlined"
              rows="10"
              fullWidth
              InputProps={{
                classes: {
                  notchedOutline: classes.notchedOutline
                }
              }}
              id="standard-textarea"
              label="Input Set"
              helperText="Enter an array with elemets seperated by , or enter a JSON object"
              placeholder="Placeholder"
              multiline
              value={"" + this.props.input}
              onChange={this.props.handleChangeValue("input")}
              className={classes.textField}
              margin="normal"
            />

введите описание изображения здесь

person Hitesh Sahu    schedule 29.03.2019
comment
Этот ответ мне помог, но часть !important мне не нужна. Material-UI версии 4.11.2 - person Victor Oliveira; 06.02.2021
comment
Это сработало отлично. Спасибо друг. - person Murphy Adam; 06.06.2021

Если кто-то хочет сделать это с помощью стилизованных компонентов:

import styled from "styled-components";
import {TextField} from "@material-ui/core";

const WhiteBorderTextField = styled(TextField)`
  & label.Mui-focused {
    color: white;
  }
  & .MuiOutlinedInput-root {
    &.Mui-focused fieldset {
      border-color: white;
    }
  }
`;

Это заняло у меня слишком много времени, чтобы понять. Надеюсь, это кому-то поможет.

person b-zurg    schedule 30.07.2020
comment
Не могли бы вы объяснить, почему в & label.Mui-focused после амперсанда есть пробел, а в &.Mui-focused fieldset нет пробела? - person Mike K; 11.11.2020

Проблема с границей текстового поля заключается в том, что цвет, который вы хотите установить, имеет более низкий специфичность, чем исходный стиль, установленный Material-UI (MUI).

Например. MUI устанавливает этот класс при фокусировке:

.MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline {
    border-color: (some color);
}

который более конкретен, чем пользовательский селектор, например:

.Component-cssNotchedOutline {
    border-color: #f0f;
}

Вы можете добавить !important исключение к цвету, но это 'плохая практика ':

import React from 'react';
import { createStyles, TextField, WithStyles, withStyles } from '@material-ui/core';
interface IProps extends WithStyles<typeof styles> {}

const styles = createStyles({
    notchedOutline: { borderColor: '#f0f !important' },
});

export const TryMuiA = withStyles(styles)((props: IProps) => {
    const { classes } = props;
    return ( <TextField variant={ 'outlined' } label={ 'my label' }
        InputProps={ {
            classes: {
                notchedOutline: classes.notchedOutline,
            },
        } }
    /> );
});

В официальном примере MUI используются другие способы повышения специфичности.

Уловка в том, чтобы не стилизовать элемент напрямую, например:

.someChildElement { border-color: #f0f }

но добавить несколько дополнительных селекторов (больше, чем в MUI *), например:

.myRootElement.someExtra { border-color: #f0f }
.myRootElement .someChildElement { border-color: #f0f }
...

* (На самом деле достаточно использовать те же селекторы, что и MUI, потому что если специфика селекторов такая же, то используются более поздние)

Включить родительский элемент: вы могли заметить, что параметр notchedOutline действительно устанавливает цвет для несфокусированного элемента, но не для сфокусированного. Это потому, что стиль MUI включает элемент parent поля ввода (.MuiOutlinedInput-root.Mui-focused). Так что вам нужно также включить родителя.

import React from 'react';
import { withStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';

const styles = {
    root: {                           // - The TextField-root
        border: 'solid 3px #0ff',     // - For demonstration: set the TextField-root border
        padding: '3px',               // - Make the border more distinguishable

        // (Note: space or no space after & matters. See SASS "parent selector".)
        '& .MuiOutlinedInput-root': {  // - The Input-root, inside the TextField-root
            '& fieldset': {            // - The <fieldset> inside the Input-root
                borderColor: 'pink',   // - Set the Input border
            },
            '&:hover fieldset': {
                borderColor: 'yellow', // - Set the Input border when parent has :hover
            },
            '&.Mui-focused fieldset': { // - Set the Input border when parent is focused 
                borderColor: 'green',
            },
        },
    },
};

export const TryMui = withStyles(styles)(function(props) {
    const { classes } = props;
    return (<TextField label="my label" variant="outlined"
        classes={ classes }
    />);
})

Обратите внимание, что вы можете повысить специфичность разными способами, например это тоже сработает (немного по-другому):

    '& fieldset.MuiOutlinedInput-notchedOutline': {
        borderColor: 'green',
    },

Примечание. Может показаться немного "грязным" добавлять селекторы только для повышения конкретности, когда они вам на самом деле "не нужны". Я думаю, что это так, но этот обходной путь иногда был единственным решением с момента изобретения CSS, поэтому он считается приемлемым.

person kca    schedule 19.11.2020
comment
В чем разница между использованием пробела и без пробела и - person breaktop; 05.12.2020
comment
Это в основном синтаксис SASS: &.myClass vs. & .myClass ist like span.myClass vs . span .myClass. (Я добавил примечание в код в своем ответе.) - person kca; 05.12.2020

  inputProps={{ style: { fontFamily: 'nunito', color: 'white'}}}

Inputprops работает путем стилизации введенных входных данных в текстовое поле, а также мы можем использовать className для пользовательской раскраски.

      const CssTextField = withStyles({
     root: {
    '& label.Mui-focused': {
     color: 'white',
      },
     '& .MuiInput-underline:after': {
      borderBottomColor: 'yellow',
     },
    '& .MuiOutlinedInput-root': {
     '& fieldset': {
     borderColor: 'white',
     },
     '&:hover fieldset': {
      borderColor: 'white',
       },
     '&.Mui-focused fieldset': {
       borderColor: 'yellow',
     },
     },
    },

Этот константный стиль работает с внешним видом текстового поля ...

Выше предлагается изменить стиль внешней части пользовательского интерфейса материала ...

person Jojo Joseph    schedule 01.08.2019

используйте это свойство переопределения CSS

.MuiFormLabel-root.Mui-focused {
  color: red !important;
}
.MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline {
  border-color: red !important;
}

person ma2web    schedule 12.10.2020

Расширение ответа Питера. Вы также можете изменить все цвета событий без !important:

 cssOutlinedInput: {
        "&:not(hover):not($disabled):not($cssFocused):not($error) $notchedOutline": {
          borderColor: "red" //default      
        },
        "&:hover:not($disabled):not($cssFocused):not($error) $notchedOutline": {
          borderColor: "blue" //hovered
        },
        "&$cssFocused $notchedOutline": {
          borderColor: "purple" //focused
        }
      },
      notchedOutline: {},
      cssFocused: {},
      error: {},
      disabled: {}

https://stackblitz.com/edit/material-ui-custom-outline-color-c6zqxp

person Diego Felipe    schedule 30.04.2019

Клавиша переопределений позволяет вам настроить внешний вид всех экземпляров типа компонента, ... Material-Ui

В этом случае есть короткий ответ, вам нужно использовать ThemeProvider и createMuiTheme.

import React from 'react';
import {
  createMuiTheme,
  ThemeProvider
} from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';

const theme = createMuiTheme({
  palette: {
    primary: {
      main: '#ff5722' //your color
    }
  }
});

function CustomTextfield(props) {
  return (
    <ThemeProvider theme={theme}>
      <TextField variant='outlined'/>
    </ThemeProvider>
  );
}

Для более полной настройки вы можете использовать имена тем по умолчанию pallete. Если вы не знаете, где находятся имена или соглашения об именах. Использование инспектора браузера в разделе стилей - ваше спасение, вы можете заметить, как цепочка css сделана в material-ui.

.MuiFilledInput-root {
position: relative;
transition: background-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms;
background-color: rgba(255,255,255,0.8);
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}

MuiFilledInput> корень> цвет фона:

нам нужно создать тему, используя данные из инспектора, нам нужно только поместить цепочку в переопределения: {}

const theme = createMuiTheme({
  overrides: {
    MuiFilledInput: {
      root: {
        backgroundColor: 'rgba(255,255,255,0.8)',
        '&:hover': {
          backgroundColor: 'rgba(255,255,255,1)'
        },
        '&.Mui-focused': {
          backgroundColor: 'rgba(255,255,255,1)'
        }
      }
    }
  }
});

Теперь вы можете выполнить переопределение с помощью ThemeProvider.

import {
  createMuiTheme,
  ThemeProvider
} from '@material-ui/core/styles';

const theme = createMuiTheme({
  overrides: {
    MuiFilledInput: {
      root: {
        backgroundColor: 'rgba(255,255,255,0.8)',
        '&:hover': {
          backgroundColor: 'rgba(255,255,255,1)'
        },
        '&.Mui-focused': {
          backgroundColor: 'rgba(255,255,255,1)'
        }
      }
    }
  }
});

function CustomTextfield(props) {
  return (
    <ThemeProvider theme={theme}>
      <TextField variant='filled' />
    </ThemeProvider>
  );
}

Поэтому для этого вопроса вам нужно искать свои собственные компоненты, потому что они имеют разные имена.

person Pablo    schedule 13.02.2020
comment
откуда вы нашли этот ключ MuiFilledInput и как я могу найти его и для других компонентов? - person Shamseer Ahammed; 04.08.2020

Вот как я решил свою.

Я хотел изменить цвет текстового поля при включении. Как вы уже знаете, цвет текстового поля по умолчанию для материала Ui, когда он находится в фокусе, является синим. Синий - основной цвет.

Итак, вот хак, я перешел к внешнему компоненту App, а затем определил функцию под названием createMuiTheme. Эта функция возвращает объект под названием палитра. Внутри палитры вы указываете свой цвет. Вы будете использовать ThemeProvider из materia ui, чтобы применить новую определенную цветовую тему к вашему приложению, как показано ниже. Для получения дополнительных разъяснений перейдите по этой ссылке https://material-ui.com/customization/palette/

import {createMuiTheme, ThemeProvider} from '@material-ui/core';
import FormInput from './FormInput';

const theme = createMuiTheme({
  palette: {
    primary: {
      main: "your own color", //this overide blue color
      light: "your own color", //overides light blue
      dark: "your own color", //overides dark blue color
    },
  },
});


//apply your new color theme to your app component
function App(){
return(
<ThemeProvider theme={theme}> //applies custom theme
   <FormInput/>
</ThemeProvider>
)
}
person Chukwudi Nweze    schedule 28.05.2021

вы можете сослаться на этот код:

styles.js

cssLabel: {
  color : 'rgb(61, 158, 116) !important'
}, 
notchedOutline: {
  borderWidth: '1px',
  borderColor: 'rgb(61, 158, 116) !important',
  color: 'rgb(61, 158, 116)',
},

form.js

<TextField
                name="creator"
                focused="true" 
                variant="outlined" 
                label="Creator"  
                fullwidth
                InputLabelProps={{
                    classes: {
                      root: classes.cssLabel,
                      focused: classes.cssLabel,
                    },
                }}
                InputProps={{
                    classes: {
                      root: classes.notchedOutline,
                      focused: classes.notchedOutline,
                      notchedOutline: classes.notchedOutline,
                    },
                    
                 }}
               
 />

в основном, вам нужно правильно установить цвет границы notchedOutline для InputProps.

person Aditi Kulkarni    schedule 23.02.2021

Вот этот пример на выбранном входе:

import {
  FormControl,
  InputLabel,
  Select,
  MenuItem,
  OutlinedInput as MuiOutlinedInput,
} from "@material-ui/core";
    
const OutlinedInput = withStyles((theme) => ({
  notchedOutline: {
    borderColor: "white !important",
  },
}))(MuiOutlinedInput);

const useStyles = makeStyles((theme) => ({
  select: {
    color: "white",
  },
  icon: { color: "white" },
  label: { color: "white" },
}));

function Component() {
  return (
    <FormControl variant="outlined">
      <InputLabel id="labelId" className={classes.label}>
        Label
      </InputLabel>
      <Select
        labelId="labelId"
        classes={{
          select: classes.select,
          icon: classes.icon,
        }}
        input={<OutlinedInput label="Label" />}
      >
        <MenuItem>A</MenuItem>
        <MenuItem>B</MenuItem>
      </Select>
    </FormControl>
  );
}
person Vicente Losada Fadul    schedule 09.03.2021