import React from 'react';
import PropTypes from 'prop-types';
import SearchIcon from '@material-ui/icons/Search';
import InputBase from '@material-ui/core/InputBase';
import { AccountCircle } from '@material-ui/icons';
import { withStyles, AppBar, Toolbar, Paper, Typography, IconButton } from '@material-ui/core';
const styles = (theme) => ({
root: {
borderRadius: theme.shape.borderRadius * 0.5,
backgroundColor: theme.palette.primary.main,
display: 'flex',
},
logo: {
borderRadius: theme.shape.borderRadius * 0.5,
backgroundColor: theme.palette.secondary.main,
marginTop: theme.spacing.unit * 2,
marginBottom: theme.spacing.unit * 2,
marginLeft: theme.spacing.unit * 3,
marginRight: theme.spacing.unit * 5,
flex: 0.5,
},
logoFont: {
color: theme.palette.primary.main,
fontWeight: 'bolder',
paddingTop: theme.spacing.unit * 0.5,
paddingBottom: theme.spacing.unit * 0.5,
paddingLeft: theme.spacing.unit * 2,
paddingRight: theme.spacing.unit * 2,
},
headerPads: {
paddingTop: theme.spacing.unit * 3,
paddingBottom: theme.spacing.unit * 2,
paddingRight: theme.spacing.unit * 10,
paddingLeft: theme.spacing.unit * 10,
},
containerHorizontalAlignment: {
display: 'flex',
flexDirection: 'row',
justifyContent: 'end',
paddingTop: theme.spacing.unit,
paddingBottom: theme.spacing.unit,
flex: 10,
},
searchBar: {
marginTop: theme.spacing.unit,
marginBottom: theme.spacing.unit,
marginLeft: theme.spacing.unit,
marginRight: theme.spacing.unit * 5,
borderRadius: theme.shape.borderRadius * 0.5,
backgroundColor: theme.palette.secondary.main,
width: 'auto',
/* [theme.breakpoints.up('sm')]: {
marginLeft: theme.spacing.unit,
width: 'auto',
}, */
display: 'flex',
flexDirection: 'row',
},
searchIcon: {
color: theme.palette.primary.main,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
marginLeft: 20,
height: '100%',
width: theme.spacing.unit * 7,
},
inputRoot: {
color: theme.palette.primary.main,
width: '100%',
},
inputInput: {
transition: theme.transitions.create('width'),
width: 'auto',
[theme.breakpoints.up('sm')]: {
width: '25%', //change it to 250(number)
'&:focus': {
width: '100%', //change it to 1000(number), it will work fine, but I need percentages.
},
},
},
loginButtonContainer: {
flex: 1,
},
loginButton: {
justifyContent: 'right',
marginTop: theme.spacing.unit * 0.5,
color: theme.palette.secondary.main,
},
});
function ExpandingSearchBar(props) {
const { classes} = props;
return (
<div className={classes.headerPads}>
<Paper square className={ classes.root }>
<div className={classes.logo}>
<Typography variant="h5" className={classes.logoFont}>
PlaceHolder
</Typography>
</div>
//Problematic div: the search bar
<div style={{border: '1px solid white'}} className={ classes.containerHorizontalAlignment }>
<div className={classes.searchBar}>
<div className={classes.searchIcon}>
<SearchIcon />
</div>
<InputBase
placeholder='Search'
classes={{
root: classes.inputRoot,
input: classes.inputInput,
}}
/>
</div>
</div>
<div className={classes.loginButton}>
<IconButton className={classes.loginButton}>
<AccountCircle fontSize='large'/>
</IconButton>
</div>
</Paper>
</div>
);
}
ExpandingSearchBar.propTypes = {
classes: PropTypes.object.isRequired,
}
export default withStyles(styles)(ExpandingSearchBar);
问题:
styles.inputInput
中的中,我已经使用material-ui的theme.transition.create
创建了一个过渡,问题是,如果宽度为固定数字,则可以很好地工作,如果我将百分比传递给组件只是具有固定的宽度,根本没有扩展或过渡。
另一个问题是,如果宽度searchBar超出其父级可以容纳的宽度,则不会将'PlaceHolder'从Paper
中推出,而是将按钮的末端从{{1 }}元素及其自身将自身推向正确的边界。
我已经使用了Material-ui中的Paper
,但也建议使用CSS的任何解决方案。
在沙箱中here尝试一下,然后将沙箱的浏览器窗口切换到全屏。
谢谢
答案 0 :(得分:1)
主要问题是您的“ searchBar” div
限制了输入内容“ 100%”的含义。关键是在整个搜索输入中使用InputBase
,这意味着在搜索图标中使用startAdornment
:
<div className={classes.searchBar}>
<InputBase
startAdornment={<SearchIcon />}
placeholder="Search"
classes={{
root: classes.inputRoot,
focused: classes.inputFocused
}}
/>
</div>
然后,样式需要进行一些调整(将样式从searchBar
移至inputRoot
,从inputInput
移至inputRoot
):
searchBar: {
width: "100%",
display: "flex",
flexDirection: "row"
},
inputRoot: {
marginTop: theme.spacing.unit,
marginBottom: theme.spacing.unit,
marginLeft: theme.spacing.unit,
marginRight: theme.spacing.unit * 5,
borderRadius: theme.shape.borderRadius * 0.5,
backgroundColor: theme.palette.secondary.main,
color: theme.palette.primary.main,
transition: theme.transitions.create("width"),
width: "auto",
[theme.breakpoints.up("sm")]: {
width: "25%" //change it to 250(number)
},
"&$inputFocused": {
[theme.breakpoints.up("sm")]: {
width: "100%" //change it to 1000(number), it will work fine, but I need percentages.
}
}
},
inputFocused: {},
这是您的沙盒的有效修改: