Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I align one item right with flexbox?

https://jsfiddle.net/vhem8scs/

Is it possible to have two items align left and one item align right with flexbox? The link shows it more clearly. The last example is what I want to achieve.

In flexbox I have one block of code. With float I have four blocks of code. That is one reason why I prefer flexbox.

HTML

<div class="wrap">   <div>One</div>   <div>Two</div>   <div>Three</div> </div>  <!-- DESIRED RESULT -->  <div class="result">   <div>One</div>   <div>Two</div>   <div>Three</div> </div> 

CSS

.wrap {   display: flex;   background: #ccc;   width: 100%;   justify-content: space-between; }  .result {   background: #ccc;   margin-top: 20px; }  .result:after {   content: '';   display: table;   clear: both; }  .result div {   float: left; } .result div:last-child {   float: right; } 
like image 915
Jens Törnell Avatar asked Feb 08 '16 12:02

Jens Törnell


People also ask

How do I center a single element in Flexbox?

To center the inner div element we will make the parent a flex container. By adding the display: flex; property we make the section element a flex container allowing us to adjust the layout of the div which is now a flex item. To center out item horizontally we use the justify-content: center; .

How do you right align a flex column?

The flex columns can be aligned left or right by using the align-content property in the flex container class. The align-content property changes the behavior of the flex-wrap property. It aligns flex lines. It is used to specify the alignment between the lines inside a flexible container.

How do you align content inside a Flex item?

If you want something to be vertically centered, set the container to display:flex and then use justify-content to accomplish it. With justify-content you could either set it to space-around or to center . Either will accomplish your goal. This is a good answer.


2 Answers

To align one flex child to the right set it withmargin-left: auto;

From the flex spec:

One use of auto margins in the main axis is to separate flex items into distinct "groups". The following example shows how to use this to reproduce a common UI pattern - a single bar of actions with some aligned on the left and others aligned on the right.

.wrap div:last-child {   margin-left: auto; } 

Updated fiddle

.wrap {    display: flex;    background: #ccc;    width: 100%;    justify-content: space-between;  }  .wrap div:last-child {    margin-left: auto;  }  .result {    background: #ccc;    margin-top: 20px;  }  .result:after {    content: '';    display: table;    clear: both;  }  .result div {    float: left;  }  .result div:last-child {    float: right;  }
<div class="wrap">    <div>One</div>    <div>Two</div>    <div>Three</div>  </div>    <!-- DESIRED RESULT -->  <div class="result">    <div>One</div>    <div>Two</div>    <div>Three</div>  </div>

Note:

You could achieve a similar effect by setting flex-grow:1 on the middle flex item (or shorthand flex:1) which would push the last item all the way to the right. (Demo)

The obvious difference however is that the middle item becomes bigger than it may need to be. Add a border to the flex items to see the difference.

Demo

.wrap {    display: flex;    background: #ccc;    width: 100%;    justify-content: space-between;  }  .wrap div {    border: 3px solid tomato;  }  .margin div:last-child {    margin-left: auto;  }  .grow div:nth-child(2) {    flex: 1;  }  .result {    background: #ccc;    margin-top: 20px;  }  .result:after {    content: '';    display: table;    clear: both;  }  .result div {    float: left;  }  .result div:last-child {    float: right;  }
<div class="wrap margin">    <div>One</div>    <div>Two</div>    <div>Three</div>  </div>    <div class="wrap grow">    <div>One</div>    <div>Two</div>    <div>Three</div>  </div>    <!-- DESIRED RESULT -->  <div class="result">    <div>One</div>    <div>Two</div>    <div>Three</div>  </div>
like image 53
Danield Avatar answered Oct 05 '22 08:10

Danield


For a terse, pure flexbox option, group the left-aligned items and the right-aligned items:

<div class="wrap">   <div>     <span>One</span>     <span>Two</span>   </div>   <div>Three</div> </div> 

and use space-between:

.wrap {   display: flex;   background: #ccc;   justify-content: space-between; } 

This way you can group multiple items to the right(or just one).

https://jsfiddle.net/c9mkewwv/3/

like image 42
spflow Avatar answered Oct 05 '22 08:10

spflow