LoginSignup
1
3

More than 3 years have passed since last update.

CSSだけ使って、どんな画面サイズでも縦横比と余白を維持したいんじゃ

Posted at

やりたいこと

  • 画面サイズによってメインコンテンツの大きさを変えたいけど縦横比は維持したい。
  • メインコンテンツは画面から少しマージンを取る。画面からはみ出さないようにする。
  • JavaScript で画面のサイズを計算してやってもいいけど動きがモッサリだから CSS だけでやりたい。 image.png

やってみた

  • 縦と横の比は 4:3
  • 画面サイズの 95% を超えないようにする

この条件で実装してみました。
responsible.gif

実装方法

minvh 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;
}

説明

場合わけして考えてみます。

まずタテに長い画面の場合は・・・こうなってほしいですよね。
image.png

次にヨコに長い画面の場合は・・・こう。
image.png

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;
  }
}
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3