Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CSS Flex dynamic grid with multiple sizes

Tags:

css

flexbox

I have a problem with flex.

I have a wrapper where a minimum of 1 and maximum of 9 squares can be shown. Squares can have multiple sizes, based on the number of squares in grid. I've got all required cases working except for one, as seen in this picture: enter image description here

My styles are:

.grid {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    align-content: space-between;
    width: 300px;
    height: 300px;
    position: relative;
}

Plus. the images have sized based on the overall number of them and their position in a list.

So the problem is in situation when I have 1 big square (takes position of 4 small squares) and 5 small squares around him from right and bottom.

The big one is first as he should be.

Next to him (top right corner) is second one, that's also correct.

The third one is in bottom left corner, and it should be in the second line and on the far right. Because of this one, all the others are in wrong position, so the last one is overflowing.

I've tried a lot of value combinations for justify-content, align-content, align-items and align-self but nothing have worked.

I'll go back to ton of classes and position absolute solution, if there is no flex solution for this. But I don't like it. It's too much styles and it doesn't look good.

Any advice would be greatly appreciated.

like image 983
Laker Avatar asked Jan 03 '17 13:01

Laker


People also ask

How do you get 3 items per row on flexbox?

For 3 items per row, add on the flex items: flex-basis: 33.333333% You can also use the flex 's shorthand like the following: flex: 0 0 33.333333% => which also means flex-basis: 33.333333% .

Can you mix grid and flexbox together?

Of course CSS grid and flexbox can work together in a layout. You can use flexbox inside CSS grid and vice versa. For instance, you could use flexbox to center an element like a button both vertically and horizontally within a particular grid cell (since centering with other CSS methods is … tricky).

What is 50% Flex CSS?

flex-basis defines the default size of an element before the remaining space is distributed. So in this case, you have defined all a children` to 50%.


1 Answers

I think float is a better option for you, check out this snippet:

.grid {
  width: 300px;
}

.box {
  background: orange;
  width: 90px;
  height: 90px;
  margin: 5px;
  float: left;
}

.wide {
  width: 190px;
}

.tall {
  height: 190px;
}

.empty {
  background: transparent
}


/* you can ignore everything after this comment - it's all for illustration */
body {
  background: #334;
  color: white;
  font-family: sans-serif;
}

.example {
  display: inline-block;
  margin: 5px;
  border: 1px solid #445;
  padding: 10px;

  width: 300px;
}

h3 {
  margin: 0 0 5px 0;
}
<div class="example">
  <h3>Example 1</h3>
  <div class="grid">
    <div class="box wide tall"></div>
    <div class="box tall empty"></div>
    <div class="box wide empty"></div>
    <div class="box"></div>
  </div>
</div>

<div class="example">
  <h3>Example 2</h3>
  <div class="grid">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
</div>

<div class="example">
  <h3>Example 4</h3>
  <div class="grid">
    <div class="box wide tall"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
</div>

Flex is still trying to make complete rows of elements, so your big square and your little square are part of one row; there's no support for stacking beyond that.

Float on the other hand tries to stuff elements wherever it can fit them.

EDIT

I've updated this answer with examples on how to reproduce most of the images above (I've purposefully left out the 2 by 2 example - didn't want to cloud the answer with classes for boxes of 1.5 height/width).

Use of an empty class to remove color from blocks, as well as classes tall and wide to fill in spots of all sizes should help you customize your layout however you see fit. One note - here empty sets the background color to transparent. Your empty class may do more or less than this. You may not even need an empty class if all it is is a div without content.

like image 87
Sandy Gifford Avatar answered Nov 22 '22 02:11

Sandy Gifford