Welcome back! Just as in ancient Egypt there had to be proper spacing between hieroglyphs for readability, in modern CSS we need elegant spacing between elements. Meet the gap property - a modern and clean way to create spacing in Flexbox!
Gap is a modern CSS property (widely supported since 2021) that creates spacing between flex elements without using margin!
1/* Old way - complicated and problematic */
2.container {
3 display: flex;
4 margin: -10px; /* Negative margin on container */
5}
6
7.item {
8 margin: 10px; /* Margin on each element */
9}
10
11/* Problem: Margin is also on the outer edges! */1/* New way - clean and simple */
2.container {
3 display: flex;
4 gap: 20px; /* Spacing only BETWEEN elements */
5}
6
7.item {
8 /* No margin needed! */
9}
10
11/* Gap does NOT add spacing on the outer edges! */Egyptian analogy: Gap is like the perfect spacing between hieroglyphs carved by a master - precise, even, and without unnecessary extra spaces.
1/* One dimension - same spacing horizontally and vertically */
2.container {
3 gap: 20px;
4}
5
6/* Two dimensions - row-gap and column-gap */
7.container {
8 gap: 20px 40px; /* 20px vertically, 40px horizontally */
9}
10
11/* Or separately */
12.container {
13 row-gap: 20px;
14 column-gap: 40px;
15}1/* flex-direction: row (default) */
2.container-row {
3 display: flex;
4 flex-direction: row;
5 gap: 20px; /* Spacing between elements horizontally */
6}
7
8/* flex-direction: column */
9.container-column {
10 display: flex;
11 flex-direction: column;
12 gap: 20px; /* Spacing between elements vertically */
13}
14
15/* flex-wrap: wrap */
16.container-wrap {
17 display: flex;
18 flex-wrap: wrap;
19 gap: 20px; /* Spacing between rows AND columns */
20}1<div class="card-grid">
2 <div class="card">Card 1</div>
3 <div class="card">Card 2</div>
4 <div class="card">Card 3</div>
5 <div class="card">Card 4</div>
6 <div class="card">Card 5</div>
7 <div class="card">Card 6</div>
8</div>1.card-grid {
2 display: flex;
3 flex-wrap: wrap;
4 gap: 20px; /* Perfect spacing between cards */
5}
6
7.card {
8 flex: 0 0 calc(33.333% - 14px); /* 3 columns */
9 /* calc accounts for gap: (40px total gap / 3 columns) ~ 14px */
10 padding: 20px;
11 background: #3498db;
12 color: white;
13 border-radius: 8px;
14}
15
16@media (max-width: 768px) {
17 .card {
18 flex: 0 0 calc(50% - 10px); /* 2 columns on tablet */
19 }
20}
21
22@media (max-width: 480px) {
23 .card {
24 flex: 0 0 100%; /* 1 column on mobile */
25 }
26}Gap math for multi-column:
calc(33.333% - 13.333px)calc(25% - 15px)calc(100% / n_columns - gap * (n_columns - 1) / n_columns)1<div class="button-group">
2 <button class="btn">Cancel</button>
3 <button class="btn btn-primary">Save</button>
4 <button class="btn btn-danger">Delete</button>
5</div>1.button-group {
2 display: flex;
3 gap: 10px; /* Equal spacing between buttons */
4 justify-content: flex-end;
5}
6
7.btn {
8 padding: 10px 20px;
9 border: 1px solid #ddd;
10 background: white;
11 cursor: pointer;
12 border-radius: 4px;
13}
14
15.btn-primary {
16 background: #3498db;
17 color: white;
18}
19
20.btn-danger {
21 background: #e74c3c;
22 color: white;
23}1<form class="form">
2 <div class="form-row">
3 <input type="text"
4## Practical Application
5
6Practice this concept in the editor below.
7 <input type="text"
8## Practical Application
9
10Practice this concept in the editor below.
11 </div>
12 <input type="email"
13## Practical Application
14
15Practice this concept in the editor below.
16 <textarea
17## Practical Application
18
19Practice this concept in the editor below.
20 <button type="submit">Send</button>
21</form>1.form {
2 display: flex;
3 flex-direction: column;
4 gap: 15px; /* Spacing between form fields */
5 max-width: 500px;
6}
7
8.form-row {
9 display: flex;
10 gap: 15px; /* Spacing between fields in a row */
11}
12
13.form input,
14.form textarea {
15 padding: 10px;
16 border: 1px solid #ddd;
17 border-radius: 4px;
18 font-family: inherit;
19}
20
21.form-row input {
22 flex: 1; /* Equal width */
23}
24
25.form textarea {
26 min-height: 100px;
27 resize: vertical;
28}
29
30.form button {
31 padding: 12px;
32 background: #3498db;
33 color: white;
34 border: none;
35 border-radius: 4px;
36 cursor: pointer;
37 align-self: flex-start;
38}1<nav class="navbar">
2 <div class="nav-brand">Logo</div>
3 <ul class="nav-menu">
4 <li><a href="#">Home</a></li>
5 <li><a href="#">About</a></li>
6 <li><a href="#">Services</a></li>
7 <li><a href="#">Contact</a></li>
8 </ul>
9 <div class="nav-actions">
10 <button>Login</button>
11 <button class="btn-primary">Sign Up</button>
12 </div>
13</nav>1.navbar {
2 display: flex;
3 align-items: center;
4 padding: 15px 30px;
5 background: #2c3e50;
6 gap: 30px; /* Spacing between main sections */
7}
8
9.nav-brand {
10 font-size: 1.5em;
11 font-weight: bold;
12 color: goldenrod;
13}
14
15.nav-menu {
16 display: flex;
17 list-style: none;
18 margin: 0;
19 padding: 0;
20 gap: 20px; /* Spacing between links */
21 flex: 1; /* Take up the middle */
22}
23
24.nav-menu a {
25 color: white;
26 text-decoration: none;
27 transition: color 0.3s;
28}
29
30.nav-menu a:hover {
31 color: goldenrod;
32}
33
34.nav-actions {
35 display: flex;
36 gap: 10px; /* Spacing between buttons */
37}
38
39.nav-actions button {
40 padding: 8px 16px;
41 border: 1px solid white;
42 background: transparent;
43 color: white;
44 cursor: pointer;
45 border-radius: 4px;
46}
47
48.nav-actions .btn-primary {
49 background: goldenrod;
50 border-color: goldenrod;
51 color: #2c3e50;
52}1<div class="dashboard">
2 <aside class="sidebar">
3 <div class="sidebar-item">Dashboard</div>
4 <div class="sidebar-item">Analytics</div>
5 <div class="sidebar-item">Settings</div>
6 </aside>
7 <main class="dashboard-main">
8 <header class="dashboard-header">Header</header>
9 <div class="dashboard-content">
10 <div class="widget">Widget 1</div>
11 <div class="widget">Widget 2</div>
12 <div class="widget">Widget 3</div>
13 <div class="widget">Widget 4</div>
14 </div>
15 </main>
16</div>1.dashboard {
2 display: flex;
3 gap: 20px; /* Spacing between sidebar and main */
4 height: 100vh;
5 padding: 20px;
6}
7
8.sidebar {
9 display: flex;
10 flex-direction: column;
11 gap: 10px; /* Spacing between items */
12 flex: 0 0 250px;
13 background: #34495e;
14 padding: 20px;
15 border-radius: 8px;
16}
17
18.sidebar-item {
19 padding: 12px;
20 background: #2c3e50;
21 color: white;
22 border-radius: 4px;
23 cursor: pointer;
24}
25
26.dashboard-main {
27 flex: 1;
28 display: flex;
29 flex-direction: column;
30 gap: 20px; /* Spacing between header and content */
31}
32
33.dashboard-header {
34 flex: 0 0 auto;
35 padding: 20px;
36 background: white;
37 border-radius: 8px;
38 box-shadow: 0 2px 4px rgba(0,0,0,0.1);
39}
40
41.dashboard-content {
42 flex: 1;
43 display: flex;
44 flex-wrap: wrap;
45 gap: 20px; /* Spacing between widgets */
46}
47
48.widget {
49 flex: 0 0 calc(50% - 10px); /* 2 columns */
50 min-height: 200px;
51 padding: 20px;
52 background: white;
53 border-radius: 8px;
54 box-shadow: 0 2px 4px rgba(0,0,0,0.1);
55}margin: auto for centering1/* Gap for internal spacing */
2.container {
3 display: flex;
4 gap: 20px;
5 padding: 20px; /* Internal margin from the edge */
6}
7
8/* Margin for external spacing */
9.container {
10 margin: 40px auto; /* Center the container */
11}
12
13/* Combination */
14.card {
15 /* Gap removes the need for margin between items */
16 /* but margin-top can be used for a specific purpose */
17 margin-top: auto; /* Push to bottom in flex column */
18}1.container {
2 display: flex;
3 flex-wrap: wrap;
4 gap: 30px;
5}
6
7@media (max-width: 1024px) {
8 .container {
9 gap: 20px; /* Smaller gap on tablet */
10 }
11}
12
13@media (max-width: 768px) {
14 .container {
15 gap: 15px; /* Even smaller on mobile */
16 }
17}
18
19/* Or with CSS variables */
20:root {
21 --gap-large: 30px;
22 --gap-medium: 20px;
23 --gap-small: 15px;
24}
25
26.container {
27 gap: var(--gap-large);
28}
29
30@media (max-width: 768px) {
31 :root {
32 --gap-large: var(--gap-medium);
33 }
34}Gap in Flexbox is supported since:
Fallback for old browsers:
1.container {
2 display: flex;
3 /* Fallback with margin */
4 margin: -10px;
5}
6
7.item {
8 margin: 10px;
9}
10
11/* Modern browsers override */
12@supports (gap: 20px) {
13 .container {
14 gap: 20px;
15 margin: 0;
16 }
17
18 .item {
19 margin: 0;
20 }
21}Gap:
Advantages:
When to use:
Remember: Gap is like the perfect spacing between hieroglyphs in an Egyptian papyrus - precise, even, and without complications!