一言まとめ
ちょっとした工夫でposition : fixed;
でも、以下のことが可能。
position : fixed;
を設定した要素が、画面からはみ出てもスクロールできる- 背景 (body) のスクロールを止める
ちょっとしたモーダルウィンド(Modal Window)とか、別レイヤーで画面いっぱいに表示する場面って多々あると思います。
別レイヤーで、画面の縦横いっぱいに表示する時に使う手法は2つしかないです。
position : absolute;
position : fixed;
fixed
のほうが多用されているように思いますが、表示するコンテンツのサイズが大きい時にabsolute
を使う人も多いでしょう。おなじみの「LightBox」でもabsolute
使っていますよね?
absolute
を使う利点はあまりないと思いますが、十中八九、
「コンテンツが大きくて画面に収まらない時に、
fiexed
だとはみ出ている部分が見えないから…absolute
を使えば、スクロールして見ることができる。」
というのが主な理由だと思います。
実はちょっとした工夫でfiexed
でもコンテンツが画面からはみ出す場合にスクロールすることは可能です。
ゴール
ゴールはこんな感じです。
- 上下左右、中央揃え
- コンテンツが画面からはみ出したら、スクロールバーを表示
- モーダルウィンドウが開いている間に背景(body)のスクロールを止める
以下のデモで、「Open Modal」ボタンを押して、画面サイズをモーダルウィンドウよりも小さくしてみて下さい。
上下左右、中央揃え
今時だとflexboxですが、まだまだIEは消えない…
tableを使う手もありますが、アニメーションする時にバグったりしますので、とりあえず、オーソドックスにpositionとmarginで中央揃えします。中央揃えの記述はメディアクエリの中に書きます(後述)。
コンテンツが画面からはみ出したら、スクロールバーを表示
.my-modal { position: fixed; background-color: rgba(255, 255, 255, .8); top: 0; left: 0; right: 0; bottom: 0; display: none; overflow: auto; }
なんのことはない、overflow: auto;
を追加するだけです。
ただ、これだけだと、windowのスクロールバーと重なって、「二重スクロールバー」になってしまいます。
モーダルウィンドウが開いている間に背景(body)のスクロールを止める
body.no-scroll { overflow: hidden; }
bodyにno-scroll
というクラスを追加して、モーダルが開いている間にこのクラスをつけておけば、bodyのスクロールができなくします。
これでbodyのスクロールが消え、「二重スクロールバー」問題も解消できて、一石二鳥というわけです。
メディアクエリ
中央揃えにmarginとpositionを使っているので、画面がモーダルより小さくなった時、上下にずれてしまいます。
メディアクエリで、windowの横幅がモーダルの横幅より大きくなった時点と、windowの縦幅がモーダルの縦幅より大きくなった時点で、marginとpositionを設定するようにすればOKです。
@media only screen and (min-width: $modal-width) { .my-modal-content { left: 50%; margin-left: -#{$modal-width / 2}; } } @media only screen and (min-height: $modal-height) { .my-modal-content { top: 50%; margin-top: -#{$modal-height / 2}; } }
おしまい
今回紹介したTipsはあのBootstrapやPinterestでも使われています。シンプルではありますがかなり実用的です。初心者だと意外とハマったりしますので、転ばぬ先の杖としてご参考になって頂けたら幸いです!