Set TextField height material-ui
index.js
import React from 'react'
import TextField from '@material-ui/core/TextField'
import style from './style'
import withStyles from 'hoc/withStyles'
import { connect } from 'react-redux'
class SearchField extends React.Component {
constructor (props) {
super(props)
this.onChange = this.onChange.bind(this)
}
onChange (event) {
const { dispatcher } = this.props
this.props.dispatch(dispatcher(event.target.value))
event.preventDefault()
}
render () {
const { classes, placeholder } = this.props
return (
<TextField
label={placeholder}
placeholder={placeholder}
InputProps={{ classes: { input: classes.resize } }}
className={classes.textField}
margin="normal"
autoFocus={true}
variant="outlined"
onChange={this.onChange}
/>
)
}
}
export default withStyles(style)(connect()(SearchField))
style.js
export default function () {
return {
container: {
display: 'flex',
flexWrap: 'wrap'
},
textField: {
width: 'auto'
},
resize: {
fontSize: 11
}
}
}
https://material-ui.com/api/text-field/
How can I change TextField
height? I can't find it in the documentation. When I try to change it directly in CSS it works incorrectly (it looks like this - selected height on the screen 26px).
What should I do?
Solution 1:
You can try out adding the size="small" which is mentioned in the Textfield API
<TextField variant="outlined" size="small" / >
Solution 2:
The other answer is useful but didn't work for me because if a label
is used in an outlined
component (as it is in the question) it leaves the label
uncentered. If this is your usecase, read on.
The way the <label>
component is styled is somewhat idiosyncratic, using position: absolute
and transform
. I believe it's done this way to make the animation work when you focus the field.
The following worked for me, with the latest material-ui v4 (it should work fine with v3 too).
// height of the TextField
const height = 44
// magic number which must be set appropriately for height
const labelOffset = -6
// get this from your form library, for instance in
// react-final-form it's fieldProps.meta.active
// or provide it yourself - see notes below
const focused = ???
---
<TextField
label="Example"
variant="outlined"
/* styles the wrapper */
style={{ height }}
/* styles the label component */
InputLabelProps={{
style: {
height,
...(!focused && { top: `${labelOffset}px` }),
},
}}
/* styles the input component */
inputProps={{
style: {
height,
padding: '0 14px',
},
}}
/>
Notes
- I just used inline styles rather than the
withStyles
HOC, as this approach just seems simpler to me - The
focused
variable is required for this solution - you get this withfinal-form
,formik
and probably other form libraries. If you're just using a rawTextField
, or another form library that doesn't support this, you'll have to hook this up yourself. - The solution relies on a magic number
labelOffset
to center thelabel
which is coupled to the staticheight
you choose. If you want to editheight
, you'll also have to editlabelOffset
appropriately. - This solution does not support changing the label font size. You can change the input font size, only if you're fine with there being a mismatch between that and the label. The issue is that the size of the 'notch' that houses the label in the outlined border is calculated in javascript according to a magic number ratio that only works when the label font size is the default. If you set the label font size smaller, the notch will also be too small when the label shows in the border. There's no easy way to override this, short of repeating the entire calculation yourself and setting the width of the notch (the component is
fieldset
>legend
) yourself via CSS. For me this wasn't worth it, as I'm fine with using the default font sizes with a height of 44px.
Solution 3:
The component takes a multiline
prop which is a boolean. Set this to true, and then set the component's rows
prop to a number.
<TextField
multiline={true}
rows={3}
name="Description"
label="Description"
placeholder="Description"
autoComplete="off"
variant="outlined"
value={description}
onChange={e => setDescription(e.target.value)}
/>