ChatGPT解决这个技术问题 Extra ChatGPT

Fill the remaining height or width in a flex container

I have 2 divs side-by-side in a flexbox. The right hand one should always be the same width, and I want the left hand one to just grab the remaining space. But it won't unless I specifically set its width.

So at the moment, it's set to 96% which looks OK until you really squash the screen - then the right hand div gets a bit starved of the space it needs.

I guess I could leave it as it is but it feels wrong - like there has to be a way to say:

the right one is always the same; you on the left - you get everything that's left

.ar-course-nav { cursor: pointer; padding: 8px 12px 8px 12px; border-radius: 8px; } .ar-course-nav:hover { background-color: rgba(0, 0, 0, 0.1); }

Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!
A really really really really really really really really really really really long department name
Created: 21 September 2016
>

You could also use grid-template-rows/columns

C
Community

Use the flex-grow property to make a flex item consume free space on the main axis.

This property will expand the item as much as possible, adjusting the length to dynamic environments, such as screen re-sizing or the addition / removal of other items.

A common example is flex-grow: 1 or, using the shorthand property, flex: 1.

Hence, instead of width: 96% on your div, use flex: 1.

You wrote:

So at the moment, it's set to 96% which looks OK until you really squash the screen - then the right hand div gets a bit starved of the space it needs.

The squashing of the fixed-width div is related to another flex property: flex-shrink

By default, flex items are set to flex-shrink: 1 which enables them to shrink in order to prevent overflow of the container.

To disable this feature use flex-shrink: 0.

For more details see The flex-shrink factor section in the answer here:

What are the differences between flex-basis and width?

Learn more about flex alignment along the main axis here:

In CSS Flexbox, why are there no "justify-items" and "justify-self" properties?

Learn more about flex alignment along the cross axis here:

How does flex-wrap work with align-self, align-items and align-content?


I had the same situation and using flex-grow: 1 was not having the same effects than flex: 1. Do you maybe know why is it different? (I fixed my problem with the latter, thx)
With flex-grow: 1, the flex-basis property remains at auto, its default value. With flex: 1, the flex-basis property changes to 0. See my answer here for an in-depth review: stackoverflow.com/q/43520932/3597276 @WhGandalf
flex-shrink was the key for me :)
Not only this but you'll also want to prevent an element from taking more space than is available using min-width: 0 (or min-height:0 is flex direction column), or else it will overflow beyond the available space in the layout, which is super weird honestly. stackoverflow.com/a/66689926/454780
H
HaulinOats

Basically I was trying to get my code to have a middle section on a 'row' to auto-adjust to the content on both sides (in my case, a dotted line separator). Like @Michael_B suggested, the key is using display:flex on the row container and at least making sure your middle container on the row has a flex-grow value of at least 1 higher than the outer containers (if outer containers don't have any flex-grow properties applied, middle container only needs 1 for flex-grow).

Here's a pic of what I was trying to do and sample code for how I solved it.

https://i.stack.imgur.com/YgZW5.png

.row { background: lightgray; height: 30px; width: 100%; display: flex; align-items:flex-end; margin-top:5px; } .left { background:lightblue; } .separator{ flex-grow:1; border-bottom:dotted 2px black; } .right { background:coral; }

Left
Right With Text
Left With More Text
Right
Left With Text
Right With More Text