Reputation: 1274
I'm trying to build a grid layout like Instagram search layout on mobile apps. I used grid but as you can see , after second big image it's getting messed up! I know what the problem is but can't solve that!!
here is html/css codes :
.grid-container {
direction: ltr;
width: 100%;
display: grid;
grid-template-columns: repeat(auto-fit, calc(100vw / 3));
grid-auto-rows: calc(100vw / 3);
grid-auto-flow: dense;
}
.grid-container .grid-item {
padding: 8px;
}
.grid-container .grid-item:nth-child(8n+2) {
grid-column: span 2;
grid-row: span 2;
}
.grid-container .grid-item .item {
width: 100%;
height: 100%;
background: rgb(255, 65, 65);
font-size: 22px;
font-family: 'Roboto';
}
<div class="grid-container">
<div class="grid-item">
<div class="item">1</div>
</div>
<div class="grid-item">
<div class="item">2</div>
</div>
<div class="grid-item">
<div class="item">3</div>
</div>
<div class="grid-item">
<div class="item">4</div>
</div>
<div class="grid-item">
<div class="item">5</div>
</div>
<div class="grid-item">
<div class="item">6</div>
</div>
<div class="grid-item">
<div class="item">7</div>
</div>
<div class="grid-item">
<div class="item">8</div>
</div>
<div class="grid-item">
<div class="item">9</div>
</div>
<div class="grid-item">
<div class="item">10</div>
</div>
<div class="grid-item">
<div class="item">11</div>
</div>
<div class="grid-item">
<div class="item">12</div>
</div>
<div class="grid-item">
<div class="item">13</div>
</div>
<div class="grid-item">
<div class="item">14</div>
</div>
<div class="grid-item">
<div class="item">15</div>
</div>
<div class="grid-item">
<div class="item">16</div>
</div>
<div class="grid-item">
<div class="item">17</div>
</div>
<div class="grid-item">
<div class="item">18</div>
</div>
<div class="grid-item">
<div class="item">19</div>
</div>
<div class="grid-item">
<div class="item">20</div>
</div>
<div class="grid-item">
<div class="item">21</div>
</div>
<div class="grid-item">
<div class="item">22</div>
</div>
<div class="grid-item">
<div class="item">23</div>
</div>
<div class="grid-item">
<div class="item">24</div>
</div>
<div class="grid-item">
<div class="item">25</div>
</div>
<div class="grid-item">
<div class="item">26</div>
</div>
<div class="grid-item">
<div class="item">27</div>
</div>
<div class="grid-item">
<div class="item">28</div>
</div>
<div class="grid-item">
<div class="item">29</div>
</div>
<div class="grid-item">
<div class="item">30</div>
</div>
<div class="grid-item">
<div class="item">31</div>
</div>
<div class="grid-item">
<div class="item">32</div>
</div>
<div class="grid-item">
<div class="item">33</div>
</div>
<div class="grid-item">
<div class="item">34</div>
</div>
<div class="grid-item">
<div class="item">35</div>
</div>
<div class="grid-item">
<div class="item">36</div>
</div>
<div class="grid-item">
<div class="item">37</div>
</div>
<div class="grid-item">
<div class="item">38</div>
</div>
<div class="grid-item">
<div class="item">39</div>
</div>
<div class="grid-item">
<div class="item">40</div>
</div>
<div class="grid-item">
<div class="item">41</div>
</div>
<div class="grid-item">
<div class="item">42</div>
</div>
<div class="grid-item">
<div class="item">43</div>
</div>
<div class="grid-item">
<div class="item">44</div>
</div>
<div class="grid-item">
<div class="item">45</div>
</div>
<div class="grid-item">
<div class="item">46</div>
</div>
</div>
the main problem is with nth-child(8n+2)
as the pattern for big section is: 2nd, 10th, 20th, 28th, 38th , ..... and nth-child(8n+2)
only hit 2nd, 10th, 18th, 26th, ...
so what should I do?? is there a way to reset grid pattern? or something like that?
Upvotes: 0
Views: 76
Reputation: 5084
You need to use 2 patterns:
18n+2
which will select 2, 20, 38...18n+10
which will select 10, 28, 46...Also, As stated by @tacoshy, you need to use grid-template-columns: repeat(3, 1fr);
to get the result, as shown in the picture.
.grid-container {
direction: ltr;
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: calc(100vw / 3);
grid-auto-flow: dense;
}
.grid-container .grid-item {
padding: 8px;
}
.grid-container .grid-item:nth-child(18n+2), .grid-container .grid-item:nth-child(18n+10){
grid-column: span 2;
grid-row: span 2;
}
.grid-container .grid-item .item {
width: 100%;
height: 100%;
background: rgb(255, 65, 65);
font-size: 22px;
font-family: 'Roboto';
}
<div class="grid-container">
<div class="grid-item">
<div class="item">1</div>
</div>
<div class="grid-item">
<div class="item">2</div>
</div>
<div class="grid-item">
<div class="item">3</div>
</div>
<div class="grid-item">
<div class="item">4</div>
</div>
<div class="grid-item">
<div class="item">5</div>
</div>
<div class="grid-item">
<div class="item">6</div>
</div>
<div class="grid-item">
<div class="item">7</div>
</div>
<div class="grid-item">
<div class="item">8</div>
</div>
<div class="grid-item">
<div class="item">9</div>
</div>
<div class="grid-item">
<div class="item">10</div>
</div>
<div class="grid-item">
<div class="item">11</div>
</div>
<div class="grid-item">
<div class="item">12</div>
</div>
<div class="grid-item">
<div class="item">13</div>
</div>
<div class="grid-item">
<div class="item">14</div>
</div>
<div class="grid-item">
<div class="item">15</div>
</div>
<div class="grid-item">
<div class="item">16</div>
</div>
<div class="grid-item">
<div class="item">17</div>
</div>
<div class="grid-item">
<div class="item">18</div>
</div>
<div class="grid-item">
<div class="item">19</div>
</div>
<div class="grid-item">
<div class="item">20</div>
</div>
<div class="grid-item">
<div class="item">21</div>
</div>
<div class="grid-item">
<div class="item">22</div>
</div>
<div class="grid-item">
<div class="item">23</div>
</div>
<div class="grid-item">
<div class="item">24</div>
</div>
<div class="grid-item">
<div class="item">25</div>
</div>
<div class="grid-item">
<div class="item">26</div>
</div>
<div class="grid-item">
<div class="item">27</div>
</div>
<div class="grid-item">
<div class="item">28</div>
</div>
<div class="grid-item">
<div class="item">29</div>
</div>
<div class="grid-item">
<div class="item">30</div>
</div>
<div class="grid-item">
<div class="item">31</div>
</div>
<div class="grid-item">
<div class="item">32</div>
</div>
<div class="grid-item">
<div class="item">33</div>
</div>
<div class="grid-item">
<div class="item">34</div>
</div>
<div class="grid-item">
<div class="item">35</div>
</div>
<div class="grid-item">
<div class="item">36</div>
</div>
<div class="grid-item">
<div class="item">37</div>
</div>
<div class="grid-item">
<div class="item">38</div>
</div>
<div class="grid-item">
<div class="item">39</div>
</div>
<div class="grid-item">
<div class="item">40</div>
</div>
<div class="grid-item">
<div class="item">41</div>
</div>
<div class="grid-item">
<div class="item">42</div>
</div>
<div class="grid-item">
<div class="item">43</div>
</div>
<div class="grid-item">
<div class="item">44</div>
</div>
<div class="grid-item">
<div class="item">45</div>
</div>
<div class="grid-item">
<div class="item">46</div>
</div>
</div>
Upvotes: 2
Reputation: 13002
Your issue is caused by this line:
.grid-container {
grid-template-columns: repeat(auto-fit, calc(100vw / 3));
}
change it to:
.grid-container {
grid-template-columns: repeat(3, 1fr);
}
auto-fit
and auto-fill
should be followed by a minmax
.
In my snippet this already solves the issue.
.grid-container {
direction: ltr;
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: calc(100vw / 3);
grid-auto-flow: dense;
}
.grid-container .grid-item {
padding: 8px;
}
.grid-container .grid-item:nth-child(8n+2) {
grid-column: span 2;
grid-row: span 2;
}
.grid-container .grid-item .item {
width: 100%;
height: 100%;
background: rgb(255, 65, 65);
font-size: 22px;
font-family: 'Roboto';
}
<div class="grid-container">
<div class="grid-item">
<div class="item">1</div>
</div>
<div class="grid-item">
<div class="item">2</div>
</div>
<div class="grid-item">
<div class="item">3</div>
</div>
<div class="grid-item">
<div class="item">4</div>
</div>
<div class="grid-item">
<div class="item">5</div>
</div>
<div class="grid-item">
<div class="item">6</div>
</div>
<div class="grid-item">
<div class="item">7</div>
</div>
<div class="grid-item">
<div class="item">8</div>
</div>
<div class="grid-item">
<div class="item">9</div>
</div>
<div class="grid-item">
<div class="item">10</div>
</div>
<div class="grid-item">
<div class="item">11</div>
</div>
<div class="grid-item">
<div class="item">12</div>
</div>
<div class="grid-item">
<div class="item">13</div>
</div>
<div class="grid-item">
<div class="item">14</div>
</div>
<div class="grid-item">
<div class="item">15</div>
</div>
<div class="grid-item">
<div class="item">16</div>
</div>
<div class="grid-item">
<div class="item">17</div>
</div>
<div class="grid-item">
<div class="item">18</div>
</div>
<div class="grid-item">
<div class="item">19</div>
</div>
<div class="grid-item">
<div class="item">20</div>
</div>
<div class="grid-item">
<div class="item">21</div>
</div>
<div class="grid-item">
<div class="item">22</div>
</div>
<div class="grid-item">
<div class="item">23</div>
</div>
<div class="grid-item">
<div class="item">24</div>
</div>
<div class="grid-item">
<div class="item">25</div>
</div>
<div class="grid-item">
<div class="item">26</div>
</div>
<div class="grid-item">
<div class="item">27</div>
</div>
<div class="grid-item">
<div class="item">28</div>
</div>
<div class="grid-item">
<div class="item">29</div>
</div>
<div class="grid-item">
<div class="item">30</div>
</div>
<div class="grid-item">
<div class="item">31</div>
</div>
<div class="grid-item">
<div class="item">32</div>
</div>
<div class="grid-item">
<div class="item">33</div>
</div>
<div class="grid-item">
<div class="item">34</div>
</div>
<div class="grid-item">
<div class="item">35</div>
</div>
<div class="grid-item">
<div class="item">36</div>
</div>
<div class="grid-item">
<div class="item">37</div>
</div>
<div class="grid-item">
<div class="item">38</div>
</div>
<div class="grid-item">
<div class="item">39</div>
</div>
<div class="grid-item">
<div class="item">40</div>
</div>
<div class="grid-item">
<div class="item">41</div>
</div>
<div class="grid-item">
<div class="item">42</div>
</div>
<div class="grid-item">
<div class="item">43</div>
</div>
<div class="grid-item">
<div class="item">44</div>
</div>
<div class="grid-item">
<div class="item">45</div>
</div>
<div class="grid-item">
<div class="item">46</div>
</div>
</div>
Upvotes: 2