Issue
I have a gallery layout, and I want to separate every box with margin. The problem is the last box in every row is not align with the grid; there is still space on the right side, how can I do this without using padding? ( that will force me to add another wrapper div )
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
ul {
list-style-type: none;
}
.flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.align-center {
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
}
.space-between {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
}
.container {
max-width: 1000px;
margin: 0 auto;
height: 100%;
padding: 0 1em;
border: 1px solid;
}
nav {
background: #464646;
height: 70px;
}
.box {
background: lightblue;
padding: 1em;
-webkit-box-flex: 0;
-webkit-flex: 0 0 calc(50% - 1em);
-ms-flex: 0 0 calc(50% - 1em);
flex: 0 0 calc(50% - 1em);
text-align: center;
margin-right: 1em;
margin-bottom: 1em;
}
<nav>
<div class="container flex align-center space-between">
<ul>
<li>Logo</li>
</ul>
<ul>
<li>Home</li>
</ul>
</div>
</nav>
<div class="container">
<header>
<h1>Header</h1>
</header>
</div>
<div class="container">
<div class="gallery flex">
<div class="box">BOX 1</div>
<div class="box">BOX 2</div>
<div class="box">BOX 3</div>
</div>
</div>
Note: I can't use flex grow: 1 because I don't always have two boxes in a row.
I can't use space between because the grid is dynamic so for example If the width of the box is 33.33% and you have five boxes, the second row will be with two boxes one on the left side and second on the right side.
Solution
Method # 01:
Add following css on parnet and child respectively (This method will work only when there are only 2 boxes in a row):
/* For Parent Element */
.flex {
justify-content: space-between;
}
/* For Child Element */
.flex-child {
flex: 0 0 calc(50% - 0.5em);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
ul {
list-style-type: none;
}
.flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.align-center {
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
}
.space-between {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
}
.container {
max-width: 1000px;
margin: 0 auto;
height: 100%;
padding: 0 1em;
border: 1px solid;
}
nav {
background: #464646;
height: 70px;
}
.box {
background: lightblue;
padding: 1em;
-webkit-box-flex: 0;
-webkit-flex: 0 0 calc(50% - 0.5em);
-ms-flex: 0 0 calc(50% - 0.5em);
flex: 0 0 calc(50% - 0.5em);
text-align: center;
margin-bottom: 1em;
}
<nav>
<div class="container flex align-center space-between">
<ul>
<li>Logo</li>
</ul>
<ul>
<li>Home</li>
</ul>
</div>
</nav>
<div class="container">
<header>
<h1>Header</h1>
</header>
</div>
<div class="container">
<div class="gallery flex space-between">
<div class="box">BOX 1</div>
<div class="box">BOX 2</div>
<div class="box">BOX 3</div>
<div class="box">BOX 4</div>
<div class="box">BOX 5</div>
<div class="box">BOX 6</div>
<div class="box">BOX 7</div>
<div class="box">BOX 8</div>
<div class="box">BOX 9</div>
</div>
</div>
Method # 02:
- Add margin on both sides of child elements.
- Extend parent from left/right with same amount of negative margin.
Note: Add overflow: hidden
on parent of .gallery
if horizontal scroll appears.
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
ul {
list-style-type: none;
}
.flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0 -0.5em;
}
.align-center {
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
}
.space-between {
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
}
.container {
max-width: 1000px;
margin: 0 auto;
height: 100%;
padding: 0 1em;
border: 1px solid;
}
nav {
background: #464646;
height: 70px;
}
.box {
background: lightblue;
padding: 1em;
-webkit-box-flex: 0;
-webkit-flex: 0 0 calc(50% - 1em);
-ms-flex: 0 0 calc(50% - 1em);
flex: 0 0 calc(50% - 1em);
text-align: center;
margin: 0 0.5em 1em;
}
<nav>
<div class="container flex align-center space-between">
<ul>
<li>Logo</li>
</ul>
<ul>
<li>Home</li>
</ul>
</div>
</nav>
<div class="container">
<header>
<h1>Header</h1>
</header>
</div>
<div class="container">
<div class="gallery flex">
<div class="box">BOX 1</div>
<div class="box">BOX 2</div>
<div class="box">BOX 3</div>
</div>
</div>
Answered By - Mohammad Usman
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.