![](/img/trans.png)
[英]css / html - no-wrap equivalent for div / auto width of element container
[英]Applying css transition to width of an element so that it covers the 100% width of its container div [ReactJS]
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
推出,而是將按鈕的末端從Paper
元素中推出,並且本身會將自身推過正確的邊界。
我已經使用了theme.create.transitions()
-ui中的theme.create.transitions()
,但也建議使用CSS的任何解決方案。
在沙箱中嘗試在此處進行操作,然后將沙箱的瀏覽器窗口切換為全屏。
謝謝
主要問題是您的“ 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: {},
這是您的沙盒的有效修改:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.