5000164 is here
2013-12-08

スクロールしてコンテンツが重なった部分にだけぼかしをかけているように見せる

きっかけ

iOS7って半透明のレイヤーの透過した部分だけぼかしがかかりますよね。

CSSでも同じことができないかなと思って調べました。

結論

現在のCSSではできない模様。

擬似的に実現

CSSにはblurというプロパティがあるのですが、このblurはコンテンツ全体にぼかしをかけます。

重なったレイヤーの透過した部分にだけぼかしをかける、といったことはできません。

なので、このblurをうまく使って一部だけのぼかしを擬似的に実現します。

デモ

See the Pen スクロールして重なった部分だけぼかし by SUGAWARA Hiroshi (@5000164) on CodePen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<p>
  このデモは-webkit-のベンダープレフィックスがついているのであしからず。
</p>

<h1>
  実装方法
</h1>

<p>
  まず、HTMLで同じ内容のコンテンツを2つ用意します。<br /> 次に、CSSで2つのコンテンツがきれいにくっつくように指定します。<br /> ポイントはoverflow-x: hidden;とoverflow-y: scroll;です。<br /> そうしたら、同じ内容のコンテンツの片方にblurをかけます。<br /> その次は、2つのコンテンツの表示位置を同じ高さに合わせます。<br /> ここではbeforeの擬似要素を使って高さを合わせています。<br /> 最後に、JavaScriptでスクロールを同期すれば完了です。
</p>

<h1>
  まとめ
</h1>

<p>
  スクロールの制御もJavaScriptでやってしまうと相性がいいのかも知れないと思いました。<br /> とりあえず、半透明のレイヤーの透過した部分にだけぼかしをかけるというCSSのプロパティが欲しいです。
</p>