ブレンドモードを設定した box-shadow の影を作成するコードを紹介します。
概要
こちらの記事ではCSSの box-shadow プロパティを利用して枠に影を描画するコードを紹介しました。
box-shadow の影にブレンドモードを設定して描画するコードを紹介します。
単純な実装
コード
下記のCSS,HTML コードを記述します。
body {
background: url('./back.jpg');
}
.Frame {
text-align: left;
margin: 2rem auto 0 auto;
background-color: #0022c3;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
width: 420px;
box-shadow: 0 0 24px #4cff00;
mix-blend-mode: overlay;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="CssDropShadowBlendMode.css" />
</head>
<body>
<div class="Frame">
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
</div>
</body>
</html>
解説
box-shadow
プロパティで枠の影を設定します。
mix-blend-mode
でブレンドモードを設定します。上記のコードでは "overlay" を設定しオーバーレイで枠を描画します。
表示結果
上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。影はオーバーレイで描画できていますが、
枠の内部もオーバーレイモードで合成されてしまっています。
ブレンドモードを設定して影を描画する
先のコードでは枠全体がオーバーレイのブレンド表示になってしまうため、影だけをブレンド表示する場合は、
同じ位置に通常モードで同じ枠を重ねて描画します。同じ位置に重ねて枠を描画するため、position プロパティを absolute に設定し絶対座標で
位置を指定します。
コード
下記のCSS、HTMLファイルを作成します。
body {
background: url('./back.jpg');
}
.Frame {
text-align: left;
margin: 2rem auto 0 auto;
background-color: #FFFFFF;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
width: 420px;
mix-blend-mode: normal;
z-index:1;
position:absolute;
top:46px;
left:120px;
}
.ShadowFrame {
text-align: left;
margin: 2rem auto 0 auto;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
background-color: #0022c3;
box-shadow: 0 0 24px #4cff00;
mix-blend-mode: overlay;
width: 420px;
z-index: 0;
position: absolute;
top: 46px;
left: 120px;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="CssDropShadowBlendMode.css" />
</head>
<body>
<div class="Frame">
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
</div>
<div class="ShadowFrame">
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
</div>
</body>
</html>
解説
2つの枠を記述します。枠のサイズと内容も同じで記述し枠の大きさを一致させます。
1つの枠(class="ShadowFrame ")は、mix-blend-mode プロパティで overlay を設定しオーバーレイモードでの合成モードに設定します。また、
box-shadow プロパティを設定し枠の影を描画します。
もう一方の枠(class="Frame")は、通常の描画モードに設定します。また、box-shadowは設定せず影の描画はしません。
2つの枠の position プロパティをabsolute に指定し枠の表示位置を絶対座標に設定します。
また、top,left には同じ位置を設定して 2つの枠が完全に重なる状態で表示します。
表示結果
上記のHTMLファイルを実行します。下図のページが表示されます。
枠の影が描画され、オーバーレイの合成モードで影が描画されていることが確認できます。
補足 : タグを入れ子にして親子関係がある場合の表示結果
先のコードでは同じ内容のコンテンツを2つ作成して重ねているためHTML的にはあまりきれいではないコードです。
以下のHTMLコードのように入れ子にして記述しても動作するように見えますが、期待した表示にはなりません。
コード
body {
background: url('./back.jpg');
}
.Frame {
text-align: left;
margin: 0 auto 0 auto;
background-color: #FFFFFF;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
width: 420px;
mix-blend-mode: normal;
}
.ShadowFrame {
text-align: left;
margin: 2rem auto 0 auto;
padding: 0 0 0 0 ;
background-color: #4cff00;
box-shadow: 0 0 24px #4cff00;
width: 420px;
mix-blend-mode: overlay;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="CssDropShadowBlendModeNested.css" />
</head>
<body>
<div class="ShadowFrame">
<div class="Frame">
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
</div>
</div>
</body>
</html>
解説
2つの枠をネストして記述します。外側の枠は
ShadowFrame
クラスを指定し、オーバーレイモードでブレンドして描画します。
内側の枠は
Frame
クラスを指定し、通常モードで描画します。
先のHTMLと同じ結果が得られるか確認します。
表示結果
上記のHTMLをWebブラウザで表示します。下図のページが表示されます。内側の枠は通常モードで描画する設定ですが、透過の無い通常モードの描画ではなく、
親の要素のdiv枠の
ShadowFrame
クラスの設定が反映されており、オーバーレイの描画が反映されてしまっていることが確認できます。
参考:疑似要素を利用する場合
外側の枠がない例
コード
下記ファイルを作成します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="CssDropShadowBlendModePseudoElement.css" />
</head>
<body>
<div class="Frame">
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
</div>
</body>
</html>
body {
background: url('./back.jpg');
}
.Frame {
text-align: left;
margin: 2rem auto 0 auto;
background-color: #FFFFFF;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
position: absolute;
top: 46px;
left: 120px;
width: 420px;
}
.Frame::after {
content: "";
width: 100%;
height: 100%;
mix-blend-mode: overlay;
background-color: #ffd11c;
top: 0;
left: 0;
position: absolute;
z-index: -1;
box-shadow: 0 0 24px #ffd11c;
}
解説
HTMLファイルは先の例と同じ構造です。Frameクラスも先の例と同様の設定です。
影の枠を
.Frame::after
クラスで定義します。
position: absolute;
を設定し座標を絶対座標にして、
width:100%
height:100%
top:0
bottom:0
を設定すると、コンテンツの枠(Frameクラス)と同じ大きさで重なります。
z-index: -1;
を設定しコンテンツの枠(Frameクラス)の下に配置します。
mix-blend-mode: overlay;
box-shadow: 0 0 24px #e2ff28;
を設定して影の設定を入れます。
表示結果
上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。影の部分がオーバーレイ表示できています。
外側の枠がある例
コード
下記ファイルを作成します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="CssDropShadowBlendModePseudoElementWrap.css" />
</head>
<body>
<div class="WrapFrame">
<div class="Frame">
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
</div>
</div>
</body>
</html>
body {
background: url('./back.jpg');
}
.WrapFrame {
position: relative;
margin: 1rem 2rem 0 4rem;
width: 480px;
}
.Frame {
text-align: left;
margin: 2rem auto 0 auto;
background-color: #F0F0F0;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
width: 100%;
z-index: 1;
box-sizing: border-box;
}
.Frame::after {
content: "";
width: 100%;
height: 100%;
background-color: #FF0000;
top: 0;
left: 0;
position: absolute;
z-index: -1;
mix-blend-mode: overlay;
box-shadow: 0 0 24px #FF0000;
}
解説
HTMLファイルの構造がこれまでの例と若干変わり、コンテンツの枠の外側を
class="WrapFrame"
のdivタグで囲む構造になります。
枠の幅は外側のWrapFrameで指定します。
.Frameクラスは
width:100%
を指定し外側の枠の幅と同じ幅とします。
影の枠を
.Frame::after
クラスで定義します。
position: absolute;
を設定し座標を絶対座標にして、
width:100%
height:100%
top:0
bottom:0
を設定すると、コンテンツの枠(Frameクラス)と同じ大きさで重なります。
z-index: -1;
を設定しコンテンツの枠(Frameクラス)の下に配置します。
mix-blend-mode: overlay;
box-shadow: 0 0 24px #FF0000;
を設定して影の設定を入れます。
表示結果
上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。影の部分がオーバーレイ表示できています。
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
最終更新日: 2022-10-26
作成日: 2021-02-04