Mojtaba Barari
Mojtaba Barari

Reputation: 1274

select nth-child based on n css

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!!

enter image description here

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

Answers (2)

TechySharnav
TechySharnav

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

tacoshy
tacoshy

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

Related Questions