Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I have two fixed width columns with one flexible column in the center?

Tags:

html

css

flexbox

I'm trying to set up a flexbox layout with three columns where the left and right columns have a fixed width, and the center column flexes to fill the available space.

Despite setting up dimensions for the columns, they still seem to shrink as the window shrinks.

Anyone know how to accomplish this?

An additional thing I will need to do is hide the right column based on user interaction, in which case the left column would still keep its fixed width, but the center column would fill the rest of the space.

#container {      display: flex;      justify-content: space-around;      align-items: stretch;      max-width: 1200px;  }    .column.left {      width: 230px;  }    .column.right {      width: 230px;      border-left: 1px solid #eee;  }    .column.center {      border-left: 1px solid #eee;  }
<div id="container">      <div class="column left">          <p>Anxiety was a blog series that ran in the New York Times Opinion section from January 2012 to July 2013. It featured essays, fiction, and art by a wide range of contributors that explored anxiety from scientific, literary, and artistic perspectives.</p>      </div>      <div class="column center">          <img src="http://i.imgur.com/60PVLis.png" width="100" height="100" alt="">      </div>      <div class="column right">          Balint Zsako          <br/> Someone’s Knocking at My Door          <br/> 01.12.13      </div>  </div>

Here's a JSFiddle: http://jsfiddle.net/zDd2g/185/

like image 521
mheavers Avatar asked May 21 '14 22:05

mheavers


People also ask

How do you divide two columns into flex?

Approach: To create a two-column layout, first we create a <div> element with property display: flex, it makes that a div flexbox and then add flex-direction: row, to make the layout column-wise. Then add the required div inside the above div with require width and they all will come as columns.

How do you change the width of a flex column?

A flexbox item can be set to a fixed width by setting 3 CSS properties — flex-basis, flex-grow & flex-shrink. flex-basis : This property specifies the initial length of the flex item. flex-grow : This property specifies how much the flex item will grow relative to the rest of the flex items.


2 Answers

Instead of using width (which is a suggestion when using flexbox), you could use flex: 0 0 230px; which means:

  • 0 = don't grow (shorthand for flex-grow)
  • 0 = don't shrink (shorthand for flex-shrink)
  • 230px = start at 230px (shorthand for flex-basis)

which means: always be 230px.

See fiddle, thanks @TylerH

Oh, and you don't need the justify-content and align-items here.

img {     max-width: 100%; } #container {     display: flex;     x-justify-content: space-around;     x-align-items: stretch;     max-width: 1200px; } .column.left {     width: 230px;     flex: 0 0 230px; } .column.right {     width: 230px;     flex: 0 0 230px;     border-left: 1px solid #eee; } .column.center {     border-left: 1px solid #eee; } 
like image 87
Rudie Avatar answered Nov 29 '22 16:11

Rudie


Despite setting up dimensions for the columns, they still seem to shrink as the window shrinks.

An initial setting of a flex container is flex-shrink: 1. That's why your columns are shrinking.

It doesn't matter what width you specify (it could be width: 10000px), with flex-shrink the specified width can be ignored and flex items are prevented from overflowing the container.

I'm trying to set up a flexbox with 3 columns where the left and right columns have a fixed width...

You will need to disable shrinking. Here are some options:

.left, .right {      width: 230px;      flex-shrink: 0;  }   

OR

.left, .right {      flex-basis: 230px;      flex-shrink: 0; } 

OR, as recommended by the spec:

.left, .right {     flex: 0 0 230px;    /* don't grow, don't shrink, stay fixed at 230px */ } 

7.2. Components of Flexibility

Authors are encouraged to control flexibility using the flex shorthand rather than with its longhand properties directly, as the shorthand correctly resets any unspecified components to accommodate common uses.

More details here: What are the differences between flex-basis and width?

An additional thing I need to do is hide the right column based on user interaction, in which case the left column would still keep its fixed width, but the center column would fill the rest of the space.

Try this:

.center { flex: 1; } 

This will allow the center column to consume available space, including the space of its siblings when they are removed.

Revised Fiddle

like image 35
Michael Benjamin Avatar answered Nov 29 '22 16:11

Michael Benjamin