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 では再現する方法が思い浮かびません......