システム屋さんが喜ぶ!?プログラムを意識した組み方

要素を繰り返して並べたい! そして3つ並べたら改行したいから3つおきにclassをつけたいけどシステム屋さんに吐き出してもらう部分だし・・・どうしよう!
そんな時に押さえておくべき組み方を紹介します。

目次

まずは完成イメージの確認

うぇぶの人オススメの方法はこちら

IE8まで対応が必要な方はこちら

ブロックをひたすら並べたいけど何個になるかわからない。そんなデザインです。
白いエリアの全体幅が680px(padding 20px 実質width 640px)、子要素の幅が200px、要素と要素の間の余白が20px

このデザインは3つで折り返しになってます。

駆け出しの時によくやる組み方

駆け出しの頃やりがちな組み方ですが、こんな風に組んでませんか?

完成イメージはこんな感じ

サンプルを別画面で開く

HTMLはこんな感じ

<div id="sample">
	<div>1つ目</div>
	<div>2つ目</div>
	<div class="no-margin">3つ目</div>
	<div>4つ目</div>
	<div>5つ目</div>
	<div class="no-margin">6つ目</div>
</div>

CSSはこんな感じ

#sample {
	width: 640px;
}
#sample div {
	margin:0 20px 20px 0;
	float: left;
	width: 200px;
}
#sample div.no-margin {
	margin-right: 0;
}

#sampleの全体の幅はぴったり640(divが200pxが3つ,余白が20pxが2つ)
classをつけたところのmargin-rightだけ0に戻してます。

見た目はできてますが、プログラムで繰り返し処理で出すとすると3つおきにclassをつける処理が必要になります。
1つ目と2つ目の間に新しい要素を追加する時にも、classを付け直さないといけません。

ついついプログラム経験がないとこういう組み方をしたりしてしまうことがありますよね。

ネガティブマージンを使った方法

html上のclassをなくしてしまえれば、動的に繰り返し処理で出しても、要素の間に新しい要素を追加しても順番を並び替えても特にきにすることがありません。

サンプルを別画面で開く

HTMLはこんな感じ

<div id="sample">
	<div>1つ目</div>
	<div>2つ目</div>
	<div>3つ目</div>
	<div>4つ目</div>
	<div>5つ目</div>
	<div>6つ目</div>
</div>

CSSはこんな感じ

#sample {
	margin-right: -20px;
	width: 660px;
}
#sample div {
	margin:0 20px 20px 0;
	float: left;
	width: 200px;
}

ポイントは親要素の#sampleのmargin-rightとwidthです。
#sampleの全体の幅は660(divが200pxが3つ,余白が20pxが3つ分の幅)
この指定だけだと想定している幅より溢れてしまいます。

そこで指定しているのがmargin-rightの値をマイナス指定。(余分な分の20pxをマイナスします)

nth-childを使った方法(1)

IE8の対応が不要な場合、nth-child(3)にmargin-rightを指定してしまえば、classをつけていた時と同じ指定でclassを減らすことができます。

サンプルを別画面で開く

HTMLはこんな感じ

<div id="sample">
	<div>1つ目</div>
	<div>2つ目</div>
	<div>3つ目</div>
	<div>4つ目</div>
	<div>5つ目</div>
	<div>6つ目</div>
</div>

CSSはこんな感じ

#sample {
	width: 640px;
}
#sample div {
	margin-bottom: 20px;
	float: left;
	width: 200px;
}
#sample div:nth-child(3n) {
	margin-right: 0;
}

nth-childを使った方法(2)

一度指定したものを上書きするのに抵抗がある方はこんな記述も

サンプルを別画面で開く

HTMLはこんな感じ

<div id="sample">
	<div>1つ目</div>
	<div>2つ目</div>
	<div>3つ目</div>
	<div>4つ目</div>
	<div>5つ目</div>
	<div>6つ目</div>
</div>

CSSはこんな感じ

#sample {
	width: 640px;
}
#sample div {
	margin-bottom: 20px;
	float: left;
	width: 200px;
}
#sample div:nth-child(3n+2) {
	margin: 0 20px 20px;
}

この記述で真ん中の列だけ左右に余白を取ってしまえば問題ありません。

色々なやり方があると思いますが、対応ブラウザ・組織でのルールを決めも考えると、一度指定したものを上書きする指定をするものより、オススメはこのやり方が良いかな?と思ってます。