2列で並ぶリストで最後に1つ余った際に幅100%に広げたい場合、幅100%用のclassを別途付与するでも実装はできますが、今回は個数が変動する場合を想定して、classを付与しない形での実装を試してみます。
サンプルコード
まずは対応前の2列のリストを実装してみます。
<ul class="nav"> <li class="nav_item"> <a class="nav_link" href="">HTML</a> </li> <li class="nav_item"> <a class="nav_link" href="">CSS</a> </li> <li class="nav_item"> <a class="nav_link" href="">JavaScript</a> </li> <li class="nav_item"> <a class="nav_link" href="">WordPress</a> </li> <li class="nav_item"> <a class="nav_link" href="">Movable Type</a> </li> <li class="nav_item"> <a class="nav_link" href="">PHP</a> </li> <li class="nav_item"> <a class="nav_link" href="">Python</a> </li> </ul>
.nav {
display: flex;
flex-wrap: wrap;
}
.nav_item {
width: 50%;
}
.nav_link {
display: block;
padding: 10px;
border-bottom: gray 1px solid;
}
余りがない場合は問題ないですが、最後の1つ余った時にも幅50%での表示になります。
対応前のデモページ
対応方法ですが、nth-child() と :last-child を使用します。
.nav {
display: flex;
flex-wrap: wrap;
}
.nav_item {
width: 50%;
}
.nav_item:nth-child(odd):last-child {
width: 100%;
}
.nav_link {
display: block;
padding: 10px;
border-bottom: gray 1px solid;
}
:nth-child(odd) で奇数を対象とした上で、:last-child でさらにその中から最後の要素のみを対象としています。
余りがない場合は最後の要素が偶数になるので、上記の設定は適用されません。
対応後のデモページ
同じ仕組みを使えば、3列以上の場合も対応できます。
.nav {
display: flex;
flex-wrap: wrap;
}
.nav_item {
width: 33.33333%;
}
/* 3列のリストで左の列が最後の場合 */
.nav_item:nth-child(3n + 1):last-child {
width: 100%;
}
/* 3列のリストで中央の列が最後の場合 */
.nav_item:nth-child(3n + 1):nth-last-child(2) { /* 最後のひとつ前の要素 */
width: 50%;
}
.nav_item:nth-child(3n + 2):last-child { /* 最後の要素 */
width: 50%;
}
.nav_link {
display: block;
padding: 10px;
border-bottom: gray 1px solid;
}
8〜11行目が余り1つの場合、12〜18行目が余り2つの場合になります。
余りが1つの場合は:nth-child(3n + 1) で左の列を対象とした上で、:last-child でさらにその中から最後の要素のみに幅100%を設定しています。
余りが2つの場合は:nth-child(3n + 1) と :nth-last-child(2) で左の列で最後から2番目の要素、:nth-child(3n + 2) と :last-child で中央の列で最後の要素に対して幅50%の設定になります。
3列の場合のデモページ
コメントが承認されるまで時間がかかります。