2015/04/15
ECサイトでよくある横並びのリストのいろいろなコーディング方法
弊社でECサイトのシステムを扱っている事情、商品が並ぶリストをコーディングすることがあります。
まぁECサイトだけでなく、横並びのリストのパターンはよくあると思います。
いつもコーディングしていて簡単な方法がないかな〜と思って色々なやり方をやってみたりします。
それを今回まとめてみましたので、紹介したいと思います。
レスポンシブデザインにいいやつもあるかと思います。
1.ulを横幅をmargin分拡げ、overflowで消す
2.一番右端にclassを付ける
3.nth-childを使う
4.ulをマイナスマージンする
5.liを%で均等にわけ、paddingで余白を調整
上手いこと表現できないですね。。。
わからないと思います笑
デモをご覧ください!
(デモを見ても見た目は全部同じような感じなのでFirebugかなにかで)
下で簡単に説明をしたいと思いますが、
基本のHTMLは、以下になります。
cssはレスポンシブデザインを見越して、%で書けるところは%でやってます。
1 2 3 4 5 6 7 8 9 10 | <ul class="itemList"> <li><a href=""><figure><img src="images/item01.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item02.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item03.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item04.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item01.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item02.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item03.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> <li><a href=""><figure><img src="images/item04.jpg" alt=""></figure><p class="name">商品名商品名商品名</p><p class="price">5,272円</p></a></li> </ul> |
1.ulを横幅をmargin分拡げ、overflowで消す
これは当初からレスポンシブが出現するまで使っていた方法でした。
親の要素の幅:1000px
liの幅:235px
margin:20px(rightとbottomに)
基本の設定が上記になります。
このまま並べると、liとmarginを合わせると、
1020pxになってしまうので、ulをその値にし、
その親の要素を1000とし、overflow:hiddenで切ってしまいます。
そうすると上手いこと並んだリストになります。
cssは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | .section01 { overflow: hidden; max-width: 1000px; margin: 0 auto 3%; } .itemList { overflow: hidden; clear: both; width: 1020px; } .itemList li { float: left; width: 235px; margin: 0 20px 20px 0; } |
中身は省略させていただきます。上述しているHTMLにはありませんが、section01というclassで囲んでいます。
レスポンシブは逐一横幅を設定しないといけないので面倒くさいです。
2.一番右端にclassを付ける
基本の設定は1と同じです。
一番右の要素に、lastみたいなclassを付ける感じです。
classをつけることに、右のmarginを0にしちゃうものです。
この方法は最後の手段であまり使ったことはありません。
プログラム側も面倒くさいですし、レスポンシブさせる時も面倒くさいので。。。
とはいえ、他のECサイトでもこの方法は見かけたりもします。
cssは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 | .itemList { width: 100%; } .itemList li { float: left; width: 23.5%; margin: 0 2% 2% 0; } .itemList li.last { margin-right: 0; } |
これはレスポンシブさせるには正直向いてないかもしれません。
jQueryを使えばlastの位置を調節はできますが・・・
3.nth-childを使う
これ実はやったことないがありません笑
この擬似セレクタはIE9からの対応なので、
実際の案件ではまだ出来ません・・・
これでも出来るかもと思ってやってみました。
cssは以下になります。
1 2 3 4 5 6 7 | .itemList li { width: 23.5%; margin: 0 2% 2% 0; } .itemList li:nth-child(4n) { margin-right: 0; } |
一見よさそうなのですが、
レスポンシブのコーディングでやろうとするとちょっと面倒くさかったです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | @media screen and (max-width: 768px) { .itemList li { width: 32%; } .itemList li:nth-child(3n) { margin-right: 0; } .itemList li:nth-child(4n) { margin: 0 2% 2% 0; } } @media screen and (max-width: 480px) { .itemList li { width: 49%; } .itemList li:nth-child(4n) { margin: inherit; } .itemList li:nth-child(3n) { margin: 0 2% 2% 0; } .itemList li:nth-child(2n) { margin-right: 0; } } |
横並びのアイテムの数を変えようとすると、cssだけで済むのですがちょっとややこしい変更しないといけません。
4.ulをマイナスマージンする
これは他のwebサイトを見ていたら使っていた方法で、何回か使ったことがあります。
cssは以下のようになります。
1 2 3 4 5 6 7 8 | .itemList { margin: -20px 0 0 -20px; width: auto; } .itemList li { width: 235px; margin: 20px 0 0 20px; } |
1との違いは、marginの向きが逆なのと、
.itemListを1020pxといったように設定する必要がありません。
1よりはレスポンシブがやりやすいです。
5.liを%で均等にわけ、paddingで余白を調整
これは最近知った方法で、
liを個数分で割った%に設定し、余白はliの中で取るという方法です。
ちなみに、box-sizingのborder-boxを設定しています。
cssは以下のようになります。
1 2 3 4 5 | .itemList li { width: 25%; margin-bottom: 2%; padding: 0 0.98%; } |
これはレスポンシブ時も簡単で、
1 2 3 4 5 6 7 8 9 10 11 | @media screen and (max-width: 768px) { .itemList li { width: 33.3333%; } } @media screen and (max-width: 480px) { .itemList li { width: 50%; } } |
liの横幅を変更するだけでOKです!
ただ、ひとつ難点があり、
liの左右に余白を設定しているので、
一番左と一番右に隙間が開いているように見えてしまいます。
この場合は、コンテンツの横幅は1000pxにしたいので、
親の要素を1020px程度にして、10px分を0.98%として余白に設定し、
1000pxで見えるようにしています。
そして、見出し部分にも同じように設定して、隙間が開いているように見えないようにします。
レスポンシブさせるなら今のところこれがいいのかもと思いながら、
デザインと全くのズレなくコーディングするのはちょっと大変かもしれません。
一番何がいいというのは
その時のデザインによって変わるとも思いますので、
決めきれません。
いろんなパターンを知っておいてその時その時でベストな方法を取ればいいのかなと思います。
もちろんパターンはこれ以外にありますので、参考までに見て頂けれたら幸いです。
Author Profile
スターフィールド編集部
SHARE