88
88

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Monstar Lab, Inc.Advent Calendar 2016

Day 23

レスポンシブにも対応・CSSでフルスクリーンレイアウト

Last updated at Posted at 2016-12-24

最近綺麗な画像を活用したフルスクリーンレイアウトのwebサイトが増えていますね!
私も最近、フルスクリーンレイアウトを実装することがあったのでその話をします。
今回は背景画像が全画面に表示され、コンテンツが縦横中央に配置されるだけのシンプルなレイアウトです。

Demo:
https://codepen.io/omaemi/full/rWgBGW/

".box" が画面フルサイズの要素で、".box" 直下の要素を縦横中央に配置します。

<div class="page">
  <div class="box"> // 画面フルサイズの要素 
    
    // 中央寄せされるコンテンツ
    <p>
      LOREM IPSUM DOLOR SIT AMET,... 
    <p>

  </div>
  <div class="box"> 
  </div>
  .
  .

手順は以下の3つです。

  1. 画面サイズいっぱいの要素 ".box" を作る
  2. ".box" に背景画像を指定する
  3. コンテンツの中身を縦横中央に配置する

1. 画面サイズいっぱいの要素 ".box" を作る

ここで使うのがvw(viewport width), vh(viewport height)という単位です。
これを使えばviewportをもとにサイズを指定でき、
画面サイズの幅=100vw
画面サイズの高さ=100vh
が指定できます。画面サイズ半分の高さなら50vh。

vw, vhのブラウザ対応状況
・Can I Use
http://caniuse.com/#search=vw

これを知らない時はjsでウィンドウの高さをとってたなあ(遠い目)

ということで ".box" に100vh, 100vwを指定します。

.box {
  width: 100vw;
  height: 100vh;
}

デザインによってはこれでも良いのですが、スマホなど小さいウィンドウで見た時に100vhをはみ出てしまうことがある場合はmin-height: 100vh;とします。

.box {
  width: 100vw;
  height: auto;
  min-height: 100vh;
}

2. ".box" に背景画像を指定する

".box" のサイズいっぱいに背景画像を表示させるため

background-size: cover;

を指定します。(縦横どちらかはみ出た方が切り取られる)

また、画像の中央を表示させます。

background-position: center;

.box {
  background-size: cover;
  background-position: center;
  background-image: url('http://placeimg.com/850/530/animals');
}

3. コンテンツの中身を縦横中央に配置する

縦横中央に配置するために使うのがflexboxです。
画面サイズの要素 ".box" に対して、以下のプロパティを書くだけで、要素 ".box" 直下のコンテンツが縦横中央寄せされます。

.box {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  
  /* 左右中央寄せ */
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: center;
  
  /* 上下中央寄せ */
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;

ちなみに左右は

justify-content: flex-start; // 左寄せ
justify-content: center; // 中央寄せ
justify-content: flex-end; // 右寄せ
```

上下は

align-items: flex-start; // 上寄せ
align-item: center; // 中央寄せ
align-item: flex-end; // した寄せ

で調整できます。

```position: absolute;```などで上下中央寄せするより直感的だし、absoluteだとコンテンツの量が多いと親要素からはみ出てしまうことがあるので、flexboxを使うことをオススメします!


flexboxのブラウザ対応状況
・Can I Use 
http://caniuse.com/#search=flexbox



あとはスマホで見た時、コンテンツが多い時にもギチギチになってしまわないように、paddingをしっかりとって終わりです!

```
.box {
  padding: 30px;
  box-sizing: border-box;
}
```

あと、どうやらiOSでiframeのスクロールが効かない問題があるらしく、".box" の親要素 ".page"に

```
.page {
  height: 100vh;
  overflow: scroll;
}
```
を指定していますが、iframeで埋め込まない場合はおそらくこれはなくてOKです!

ソースコード:
https://codepen.io/omaemi/pen/rWgBGW/


遅れてしまってすいませんでした。
メリークリスマスイブ☆
88
88
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
88
88

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?