I'm trying to compose a header with month names and all days in that month right below the name.
Days items have fixed width so I thought: why not use flexbox?
For some reasons .day
elements are falling of their parent and parent does not grow.
Could you please give me a hint why flex-basis: auto
doesn't make month-slot grow after days' slot overflow it?
As for implementation I've already found workaround with using float: left
instead of using flexbox. But I cannot understand why it works this way.
.main {
display: flex;
}
.month {
flex: 0 0 auto;
}
.days {
display: flex;
}
.day {
flex: 0 0 2em;
}
<div class='main'>
<div class='month'>
<div class='name'>Jan</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
</div>
</div>
<div class='month'>
<div class='name'>Feb</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
<div class='day'>7</div>
<div class='day'>8</div>
<div class='day'>9</div>
<div class='day'>10</div>
</div>
</div>
<div class='month'>
<div class='name'>Mar</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
</div>
</div>
</div>
codepen: http://codepen.io/skyboyer/pen/MyzeLW
jsFiddle: https://jsfiddle.net/azizn/ytt7jb85/
Their total height will exceed the height of their parent so they will shrink equally to fit inside it as this is the default behavior AND the parent will not grow with them even if you define flex-shrink:0 on it because there is nothing to shrink for the parent element simply because its following a row direction ...
Firstly, you can't apply a fixed width AND flex-grow. Secondly, flex-grow only works if the parent element has display:flex . In this case the section has display flex but the links do not and the flexgrow divs are children of the link…not the section.
Getting the child of a flex-item to fill height 100%Set position: relative; on the parent of the child. Set position: absolute; on the child. You can then set width/height as required (100% in my sample).
To override this behavior, use min-width: 0 or overflow: hidden .
Use width: 2em
instead of flex: 0 0 2em
.
.main {
display: flex;
}
.month {
flex: 0 0 auto;
}
.days {
display: flex;
}
.day {
width: 2em;
}
<div class='main'>
<div class='month'>
<div class='name'>Jan</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
</div>
</div>
<div class='month'>
<div class='name'>Feb</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
<div class='day'>7</div>
<div class='day'>8</div>
<div class='day'>9</div>
<div class='day'>10</div>
</div>
</div>
<div class='month'>
<div class='name'>Mar</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
</div>
</div>
</div>
The problem with your code is that Firefox and Chrome size .month
taking the width of the contents into account, but not flex-basis
.
.main {
display: flex;
}
.month {
flex: 0 0 auto;
}
.days {
display: flex;
overflow: hidden;
}
.main.big .day {
flex: 0 0 2em;
}
.main.big > .month:after {
content: '';
position: absolute;
top: 0;
bottom: 0;
border: 1px solid red;
}
<div class='main grow'>
<div class='month'>
<div class='name'>Jan</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
</div>
</div>
<div class='month'>
<div class='name'>Feb</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
<div class='day'>7</div>
<div class='day'>8</div>
<div class='day'>9</div>
<div class='day'>10</div>
</div>
</div>
<div class='month'>
<div class='name'>Mar</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
</div>
</div>
</div>
<hr />
<div class='main big'>
<div class='month'>
<div class='name'>Jan</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
</div>
</div>
<div class='month'>
<div class='name'>Feb</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
<div class='day'>3</div>
<div class='day'>4</div>
<div class='day'>5</div>
<div class='day'>6</div>
<div class='day'>7</div>
<div class='day'>8</div>
<div class='day'>9</div>
<div class='day'>10</div>
</div>
</div>
<div class='month'>
<div class='name'>Mar</div>
<div class='days'>
<div class='day'>1</div>
<div class='day'>2</div>
</div>
</div>
</div>
This is a bug. According to Line Length Determination, when determining the flex base size of .month
case E applies:
size the item into the available space using its used flex basis in place of its main size, treating a value of
content
asmax-content
.
The intricacies of calculating a max-content size were moved to CSS Sizing 4:
max-content inline size: The box’s “ideal” size in the inline axis. Usually the narrowest inline size it could take while fitting around its contents if none of the soft wrap opportunities within the box were taken. (See §4 Intrinsic Size Determination.)
In case of a non-replaced block,
The max-content inline size of a block container box is the inline-size of the box after layout, if all children are sized under a max-content constraint.
It explicitly says "after layout". It doesn't say something like "before flex layout". So flex-basis: 2em
shouldn't be ignored, and should contribute to a bigger max-content size of the container.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With