2020.10.16

HTML・CSS

flexboxでCSSのwidthプロパティにcalcを利用

769px以上:4カラム・768px以下:3カラム

flexboxでCSSのwidthプロパティにcalcを利用します。以下のhtml構造でテストします。デモページではクラス名boxのdivタグは12個並べています。全てのdivタグの間に10pxの余白があります。

<div class="container">
	<div class="box">
		<img src="images/photo01.jpg" alt="">
		<h3>タイトル01</h3>
		<p>ダミーテキストダミーテキスト</p>
	</div>
	<div class="box">
		<img src="images/photo02.jpg" alt="">
		<h3>タイトル02</h3>
		<p>ダミーテキストダミーテキスト</p>
	</div>
	<div class="box">
		<img src="images/photo03.jpg" alt="">
		<h3>タイトル03</h3>
		<p>ダミーテキストダミーテキスト</p>
	</div>
	<div class="box">
		<img src="images/photo04.jpg" alt="">
		<h3>タイトル04</h3>
		<p>ダミーテキストダミーテキスト</p>
	</div>
</div>

ブラウザ幅769px以上で4カラム・768px以下で3カラムにする場合です。
まずクラス名boxのdivタグにwidth: calc(25% - 30px / 4);を指定します。全ての余白の合計30pxを4カラムで割って、1つのdivタグの横幅25%から差し引きます。また、.box:nth-child(4n)で4の倍数のdivタグの右マージンを0にします。
次にメディアクエリで768px以下の設定をします。クラス名boxのdivタグにwidth: calc(100% / 3 - 20px / 3);を指定します。全ての余白の合計20pxを3カラムで割って、1つのdivタグの横幅100% / 3から差し引きます。また、.box:nth-child(3n)で3の倍数のdivタグの右マージンを0にして、4の倍数のdivタグの右マージンは元に戻します。ただしこの指定のままでは12番目のdivタグの右マージンに4の倍数のdivタグの右マージンが設定されてしまうため、.box:nth-child(12)で12番目のdivタグの右マージンを0にします。

.container {
	display: flex;
	flex-wrap: wrap;
	justify-content: flex-start;
}
.box {
	width: calc(25% - 30px / 4);
	margin: 0 10px 10px 0;
	border: 1px solid #ddd;
	background: #fff;
}
.box:nth-child(4n) {
	margin: 0 0 10px 0;
}
@media screen and (max-width: 768px) {
	.box {
		width: calc(100% / 3 - 20px / 3);
	}
	.box:nth-child(3n) {
		margin: 0 0 10px 0;
	}
	.box:nth-child(4n) {
		margin: 0 10px 10px 0;
	}
	.box:nth-child(12) {
		margin: 0 0 10px 0;
	}
}

なお、カラム数が変更になってもこの方法を利用して横幅と余白を設定すれば、カラム落ちすることなく対応できます。

769px以上:3カラム・768px以下:2カラム
769px以上:2カラム・768px以下:1カラム
769px以上:5カラム・768px以下:3カラム

関連記事

2020.09.07

HTML・CSS

animation-fill-modeの指定について

animation-fill-modeプロパティはCSSアニメーション実行後、対象要素にどのようなスタイルを適用するか設定します。animation-fill-…

2020.08.19

HTML・CSS

iOS Safariのツールバーと表示エリアの挙動

iOS Safariで表示される画面下部のツールバーは、下にスクロールすると非表示になります。正確には上部のアドレスバーが小さくなり、下部のツールバーが消えます…

2022.08.30

HTML・CSS

linear-gradientを利用した文字の下線

background-imageプロパティのlinear-gradientを利用して複数行の文字に下線を引きます。複数行に対応させるため、inline要素に適用…

2021.02.02

HTML・CSS

flex-growプロパティを利用した横並びのリスト

flex-growプロパティを利用して、左右にボーダーのある横並びのリストを作ります。リスト内のテキストの文字数が異なる場合でも、簡単にレスポンシブ対応できます…

2020.07.18

HTML・CSS

CSSアニメーションで画像を横スクロール無限ループ

CSSアニメーションで画像を横スクロール無限ループさせます。まずhtmlのコードです。同じ画像を2つ配置して、クラス名loop_wrapのdivタグで囲います。…

上に戻る