やりたいこと
- 画面サイズによってメインコンテンツの大きさを変えたいけど縦横比は維持したい。
- メインコンテンツは画面から少しマージンを取る。画面からはみ出さないようにする。
- JavaScript で画面のサイズを計算してやってもいいけど動きがモッサリだから CSS だけでやりたい。
やってみた
- 縦と横の比は
4:3
- 画面サイズの
95%
を超えないようにする
実装方法
min
と vh
vw
を組み合わせたらスッキリ書けました。実質2行。
<div class="content">
<div class="box"></div>
</div>
/* メインコンテンツ */
.box {
background: #eee;
width: min(95vw, 95vh * 0.75); /* 横幅の計算 */
height: min(95vh, 95vw / 0.75); /* 縦幅の計算 */
}
/* ※中央寄せしたいだけなので、ここから先は本題と関係ない */
html,body, .content {
width: 100%;
height: 100%;
background: #263238;
}
.content {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
説明
場合わけして考えてみます。
min
関数を使うと、引数のうち小さい方を採用してくれるので、画面幅の95%を超えないように抑えてくれます。
.box {
background: #eee;
width: min(95vw, 95vh * 0.75);
height: min(95vh, 95vw / 0.75);
}
95%
ではなく、かならず画面端から 20px
離したいというときはこう書きます。
.box {
background: #eee;
width: min(100vw - 20px, (100vh - 20px) * 0.75);
height: min(100vh - 20px, (100vw - 20px) / 0.75);
}
補足
メディアクエリでタテ長の場合とヨコ長の場合で分けて書いても構いません。
(こっちのほうがわかりやすいですね)
/* 縦長の場合 */
@media screen and (orientation: portrait) {
.box {
width: 95vw;
height: calc(95vw / 0.75);
}
}
/* 横長の場合 */
@media screen and (orientation: landscape) {
.box {
width: calc(95vh * 0.75);
height: 95vh;
}
}