'div or p tag inside of flex box wrapping
Is there a way to have the logo text div tag called Title take up its content space inside the parent flexbox instead of wrapping.
I don't want to set the Title which is just a div to 100% or use white-space:nowrap. I just want it to act like a div where it fills its content space and only wraps if it needs too.
Also why does this happen when another element is set to 100%. Like the code snippet below.
const styled = window.styled;
const Header = styled.div `
width: 100%;
display: flex;
border: 1px solid gray;
align-items: center;
width: 100%;
min-height: 50px;
padding: 10px 10px 10px 30px;
background-color: #147189;
color: white;
`;
const Title = styled.div `
`;
const TestDiv = styled.div `
width: 100%;
border: 1px solid red;
`;
const App = () => {
return (
<div>
<Header >
<Title > Logo Text </Title>
<TestDiv > hello </TestDiv> </Header>
</div>
);
}
ReactDOM.render(<App/>,
document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="//unpkg.com/[email protected]/dist/styled-components.min.js"></script>
<div id="react"></div>
Solution 1:[1]
Remove width: 100% from the TestDiv definition and add margin-left: 2rem (or whatever value you wish) to separate it from the other flex item (i.e the Title component):
const TestDiv = styled.div `
margin-left: 2rem;
border: 1px solid red;
`;
Alternatively, you could set the widths for the flex items as percentages (totaling 100%) of their parent's (Header's) width, like below:
const Title = styled.div `
width: 10%;
`;
const TestDiv = styled.div `
width: 90%;
border: 1px solid red;
`;
Solution 2:[2]
Since you did not want to use whitespace: nowrap, I guess a workaround would be to parameterise the width of the Title div according to the title text. I set width of Title to be equal to width + 3 ch (3 extra just for padding and make sure it does not wrap). I guess if this might get too long, you could set max-width: 25ch or something like that.
Hope this helps.
const styled = window.styled;
const Header = styled.div `
width: 100%;
display: flex;
border: 1px solid gray;
align-items: center;
width: 100%;
min-height: 50px;
padding: 10px 10px 10px 30px;
background-color: #147189;
color: white;
`;
const Title = styled.div `
`;
const TestDiv = styled.div `
width: 100%;
border: 1px solid red;
`;
const style = () => ({});
const setWidth = (width) => ({
width: `${width + 3}ch`,
});
const App = () => {
return (
<div>
<Header >
<Title style={ setWidth('Logo Text Whatever'.length) } > Logo Text Whatever </Title>
<TestDiv > hello </TestDiv> </Header>
</div>
);
}
ReactDOM.render(<App/>,
document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="//unpkg.com/[email protected]/dist/styled-components.min.js"></script>
<div id="react"></div>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Chizaram Igolo |
| Solution 2 | cSharp |
