2つ前の記事、「Chrome Canary が dialog 要素に対応、ダイアログボックスの表示が簡単に」 で、::backdrop 疑似要素に色々スタイル当てて遊んでたとき、::backdrop 疑似要素に対しては半透明の白いレイヤーになるようにスタイル当てて、その上で、CSS filter プロパティを使って画面全体をぼやかしたら、iOS 7 (Windows Aero ...) とかで使われてる、所謂 「半透明ガラス」 っぽい効果が出せるんじゃね? と思ってやってみました。
実際に iPhone の Safari で表示してみた例が下記の画像です。
ただし、dialog 要素や ::backdrop 疑似要素を使っちゃうと、現時点では Chrome Canary で、さらにフラグを立てないと動作しないっていう、ほとんどの人が試せない状態になってしまうので、今回は div 要素を JavaScript と CSS でレイヤーっぽく表示する方法を採用しています。
これで、CSS filter プロパティに対応している (ベンダプレフィックスは必要だけど) Chrome や Safari であれば動作します。Opera も Opera Next であれば期待通りに動作するはず。
とりあえず、デモページを下記に置いておきます。最新の Chrome か Safari、あるいは Opera Next で確認してみてください。それ以外だと CSS filter プロパティが動作しないのでぼかしが適用されません。「Open Dialog」 を押せば半透明ガラス的なレイヤーが表示されます。
ソースコードの解説
HTML は単純です。初期表示のレイヤーと、ダイアログ表示時に上にかぶせるレイヤーの 2つをそれぞれ、div.background
、div.backdrop
として用意しています。
- <div class="background">
- <div>
- <button id="show">Open Dialog</button>
- </div>
- </div>
- <div class="backdrop">
- <button id="close">Close</button>
- </div>
CSS も特に難しいことはしていませんが、今回はブラウザウィンドウいっぱいにレイアウトしたかったので、下記のように div.background
内の div 要素に背景画像を指定し、ブラウザウィンドウサイズにフィットさせています。
- .background div {
- background: url(image.jpg) no-repeat center center fixed;
- background-size: cover;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- }
で、ダイアログの表示 / 非表示切り替えには jQuery を使用して簡単に。下記のような単純なソースコードで、ボタンクリック時に div.background
に対して dialog
という class 名を付与しています。
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
- <script>
- $('#show').click(function() {
- $('.background').addClass('dialog');
- });
- $('#close').click(function() {
- $('.background').removeClass('dialog');
- });
- </script>
そして、div.background
に対して dialog
という class 名が付いたときに、下記のスタイルが適用されるように指定します。
- .background.dialog {
- -webkit-filter: blur(10px);
- filter: blur(10px);
- }
- .background.dialog #show {
- display: none;
- }
- .background.dialog + .backdrop {
- display: block;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(255, 255, 255, 0.3);
- }
filter プロパティについて
filter プロパティは、Filter Effects 1.0 仕様内で策定が進められている CSS プロパティで、要素に対して様々なエフェクトをかけることができます。
現在の仕様では、下記のようなフィルターが定義されています。
grayscale()
: グレースケールsepia()
: セピアsaturate()
: 彩度hue-rotate()
: 色相(色相環の回転)invert()
: 反転opacity()
: 透明度brightness()
: 明るさcontrast()
: コントラストblur()
: ぼかしdrop-shadow()
: ドロップシャドウcustom()
: カスタムエフェクト
わかりやすいところでいうと、filter: opacity(50%);
のように指定することで、opacity: 0.5;
と指定したのと同じようなエフェクトを適用できます。
今回使用したのは、ぼかしを適用する blur()
です。具体的な指定は下記の通り。
- .background.dialog {
- -webkit-filter: blur(10px);
- filter: blur(10px);
- }
ダイアログが開いた状態で、div.background
をぼかします。これに背景色を半透明の白色にした div.backdrop
を重ねてやることで、半透明ガラスのような効果を出します。
ということで、あとはデモページのソースコードを見ていただければわかると思いますので、試してみてください。
たいして検証せずに短時間で書いてるのでソースコード的にはあまりきれいじゃないとは思いますが、応用すれば色々とできそうですし、何かしらのヒントになれば幸いです。
dialog 要素や ::backdrop 疑似要素が使えるようになれば
::backdrop 疑似要素が使える環境であれば、dialog
という class 名を付ける対象を html 要素にしてしまって、下記のように指定すれば、画面全体をぼかすことができるので楽です。
- html.dialog {
- -webkit-filter: blur(10px);
- filter: blur(10px);
- }
- dialog::backdrop {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(255, 255, 255, 0.3);
- }
ただ、iOS 7 のコントロールセンターように、画面の半分だけに半透明のガラスレイヤーをかぶせた感じとかは、ちょっと再現が難しいというか、CSS では再現する方法が思い浮かびません......