CSS3のbox-shadow
プロパティではinset
という値を取ることができ、その場合ブロックの内側に影が付く。これをある工夫と共に利用すると写真の端に影がつけられる。更にradial-gradient
でセピア色のグラデーションを重ねてやれば、良い具合に古ぼけさせることもできるので、両方の効果を重ねてやればポラロイド写真風に見えないこともない?
Demo: Polaroid effects using inset box-shadow and radial-gradient
キモは以下のようにz-index
を使って画像を背面に回してやること。そうすれば親のブロック要素でのbox-shadow
やbackground-image
を画像の上に重ねることができる。
.polaroid {
float: left;
width: 400px;
height: 400px;
background-image: -webkit-gradient(radial, 50% 50%, 1, 50% 50%, 283, color-stop(0, rgba(112, 66, 20, 0.2)), color-stop(1, rgba(112, 66, 20, 0.4)));
background-image: -webkit-radial-gradient(rgba(112, 66, 20, 0.2), rgba(112, 66, 20, 0.4));
background-image: -moz-radial-gradient(rgba(112, 66, 20, 0.2), rgba(112, 66, 20, 0.4));
background-image: radial-gradient(rgba(112, 66, 20, 0.2), rgba(112, 66, 20, 0.4));
-webkit-box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.5);
-moz-box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.5);
box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.5);
}
.polaroid img {
position: relative;
z-index: -1;
}
box-shadow
の文法は以下の通りで、text-shadow
との違いはinset
で内側に影を作れることと、ぼかし以外に影のサイズを微調整することができること。
box-shadow: inset? <offset-x> <offset-y> <blur-radius>? <spread-radius>? <color>?;
ここではぼかしを40pxにしたがもっと少なくてもいいかもしれないが、少ないと縁が黒くなった感よりも凹んでいる感が強くなってしまう気がする。影の色はある程度透過させた色を指定しないと縁が真っ黒になってしまうので注意。
古びた感を出すために、rgb(112, 66, 20)
を適当に透過させてradial-gradient
で円形グラデーションを作りセピア色のフィルタの代わりにした。内から外へ少し濃くなっていくようにしたんだけど、逆な気がしてしょうがない。
Safari 5とかはまだだけどChrome 9あたりでは既に-webkit-(linear|radial)-gradient()
というCSS3の(linear|radial)-gradient()
と同じ文法のベンダー拡張が実装されているのでそれも併記しておいた。早い所-webkit-gradient()
書かなくて済むようになるといいな。
どっちかというとz-index
で写真を背面に回し、background-image
と重ねたりするといろいろ写真にエフェクトをかけられるよっていう話。