Make div fill remaining *horizontal* space in flexbox

前端 未结 2 787
情话喂你
情话喂你 2020-11-22 05:31

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 unl

相关标签:
2条回答
  • 2020-11-22 05:41

    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?
    0 讨论(0)
  • 2020-11-22 05:50

    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.

    Edit: Dotted bottom border will probably look weird depending on how your browser displays it. I'd personally recommend using a black circle SVG as a repeated background image, properly sized and positioned to the bottom of the middle container. Will add this alternative solution when I get time.

    .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;
    }
    <div class="row">
      <div class="left">Left</div>
      <div class="separator"></div>
      <div class="right">Right With Text</div>
    </div>
    <div class="row">
      <div class="left">Left With More Text</div>
      <div class="separator"></div>
      <div class="right">Right</div>
    </div>
    <div class="row">
      <div class="left">Left With Text</div>
      <div class="separator"></div>
      <div class="right">Right With More Text</div>
    </div>

    0 讨论(0)
提交回复
热议问题