[CSS]JavaScript無し、レスポンシブ対応、背景をコンテンツのスクロールに合わせて変更するスタイルシート
Post on:2012年11月13日
背景画像を表示サイズに合わせていっぱいに表示し、コンテンツのスクロールに合わせカーテンがめくれるように背景画像を変更するスタイルシートのチュートリアルを紹介します。
eBayで使用されているエフェクトです。
How to recreate the new e-bay site scrolling effect
デモ
デモは疑似要素を使用しているので、全てのモダンブラウザ、IE8+でご覧ください。
スクロールすると、カーテンを引き上げるように背景画像が表示されます。
次のコンテンツになると、別の背景画像が表示されます。
実装はレスポンシブ対応なので、表示サイズを変更してもOKです。
デモを幅1,500pxで表示
デモを幅780pxで表示
実装
実装は、5ステップです。
Step 1: 背景画像の用意
デモでは4つのコンテンツがあるので、3枚の背景画像を用意しています。一番大きい表示サイズを想定して、1,800x1,200pxの画像です。
Step 2: HTML
HTMLは非常にシンプルです。
4つの各コンテンツはrapperのclassを付与したdiv要素で配置し、header, section, section, footerで内包します。
<!DOCTYPE html> <html class="no-js" lang="en"> <head> <meta charset="utf-8"> <title>From love for lavender</title> ... </head> <body> <header class=" content"> <div class="wrapper"> <!-- ヘッダ 1つ目のコンテンツ --> </div> </header> <section class="content" id="oil"> <div class="wrapper"> <!-- 2つ目のコンテンツ --> </div> </section> <section class="content" id="culinary"> <div class="wrapper"> <!-- 3つ目のコンテンツ --> </div> </section> <footer> <div class=wrapper> <!-- フッタ 4つ目のコンテンツ --> </div> </footer> </body> </html>
Step 3: ベースとなるスタイルシート
まずは、各コンテンツのwrapperのスタイルです。
レスポンシブに対応するため、デフォルトの「box-model」が「content-box」にセットします。
.wrapper { width: 100%; margin: 0 auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
背景をセットし、数値の指定はレスポンシブ対応なので「%」にします。
数値は画像の高さが1,200pxなので、最初のセクションを500pxにする場合は、500/1200x100=で、41.66667%になります。
#oil .wrapper { background: url(../images/lavender2.jpg) 4.16667% center no-repeat; padding: 10% 4.16667% 10% 50%; background-size: 41.66667% auto;}
続いて、Media Queriesで、より大きいモニター用の指定をします。
@media only screen and (min-width: 1200px) { .wrapper { width:1200px; } ........ #oil .wrapper { padding: 120px 50px 120px 600px; }
Step 4: スクロールのエフェクト
スクロールのエフェクトはJavaScriptは使用せず、CSSのみで実現しています。また、余計なHTMLも使用しないようにするため、疑似要素を使用します。
section:after, header:after { content: ""; display: block; height: 400px; width: 100%; background-size: cover; background-position: center center; background-repeat: no-repeat; background-attachment: fixed; box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.6); }
各コンテンツごとに対応した背景画像を割り当てます。
header:after { background-image: url(../images/lavenderbg1.jpg); } #oil:after { background-image: url(../images/lavenderbg2.jpg); } #culinary:after { background-image: url(../images/lavenderbg3.jpg); } #dried:after { background-image: url(../images/lavenderbg4.jpg); }
Step 5: 仕上げ
「background-attachment:fixed」はSafariが非サポートなので、次のMedia Queriesを加えます。
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px), only screen and (min-device-width: 320px) and (max-device-width: 480px) { section:after, header:after { background-attachment: scroll; } }
また、より小さいモニターのために、フォントサイズを少し小さく表示します。
@media only screen and (max-width: 600px) { body { font-size: .75em; } }
sponsors