CSSブレンドモードの利用 前編 ブレンドモードの仕様
このシリーズではCSSのブレンドモードを利用したヒーローエリアの実装について解説します。この実装は、リニューアルしたピクセルグリッドコーポレートサイトのヒーローエリアに使われています。PhotoshopやIllustratorの機能として見かけるようなさまざまなモードでのブレンドがCSSで実現できます。
デザインの意図
まずは、なぜブレンドモードを使用することになったのか、簡単に経緯をお話ししましょう。ピクセルグリッドのコーポレートサイトをリニューアルすることになり、社内デザイナーの小原がデザインを担当しました。
コーポレートサイトは、ピクセルグリッドらしいシンプルなデザインが基調となっています。ですが、シンプルすぎて、サイト全体の印象が弱くならないように、また全体のコントラスト不足を補うために、今までのピクセルグリッドのコーポーレートサイトにはなかった「ヒーローエリア」のデザインが提示されました。
デザインされたIllustratorファイルを見てみると、グラデーションに重なっている白い模様に、描画モード(オーバーレイ)が適用されていました。
ひと昔前であれば、こういったオーバーレイなどの描画モードが使用されていると、CSSではどうにもならず、画像をうまい具合に書き出す必要がありました。実装する側は、ちょっと苦い顔をせざるをえません。
ですが、現在では、最近のブラウザをターゲットにして良いのであれば、mix-blend-mode
やbackground-blend-mode
というプロパティを使用することで、描画モードを扱うことができるようになりました。
ピクセルグリッドのサイトは、ところどころに比較的新しい技術を使った実装が行われています。そういった新しい技術をさりげなく取り入れるのも、ピクセルグリッドという会社の特徴をうまく表現してくれそうです。そこで、ヒーローエリアの画像表現にはmix-blend-mode
を使った実装を取り入れることにしました。
デザインを見てどのように実装するか考える
そもそも、デザインを作成していく過程で、小原からは「mix-blend-mode
は使っても大丈夫そうか?」という相談はされていました。
実装方法を考えるにあたって、まず、小原が作成したデザインと、それに記載された指示をどのように実現するかを検討しました。
ヒーローエリアの高さや色指定などが細かく指定されている(大きい画像)
デザインと細かい指示をみると、以下の3つの要件を満たす実装をする必要がありました。
- グラデーションは2種類。それぞれヒーローエリアの上部と下部に利用する
- 画像(SVG)と、グラーデーションを合成した表現をする。合成のブレンドモードにオーバーレイを使用する
- もしブレンドモードが使えない場合は、SVGの不透明度を調整して、グラデーションと重ねる
上記の条件を満たしつつ実装するために筆者が考えた仕様は次のようなものです。いくつかの要素を組み合わせて、実装していこうと考えました。
まずは、1つの要素にグラデーションを2つ描画する方法と、ブレンドモードについて解説し、SVGとグラデーションを合成する部分について解説します。
なお、以降で紹介するコードは次のリポジトリにまとめてあります。
CSSブレンドモードの利用 サンプルコード
1つの要素に2種類のグラデーションを敷く
まずは、1つめの要件です。1つの要素に2種類のグラデーションを敷きます。
デザイナーからは、特に「1つの要素でなくてはいけない」とは言われてはいませんが、なるべく少ないマークアップで実現したいので1つとしました。ここでは、解説のために、サイトで使用したコードを簡略化して解説します。
ヒーローエリア用のdiv要素です。
<div class="hero"></div>
CSSは、次のように指定します。
2種類の線形グラデーションの指定
.hero {
width: 100%;
height: 200px;
background-image:
/* 赤いグラデーション */
linear-gradient(to right, #594b14 0, #591532 100%),
/* 青いグラデーション */
linear-gradient(to right, #37124d 0, #145951 100%);
background-repeat: no-repeat;
background-size: 100% 100px;
background-position: 0 100px, 0 0;
}
グラデーションを複数指定し、それぞれの幅と高さをbackground-size
で調整します。そして、background-position
で縦位置を100px移動します。これで1つの要素にグラデーションを2つ表示することができました。
これといって難しいことはないかと思います。なるべくヒーローエリアの高さの変化にも対応できるよう相対的に配置したい場合は、次のような書き方もできます。
2種類の線形グラデーションの指定(相対的な配置)
.hero {
width: 100%;
height: 200px;
background-image:
/* 赤いグラデーション */
linear-gradient(to right, #594b14 0, #591532 100%),
/* 青いグラデーション */
linear-gradient(to right, #37124d 0, #145951 100%);
background-repeat: no-repeat;
/* 幅100%、高さの50%のサイズにする */
background-size: 100% 50%;
/* 画像の100%分(100px)移動させる */
background-position: 0 100%, 0 0;
}
.hero
の高さが可変であれば、パーセンテージの指定にしておくほうが良いでしょう。
ブレンドモードの指定
次に、前述のグラデーションに、SVGをオーバーレイのブレンドモードで重ねるために必要なmix-blend-mode
とbackground-blend-mode
について解説します。これは、Compositing and Blending Level 1に登場します。
mix-blend-mode
とbackground-blend-mode
は色の合成と混色を行うためのものです。どちらも同じような働きをしますが、簡単に説明すると、要素同士の合成はmix-blend-mode
で行い、背景画像・背景色の合成はbackground-blend-mode
で行います。
mix-blend-mode
mix-blend-mode | Compositing and Blending Level 1
mix-blend-mode
では、要素のブレンドモードを指定します。このプロパティで指定できる値は、次のとおりです。PhotoshopやIllustratorのブレンド・描画モードで同じようなものを見たことがあるのではないでしょうか。そして、mix-blend-mode
は執筆現在、Chrome、Firefox、Safari(一部の値をサポートしない)で利用できます。
値 | 意味 |
---|---|
normal | 通常(初期値) |
multiply | 乗算 |
screen | スクリーン |
overlay | オーバーレイ |
darken | 比較(暗) |
lighten | 比較(明) |
color-dodge | 覆い焼き |
color-burn | 焼きこみ |
hard-light | ハードライト |
soft-light | ソフトライト |
difference | 差の絶対値 |
exclusion | 除外 |
hue | 色相 |
saturation | 彩度 |
color | カラー |
luminosity | 輝度 |
また、normal以外を指定するとスタック文脈*を形成します。
*注:スタック文脈
スタック文脈に関しては、次の記事などを参考にしてください。
実際に各値を試せるデモを用意したので、どういった変化が起きるのかを確認してみてください。白いテキストを内包する.box1
と、グラデーションが指定された.box2
は絶対配置で重ねています。
ソースコードは次のようになっています。
<div class="box-1" style="mix-blend-mode: normal;">私のHome Pageにようこそ</div>
<div class="box-2"></div>
セレクトボックスで値を選ぶと、どういった効果が得られるかを確認することができます。
【コラム】mix-blend-modeの有無を判別する
mix-blend-mode
が使えないブラウザ向けには別の指定をしたかったため、次のような判定のためのコードを書いて、mix-blend-mode
に対応しているブラウザの場合は、html.mix-blend-mode
となるように指定しました。
mix-blend-mode対応の判定
(function () {
if ('CSS' in window && 'supports' in window.CSS) {
if (window.CSS.supports('mix-blend-mode', 'soft-light')) {
document.documentElement.classList.add('mix-blend-mode')
}
}
}())
実装では、結果的にSVGとグラデーションを合成するために、mix-blend-mode
を使用しているのですが、その理由については後述します。
background-blend-mode
background-blend-mode | Compositing and Blending Level 1
次に、背景のブレンドモードを指定するbackground-blend-mode
プロパティを解説します。background: url(foo.png), url(bar.png);
のように複数背景を指定したときに、それぞれの背景にブレンド効果を付けて、背景同士を合成することができます。
このプロパティに使える値は、mix-blend-mode
と同様です。background
プロパティのサブプロパティのため、background-blend-mode: overlay, screen, normal;
のように複数の指定することもできます。
これも先ほどと同様に、セレクトボックスで値を選ぶと、どういった効果が得られるかを確認することができます。
まとめ
今回はピクセルグリッドのコーポレートサイトリニューアルにあたってのデザイン意図と、その結果、ヒーローエリアにブレンドモードを採用した実装を施すことになった経緯を説明しました。
また、その実装に必要な2つのプロパティ、mix-blend-mode
とbackground-blend-mode
の仕様を解説しました。
次回はこの知識をもとに、実際の実装をどのように行ったのか、また実装の際の注意点についても解説します。