1

I have a simple grid layout created with flex, I want to have a grid of 3x3 blocks with a margin between each block.

If I add a margin it makes it 2x5.

How can I have it 3x3 with a margin between each block

.wrap{
  max-width: 1000px;
  border: 1px solid #ddd;
  display: flex;
  flex-wrap: wrap;
}

.block{
  width: 33%;
  height: 100px;
  border: 1px solid red;
  margin: 5px;
}
<div class="wrap">
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
</div>
Paulie_D
  • 102,164
  • 10
  • 117
  • 144
lomine
  • 305
  • 3
  • 7
  • 26

2 Answers2

4

You can get your desired result by using a flexbox property justify-content: space-between; which takes up the remaining space of the elements and spreads that between them

so all I did is made the width slightly smaller than 33% so we have remaining space and added justify-content: space-between; to the wrapper

.wrap{
  max-width: 1000px;
  border: 1px solid #ddd;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}

.block{
  width: 30%;
  height: 100px;
  border: 1px solid red;
  margin-bottom: 15px;
}
<div class="wrap">
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
</div>
Nico Shultz
  • 1,827
  • 1
  • 8
  • 22
1

You can use the calc function to subtract the margin (10px = 5px on each side) and also specify box-sizing: border-box on all your HTML elements so you don't have to include the border in your calculations.

* {
  box-sizing: border-box
}

.wrap{
  max-width: 1000px;
  border: 1px solid #ddd;
  display: flex;
  flex-wrap: wrap;
}

.block{
  width: calc(33.3333% - 10px);
  height: 100px;
  border: 1px solid red;
  margin: 5px;
}
<div class="wrap">
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
</div>
Robert Cooper
  • 2,022
  • 1
  • 6
  • 19