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

Кажется, я не могу понять, как изменить цвет контура выделенного варианта Я посмотрел на проблемы с GitHub, и люди, кажется, указывают на использование свойства «InputProps», но это, похоже, ничего не дает. Как изменить цвет границы Material-UI &lt;TextField /&gt; Вот мой код в его текущем состоянии

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);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
80
0
127 865
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

и наконец :

Документация API компонента Input React. Узнайте больше о свойствах и точках настройки CSS.

Можете ли вы привести конкретный пример по делу в вопросе? Как изменить цвет границы?

Bahax 26.11.2018 16:43

Не уверен, почему у него так много голосов против. Да, здесь не объясняется, как изменить цвет, но есть способы изменения стилей, включая цвета. Это также не ответ «копирование и вставка», «только код» или «только ссылка». И это было принято ОП, но есть отрицательные голоса? Это подвергает OP не только изменению цвета. Благодаря этому посту люди будут лучше знакомы со всей системой, избегая возможных повторяющихся вопросов относительно стиля. Другие ответы можно кормить с ложечки, если они хотят, но этот ответ по-прежнему очень полезен для сообщества. Вот почему люди уходят ТАК ...

Dioxin 13.02.2020 04:36

@Dioxin этот ответ не представляет большой ценности, держу пари, что любой может легко найти эту информацию в документации. Однако я не согласен с ответами "против", особенно с такими, как эти, потому что это все еще добавляет ценности, а "против" отпугивают плакат. Если люди думают, что есть другие ответы получше, им следует просто проголосовать за них.

ehab 10.02.2021 11:55

У @ehab Jojo 32 голоса за, и все, что они сделали, это вставили код без объяснения причин. Тот факт, что OP не получил с ложечки пример кода, который он может скопировать и вставить, не означает, что значение не было предоставлено. ОП принял это. Я не сомневаюсь, что отрицательные голоса принадлежат людям, которые хотели получить ответ «скопировать и вставить».

Dioxin 10.02.2021 18:50

@Dioxin Не все так или иначе. Между кодом копирования и вставки и «rtfm» есть огромная серая зона. Нюансы стилизации элементов формы MUI - отличный пример того, что сложно даже после прочтения документации. Конечно, любой хороший ответ (или вопрос) должен выделять соответствующие документы, но обсуждение конкретных особенностей того, что работает, а что нет, когда вы читали документы и проблемы GH и пытались применить их серьезно, но не добились успеха, чрезвычайно ценно. Документы не всегда идеальны, и OP - не единственный, кто пытался и потерпел неудачу.

reustin 18.02.2021 17:27

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

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

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

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

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

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

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

Ах, в некоторых случаях вам все равно понадобится! Important. Спасибо!

benihana21 27.06.2019 01:30

пытаетесь заставить это работать с createMuiTheme, есть идеи?

brietsparks 22.11.2019 07:46

Цвет метки onfocus не меняется, как это тоже изменить?

Ali Mert Cakar 05.10.2020 21:15

Вы должны добавить! Важно, может плохо.

Ali Mert Cakar 05.10.2020 21:16
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.handleChangeEventValue("input")}
              className = {classes.textField}
              margin = "normal"
            />

Этот ответ мне помог, но мне не нужна была деталь !important. Material-UI версии 4.11.2

Victor Oliveira 06.02.2021 17:25

Расширение отвечать Питера. Вы также можете изменить все цвета событий без !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

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);

Примечание. Текстовое поле должно иметь вариант = 'очерченный'.

Cong Dan Luong 12.07.2019 11:45

Это должен быть принятый ответ. Я нашел это после повсюду поисков. Спасибо.

Priyank Vashiar 09.10.2020 09:32
  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',
     },
     },
    },

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

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

The overrides key enables you to customize the appearance of all instances of a component type,... 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>
  );
}

Для более полной настройки вы можете использовать имена тем по умолчанию поддон. Если вы не знаете, где находятся имена или соглашения об именах. Использование инспектора браузера в разделе стилей - ваше спасение, вы можете заметить, как цепочка 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>
  );
}

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

откуда вы нашли этот ключ MuiFilledInput и как я могу найти его и для других компонентов?

Shamseer Ahammed 04.08.2020 13:59

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

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;
    }
  }
`;

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

Не могли бы вы объяснить, почему после амперсанда в & label.Mui-focused стоит пробел, а в &.Mui-focused fieldset - нет?

Mike K 11.11.2020 07:28

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

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

Проблема с границей текстового поля заключается в том, что цвет, который вы хотите установить имеет более низкий специфичность, чем исходный стиль, установленный 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 включает в себя элемент родитель поля ввода (.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, поэтому он считается вроде приемлемый.

В чем разница между использованием пробела и без пробела и

breaktop 05.12.2020 04:09

Это в основном синтаксис SASS: &.myClass против & .myClass - это как span.myClass против span .myClass. (Я добавил примечание в код в своем ответе.)

kca 05.12.2020 11:43

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

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.

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

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>
  );
}

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

Я хотел изменить цвет текстового поля при включении. Как вы уже знаете, цвет текстового поля по умолчанию для материала 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>
)
}

Другие вопросы по теме