Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wrap element to new line/row using flexbox

Tags:

html

css

flexbox

I have trouble forcing an item into the next row in a flexbox layout.

How can I do something like the following image?

enter image description here

This is what I got so far:

#wrap {
  display: flex;
  width: 86vw;
  height: auto;
  box-sizing: border-box;
  margin: 0 auto;
}
.item1,
.item2 {
  width: 50%;
  height: 24.5vw;
  background: #4add69;
}
.item1 {
  margin-right: 10px;
}
.item2 {
  margin-left: 10px;
}
.item3 {
  width: 60%;
  height: 40vw;
  background: #d56c6c;
}
<div id="wrap">
  <div class="item1"></div>
  <div class="item2"></div>
  <div class="item3"></div>
</div>
like image 464
billybobjones Avatar asked Sep 16 '15 19:09

billybobjones


People also ask

How do you flex-wrap something to the next line?

You can use flex-basis: 100% for item you want to wrap in new line.

How do you have content break to next line with flex when content reaches edge?

To have content break to next line with flex when content reaches edge with Flex React Native, we can set flexWrap to 'wrap' . to set flexDirection to 'row' to set the flexbox direction to horizontal. Then we set flexWrap to 'wrap' to make the child items wrap when it reaches the right edge of the screen.

What is the flex-wrap property?

The flex-wrap property is a sub-property of the Flexible Box Layout module. It defines whether the flex items are forced in a single line or can be flowed into multiple lines. If set to multiple lines, it also defines the cross-axis which determines the direction new lines are stacked in.

How do you wrap a row in a Flexbox?

Use the flex-wrap Property to Wrap a Row or Column CSS flexbox has a feature to split a flex item into multiple rows (or columns). By default, a flex container will fit all flex items together. For example, a row will all be on one line.

How to tell Flexbox items in one row to line up?

There is no method in flexbox to tell items in one row to line up with items in the row above — each flex line acts like a new flex container. It deals with space distribution across the main axis. If there is only one item, and that item is allowed to grow, it will fill the axis just as if you had a single item flex container.

Is it possible to wrap flex items onto new lines?

There is however the ability to wrap flex items onto new lines, creating new rows if flex-direction is row and new columns if flex-direction is column. In this guide I will explain how this works, what it is designed for and what situations really require CSS Grid Layout rather than flexbox.

What does flex wrap mean in CSS?

However, using the flex-wrap property tells CSS to wrap items. This means extra items move into a new row or column. The break point of where the wrapping happens depends on the size of the items and the size of the container. nowrap: this is the default setting, and does not wrap items.


2 Answers

Your code is fine but missing two things.

  1. Use flex-wrap: wrap to create a new row. Modify the width of the first two items to be present in a single row.

  2. For the last two items, you need to nest it inside a container and then wrap them again.

Manipulate the dimension(width, height) and margin values to achieve the perfect/suitable layout.

JSfiddle Demo

* {
  margin: 0;
  padding: 0;
}
body {
  background: #232323;
  padding: 10px;
}
#wrap {
  display: flex;
  width: 86vw;
  height: auto;
  box-sizing: border-box;
  margin: 0 auto;
  flex-wrap: wrap;
  background: #232323;
  /* Added */
}
.item1,
.item2 {
  width: 48%;
  /* Modified */
  height: 24.5vw;
  background: #4add69;
  margin-bottom: 10px;
}
.item1 {
  margin-right: 10px;
}
.item2 {
  margin-left: 10px;
}
.item3 {
  width: 55%;
  height: 40vw;
  background: #d56c6c;
  margin-right: 10px;
}
.nested-items {
  display: flex;
  width: 42%;
  flex-wrap: wrap;
  align-content: space-between;
}
.item4,
.item5 {
  background: lightblue;
  width: 100%;
  height: 49%;
}
<div id="wrap">
  <div class="item1"></div>
  <div class="item2"></div>
  <div class="item3"></div>
  <div class="nested-items">
    <div class="item4"></div>
    <div class="item5"></div>
  </div>
</div>
like image 177
m4n0 Avatar answered Oct 21 '22 06:10

m4n0


Essentially you need an extra wrapping div for the two 'small' elements like so:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.wrap {
  width: 75%;
  margin: 1em auto;
  border: 1px solid green;
  padding: .25em;
  display: flex;
  flex-wrap: wrap;
}
.wrap div {
  border: 1px solid grey;
  margin-bottom: 1px;
}
.box {
  height: 80px;
  background: lightblue;
  flex: 0 0 50%;
}
.tall {
  flex: 0 0 65%;
  height: 160px;
}
.col {
  flex: 0 0 35%;
  display: flex;
  flex-wrap: wrap;
}
.mini {
  flex: 0 0 100%;
  height: 80px;
  background: pink;
}
<div class="wrap">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box tall"></div>
  <div class="box col">
    <div class="mini"></div>
    <div class="mini"></div>
  </div>
</div>

I've used a single overall element here with wrapping but the image suggests that this would be much simpler with actual rows and the extra wrapper mentioned before.

Codepen Demo of 2nd option with rows.

like image 22
Paulie_D Avatar answered Oct 21 '22 05:10

Paulie_D