CSSには、要素に影をつけることができるbox-shadow
プロパティが存在します。
このプロパティを使うことで、以下の例のように影のエフェクトを実装することができますね。
しかしこのbox-shadow
プロパティでは、グラデーションカラーの影をつけることができません。
そこで今回の記事では、CSSプロパティfilter
のblur()
関数を使用して、グラデーションの影を実装する方法を紹介します!
以下が今回の実装DEMOです。
要素の下にグラデーションカラーの影が付いているのが確認できますね。
IEや一部ブラウザの古いバージョンではfilter
プロパティが効かないため、filter
に対応していないブラウザでは代替案として薄い黒の影をつけています。
コピペ用の実装コードの紹介や各コードの解説、さらに@supports
でfilter
に対応していないブラウザ対策も説明していきますので、ぜひ参考にしてみてください。
【コピペ用】グラデーションの影の実装コード
以下のHTML・CSSをコピペすることで、すぐにグラデーション色の影を実装することができます。
<div class="box">Gradient Shadow</div>
/* box本体 */
.box {
position: relative;
width: 400px;
height: 250px;
display: flex;
align-items: center;
justify-content: center;
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%);
color: #fff;
font-weight: bold;
}
/* boxの影 (filterプロパティ未対応のブラウザ) */
.box::before {
content: "";
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
box-shadow: 0 20px 20px rgba(0, 0, 0, 0.16); /* filterが効かない場合黒い影をつける */
z-index: -1;
}
/* boxの影 (filterプロパティ対応済のブラウザ) */
@supports (-webkit-filter: blur(20px)) {
.box::before {
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%);
-webkit-filter: blur(20px);
filter: blur(20px);
transform: translateY(20px);
box-shadow: none;
}
}
filter
に対応しているブラウザではグラデーションの影が、未対応のブラウザではbox-shadow
を適用して薄い黒の影がつくようになっています。
次で実装コードの解説をしていきますので、「カスタマイズしたい」「コードを理解したい」という方はぜひ読み進めてください。
【解説】グラデーションの影の実装コードの解説
ここからは実装コードの解説をしていきます!
HTML
まずHTML上で何らかのタグを用意し、クラスを付与してください。
<div class="box">Gradient Shadow</div>
ここではdiv
タグにbox
というクラスを付けています。
もしimg
やinput
など、終了タグが存在しないタグにグラデーションの影をつけたい場合は、div
等のタグで囲ってください。
<!-- 失敗例 -->
<img class="box" src="./path/sample.png" >
<!-- 正しい例 -->
<div class="box">
<img src="./path/sample.png">
</div>
影の部分は擬似要素で実装するのですが、img
やinput
などのような終了タグが存在しないタグには擬似要素を使用することができません。
そのため、閉じタグが存在するタグで囲ってあげる必要があります。
HTMLの解説は以上ですので、次はCSSの解説をしていきますね。
CSS
/* box本体 */
.box {
position: relative;
width: 400px;
height: 250px;
display: flex;
align-items: center;
justify-content: center;
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%);
color: #fff;
font-weight: bold;
}
/* boxの影 (filterプロパティ未対応のブラウザ) */
.box::before {
content: "";
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
box-shadow: 0 20px 20px rgba(0, 0, 0, 0.16); /* filterが効かない場合黒い影をつける */
z-index: -1;
}
/* boxの影 (filterプロパティ対応済のブラウザ) */
@supports (-webkit-filter: blur(20px)) {
.box::before {
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%);
-webkit-filter: blur(20px);
filter: blur(20px);
transform: translateY(20px);
box-shadow: none;
}
}
以上がCSSの全体コードです。
少し長いので、以下の3つにわけて説明していきます。
- box本体の装飾
- boxの影の装飾(filterに未対応のブラウザ)
- boxの影の装飾(filterに対応済のブラウザ)
まず最初に、box本体の装飾からみていきます。
その後、filter
プロパティに対応していないブラウザのために、フォールバックとしてbox-shadow
で影を実装します。
最後にfilter
に対応しているブラウザ用に、グラデーションの影を作成していきます。
これらの手順を踏むことで、
filter
対応済のブラウザにはグラデーションの影を実装filter
未対応のブラウザにはbox-shadow
で単色の影を実装
というふうに、全ブラウザで少なくとも影が表示されるようになります!
filterプロパティのブラウザ対応状況について
上記の図がfilter
プロパティの各ブラウザ対応状況です。
97%以上のブラウザでサポートされているので、問題なく使えそうですね。
IEではどのバージョンでもサポートされていませんが、その場合はバックアッププランとしてbox-shadow
で影をつけます。
①box本体の装飾
.box {
position: relative;
width: 400px;
height: 250px;
display: flex;
align-items: center;
justify-content: center;
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%);
color: #fff;
font-weight: bold;
}
まずはbox本体のスタイルから見ていきましょう。
ここでの必須プロパティはposition
のみなので、それ以外は自由にカスタマイズしてください。
position
の値には初期値であるstatic
以外を指定します。DEMOではrelative
を指定しました。
これは親要素であるboxを基準に影の位置を絶対位置指定するためです。
こうすることで、影をposition: absolute
で位置指定することができるようになりました。
現時点での見た目を見てみましょう。
この時点ではまだ影が設定されていないので、上のような見た目になりますね。
②【filterに未対応のブラウザ対策】box-shadowで影を実装する
続いては、filter
に対応していないブラウザのために、box-shadow
で影をつけていきます。
.box::before {
content: "";
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
box-shadow: 0 20px 20px rgba(0, 0, 0, 0.16); /* filterが効かない場合黒い影をつける */
z-index: -1; /* 親要素の下に配置 */
}
影の要素は::before
擬似要素で実装します。
まずwidth: 100%
,height: 100%
で親要素のboxと全く同じサイズにします。
位置指定にはposition: absolute
を使用し、left: 0
,top: 0
とすることで親要素の上にちょうど重なるように配置します。
しかしこのままだと影が要素の上に重なってしまうので、z-index
に-1
を指定して背面に移動させます。
ここにbox-shadow
で単色の影を指定することで、フォールバック用の影が完成です!
この時点では、boxの下側に薄い黒の影が表示されているのが確認できますね。
IEやその他filter
未対応のブラウザでは、この影が表示されます。
③【filterに対応済のブラウザ用】filterでグラデーションの影を実装する
最後に、filter
に対応済みのブラウザ用に、グラデーションの影を実装していきます。
@supports (-webkit-filter: blur(20px)) {
.box::before {
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%);
-webkit-filter: blur(20px);
filter: blur(20px);
transform: translateY(20px);
box-shadow: none;
}
}
filter
に対応しているブラウザにのみに限定してスタイルを当てるために、@supports
を使用します。
@supports
は機能クエリと呼ばれるもので、特定のCSS機能に対応している場合のみ{}内のスタイルを適用することができます。
@supports (-webkit-filter: blur(20px)) {
/* -webkit-filterに対応している場合は、この{}内のスタイルを適用 */
}
この場合は、-webkit-filter: blur(20px)
に対応済みのブラウザには{}のコードを適用するという意味になりますね。
@supports
については別記事でまとめましたので、もっと詳しく知りたい方は以下のリンクからどうぞ。
それでは、@supports
内のコードを確認していきましょう。
.box::before {
background-image: linear-gradient(135deg, #fc00ff 0, #00dbde 100%); /* 影の色 */
-webkit-filter: blur(20px); /* ぼかしの大きさを指定 */
filter: blur(20px);
transform: translateY(20px); /* 20px分下にずらす */
box-shadow: none; /* フォールバック用の黒の影を削除 */
}
background-image
にはlinear-gradient
関数を使用して、グラデーションカラーを作成します。
このままだとただのグラデーションになってしまうので、ぼかしをかけるためにfilter
プロパティのblur
関数を使用します。
blur
関数には数値を指定することができ、数値を大きくすればぼかし具合も強く、小さくすればぼかし具合が弱くなります。
次に、影を少し下にずらしたいので、transform
のtranslateY
関数を使用して下に移動させます。
最後に、フォールバックとして指定していた黒い影を削除することで、完成です!
これでfilter
対応ブラウザではグラデーションの影が、未対応ブラウザではbox-shadow
での黒い影が表示されるようになりました。
【まとめ】filterのblur関数でグラデーションカラーの影を実装可能!
今回の記事では、CSSでグラデーションカラーの影をつける方法を紹介しました。
box-shadow
では単色の影しかつけることができませんが、filter
のblur
関数でぼかしをかけることで影のようなエフェクトを実装することができましたね。
filter
は97%以上のブラウザで対応済みですし、未対応のブラウザ対策にはbox-shadow
で影を実装しているので、どのブラウザでも使用することができます!
今回使用した@supports
については以下の記事で解説していますので、気になる方は読んでみて下さい。
コメント