mix-blend-mode、filter、objext-fit……とても便利ですよね。
これらのプロパティを使うと、これまでjsで対応していた箇所や、再現が不可能なので画像で対応としていたものを、CSSだけで簡単に再現してくれます。
しかし、残念ながらこれらのプロパティはIE非対応です。そのため、便利だけどIE対応のために使えない……ということが多かったと思います。
ですがこの度、IEのサポートが今年の6月に終了するとのことで、次第にIE非対応のCSSプロパティを利用できる機会も増えていくのではないでしょうか!
そこで今回は、便利だけどIE非対応でこれまであまり使う機会がなかった、というCSSプロパティをご紹介していこうと思います。
IEサポートが終了してからもしばらくはIE対応が必要になってくるとは思いますが、IEを気にせずにCSSを使えるようになる日が来るのが楽しみですね。
IE対応をどこまでするかについてですが、IEのサポートの終了が見えていることもあり、レイアウト崩れが起こるなどの致命的な問題がない限りはIE非対応のCSSの使用を検討してもよいのではと考えております。
IEで問題が起こってないことを確認したうえでIEでの効果を諦めて、Chromeや他のブラウザではより見栄えよく見えるようにしておく、という感じです。
もちろんプロジェクトにもよりますので、ディレクターさんと要相談です!
それでは、次からIE非対応のCSSプロパティの紹介を行っていこうと思います。
目次
mix-blend-mode
PhotoshopやXD、Illustratorで作成されたデザインで、合成モードのオーバーレイや乗算、スクリーンなどが使われていることがあると思います。
mix-blend-modeを使えば、そのような合成モードをCSSでかけることができます!
これまでは丸ごと画像にして置いたり、乗算やオーバーレイの効果をあきらめたりしていましたが、mix-blend-modeを使ってお手軽に再現しましょう。
次から主なブレンドモードの紹介をしていきます。
■参考ドキュメント
mix-blend-modeについて:mix-blend-mode
ブレンドモードの種類について:blend-mode
初期状態
次からの例は、この2枚の画像をabsoluteで重ね合わせてブレンドモードをかけてみようと思います。
(水色のきらきらした画像(.img-kira)を上に、空の画像をその下に重ねます。)
乗算
1 2 3 4 5 | .img-kira.multiply { mix-blend-mode: multiply; } |
乗算は、上の色と下の色をかけ合わせた色になります。
黒がかけあわされたときはより暗い色になります。
白がかけあわされたときは変化せず、下のレイヤーの色がそのまま見えます。
記事アーカイブなどのページでサムネイル画像の上にテキストを載せたいというとき、画像の色合いがまちまちなのでテキストが見えなくなるかもしれない……という懸念がありますよね。
そんなときに、サムネイル画像の上に乗算で薄く暗い色を乗せておけば、見栄えもよく、テキストも読みやすくなります!
単に無彩色を薄く乗せておくのだと、画像との色合いによってあまり見栄えが良くないときがあります。
スクリーン
1 2 3 4 5 | .img-kira.screen { mix-blend-mode: screen; } |
色を反転して乗算し、さらに色を反転します。
黒がかけあわされたときは変化せず、下のレイヤーの色がそのまま見えます。
白がかけあわされたときはより明るい色になります。
オーバーレイ
1 2 3 4 5 | .img-kira.overlay { mix-blend-mode: overlay; } |
下のレイヤーの色が暗いときは乗算、明るいときはスクリーンがかかります。
コントラストが強まり、はっきりとした効果が得られます。
ハードライト
1 2 3 4 5 | .img-kira.hard-light { mix-blend-mode: hard-light; } |
上のレイヤーの色が暗いときは乗算、明るいときはスクリーンがかかります。
(オーバーレイとレイヤーの上下が入れ替わった効果になります。)
サンプルだと上のレイヤー(水色のきらきらした画像)が明るいので、スクリーンをかけたときの色に似ています。
ソフトライト
1 2 3 4 5 | .img-kira.soft-light { mix-blend-mode: soft-light; } |
ハードライトとほぼ一緒ですが、ソフトライトのほうが柔らかい印象になります。
除外
1 2 3 4 5 | .img-kira.exclusion { mix-blend-mode: exclusion; } |
色が反転します。
画像や複数色の背景の上に、mix-blend-mode: exclusion;をかけたテキストを置くと、色がぱきっとしてかっこいい感じになると思います。
すべてが補色の色合いになるため、色数が多いと少し色が汚く見えてしまうかもしれません。
差の絶対値
1 2 3 4 5 | .img-kira.difference { mix-blend-mode: difference; } |
除外と同様、色が反転します。
除外のほうがコントラストが弱く少し薄味ですが、差の絶対値を使うとコントラストが強まり、ぱっきりとした印象になります。
filter
filter関数では、ブラー(ぼかし)や影を付けたり、輝度・コントラスト・色相などの操作や色見の調整ができたりします。
次から主なfilter効果の紹介をしていきます。
■参考ドキュメント
filter
ブラー
1 2 3 4 5 | .filter-img .blur { filter: blur(3px); } |
ガウスぼかしをかけられます。
blurをかけると要素のフチもぼけるので、フチはぼかしたくないときは、要素の囲いを作ってぼかした分はみ出させて overflow: hidden するなどが必要です。
ドロップシャドウ
1 2 3 4 5 | .filter-img .drop-shadow { filter: drop-shadow(0 0 3px rgba(0,0,0,.5)); } |
ドロップシャドウは、要素の中身のフチに影を付けることができます。
上記はpng画像ですが、オレンジのお花に沿って影が付いているのがわかるでしょうか?
box-shadowでは要素の枠のフチに影を付けることしかできませんが、filter: drop-shadowは中身に沿って影が付けられます。
以下にbox-shadowで影を付けたサンプルも用意するので見比べてください。
グレースケール
1 2 3 4 5 | .filter-img .grayscale { filter: grayscale(100%); } |
適用すると、要素の色味をグレースケールにできます。
100%で完全なグレースケールに、0%だと元の色味のまま表示されます。
画像だけでなく適用した要素すべてがグレースケールになります。
セピア
1 2 3 4 5 | .filter-img .sepia { filter: sepia(100%); } |
適用すると、要素の色味をセピア調にできます。
グレースケール同様、100%で完全なセピア調に、0%で元の色味のまま表示されます。
画像だけでなく適用した要素すべてがセピア調になります。
輝度・コントラスト・色相
Photoshopの色調補正・調整レイヤーではおなじみの輝度・コントラスト・色相は、CSSでも調整することが可能です。
輝度
1 2 3 4 5 | .filter-img .brightness { filter: brightness(1.4); } |
1(または100%)が基準値で、1(100%)を超える値を指定すると輝度が高くなり、1(100%)よりも小さい値を指定すると輝度が下がります。
コントラスト
1 2 3 4 5 | .filter-img .contrast { filter: contrast(1.4); } |
1(または100%)が基準値で、1(100%)を超える値を指定するとコントラストが高くなり、1(100%)よりも小さい値を指定するとコントラストが下がります。
色相
1 2 3 4 5 | .filter-img .hue-rotate { filter: hue-rotate(45deg); } |
色相を回すことができます。
0degで色相の回転なし、360degで1回転になり、元の色味に戻ります。
複数指定
1 2 3 | filter: grayscale(100%) contrast(1.4); |
またfilterは、上記のように半角区切りで指定することで、複数指定することもできます。
必要に応じて組み合わせてみてください。
background-clip: text;
★ができる★
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | .background-clip { position: relative; } .background-clip .txt-wrap { background: url(../hoge/ie-unmatched-css-img01.jpg) no-repeat center center / cover; -webkit-background-clip: text; // ★ここ background-clip: text; // ★ここ color: transparent; // ★ここ display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 55px; line-height: 1.2; max-width: 430px; height: 150px; text-align: center; z-index: 1; } |
テキストを背景色で抜くことができます。Photoshopなどでいうクリッピングマスクと同じようなイメージです。
コードのポイントは、★のところです。
background-clip: text;をかけるときは、FireFoxとEdgeに対応するために-webkit-プレフィックスも一緒に書いてください。
また、テキストのcolorをtransparentにすることでテキストを背景色で抜くことができます。
clip-path
clip-pathは、要素を図形でクリッピングマスクします。
長方形や三角形、正円や楕円などが元々用意されているだけでなく、polygon()で頂点を指定して、任意の図形を指定することもできます。
また、SVGのパスデータを使用することも可能です。
■参考ドキュメント
clip-path
図形を指定してクリップ
これまでは、border-radius: 50%; overflow; hidden; をして正円の画像を作っていましたが、画像のクリッピングならclip-pathで1行で書けます。
基本的なシェイプが簡単に指定できるようになっていますので、以下で紹介いたします。
inset()
1 2 3 4 5 | .clip-shape01 img { clip-path: inset(50px round 10px); } |
長方形を指定できます。
clip-path: inset(50px); とすると要素の端から、50pxの余白を開けて切り抜いてくれます。
Photoshop・Illustratorのオフセットと同じイメージです。
clip-path: inset(50px round 10px); とすると、50pxのオフセットと10pxの角丸が付きます。
circle()
1 2 3 4 5 | .clip-shape02 img { clip-path: circle(125px); } |
正円を指定できます。
ellipse()
1 2 3 4 5 | .clip-shape03 img { clip-path: ellipse(160px 120px at center); } |
楕円形を指定できます。
polygon()
1 2 3 4 5 | .clip-shape04 img { clip-path: polygon(100px 0, 200px 200px, 0 200px); } |
多角形を指定できます。複雑な図形も指定できます。
上記では3つの頂点を打ってあるので三角形です。
以下のサイトはclip-pathのジェネレータです。
好きな形にパスを指定できるので、複雑な形にクリッピングしたいときはご活用ください。
Clippy — CSS clip-path maker
SVGでクリップ
こちらはSVGを用意してクリップする方法です。
SVGを作成したらHTMLに設置して、パスデータをclipPathで囲い、IDを付けます。
CSSでimgタグにパスのIDを指定すると、クリッピングができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // SVGのパスを用意する(clipPathとIDを付ける) <svg> <clipPath id="path"> <path d="M112.69,0h0A112.69,112.69,0,0,0,0,112.69H0a112.71,112.71,0,0,0,97.07,111.6L112.69,245l15.61-20.71a112.7,112.7,0,0,0,97.07-111.6h0A112.68,112.68,0,0,0,112.69,0Z"/> </clipPath> </svg> // CSSで適用 .clip-svg img { clip-path: url(#path); } // svg要素を設置するとその分の幅と高さが取られるので消す svg { width: 0; height: 0; } |
また、SVGのclipPathとimageを使用してクリッピングする方法もあります。
こちらはIEを含む全モダンブラウザに対応しているので、現段階でIEで使用したい場合は以下の記事をご覧ください。
SVGで画像を切り抜く [クリッピングマスク] [IE含め全モダンブラウザに対応]
max-content
max-contentは要素の内在的な大きさを表してくれます。
ブロック要素にinline-blockをかけるときのような、横幅を中身のサイズにしたいときに使えます。
inline-blockと違うのは横並びにならない点です。
▼何も指定されていないとき
▼inline-block
▼max-content
1 2 3 4 5 6 | .max-content01 { background: #CFF; width: max-content; // ★ここ } |
また、高さが固定じゃない要素をabsoluteを使って上下中央寄せをするとき、height: max-content; すると上下中央寄せが簡単にできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | .max-content02 { background: #ccc; position: relative; height: 200px; } .max-content02 .inn { background: #fff; position: absolute; top: 0; bottom: 0; width: 100px; height: max-content; // ★ここ margin: auto; padding: 10px; } |
■参考ドキュメント
max-content
line-clamp
line-clampは複数行のテキストを任意の行で丸めて、最後の文字を「…」に置き換えてくれます。
記事アーカイブページで、各記事へのリンクに冒頭のテキストを2行だけ表示させておく、などで使えます。
jsやphpで文字数を取得して丸めるよりも簡単できれいですよね。
1 2 3 4 5 6 7 8 9 10 11 | .line-clamp { display: -webkit-box; // ★ここ -webkit-line-clamp: 2; // ★ここ -webkit-box-orient: vertical; // ★ここ overflow: hidden; // ★ここ background: #CFF; max-width: 200px; font-weight: bold; } |
ポイントは★の行です。-webkit-line-clampだけでなく、その他の3行も必要です。
object-fit
object-fitはimgやvideoを要素のボックスにどうはめ込むか設定することができます。
CSSのbackgroundを使った画像指定と同じような感覚で、object-fitではHTMLに設置した<img>タグ内の画像の見せ方を指定することができます。
■参考ドキュメント
object-fit
object-fit: fill;
1 2 3 4 5 6 7 8 9 10 11 12 | .objectfit-box.fill img { object-fit: fill; // ★ここ } // 共通CSS .objectfit-box img { object-position: center center; // 位置を変えたいとき width: 100px; height: 300px; } |
object-fitのデフォルト値です。imgにそのままwidthとheightをかけたときのように、画像がそのサイズに引き延ばされたりつぶれたりします。
また、画像をはめ込む基準の位置をobject-positionで決めることができます。
background-positionと同じです。
object-fit: cover;
1 2 3 4 5 | .objectfit-box.cover img { object-fit: cover; // ★ここ } |
background-size: cover; と同じような見え方になります。
親要素のサイズいっぱいになるように、画像を拡縮してくれます。
object-fit: contain;
1 2 3 4 5 | .objectfit-box.contain img { object-fit: contain; // ★ここ } |
background-size: contain; と同じような見え方になります。
画像をトリミングせずに、親要素を基準にできるだけ大きく画像を表示してくれます。
また、object-fitにはIE対応のためのポリフィルも用意されていますので、是非以下の記事をご覧ください。
object-fitの詳しい使い方などについても紹介されています。
IE11での画像のobject-fitの使用について
Grid
CSS Grid Layoutとは、レイアウトを組むときに使うCSSプロパティです。
同じくレイアウトに使用するFlexboxは一次元的(縦または横の一方向)でシンプルなレイアウトに向いているのに対し、Gridは二次元的(縦横の二方向)で重ねて配置できたり、それぞれ大きさの異なる要素を敷き詰められたりと、複雑なレイアウトが実現できます。
FlexboxよりもHTML構造の制限がないため、記述量を少なくできるのも特徴です。
以下はGridを使用してレイアウトをしてみた例です。
単にdivのボックスを6つ並べただけのHTML構造で、こんなレイアウトも簡単に実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | // HTML <div class="grid-box"> <div class="item item01">item01</div> <div class="item item02">item02</div> <div class="item item03">item03</div> <div class="item item04">item04</div> <div class="item item05">item05</div> <div class="item item06">item06</div> </div> // CSS .grid-box { display:grid; gap: 10px; } .grid-box .item { padding: 15px; font-weight: bold; } .grid-box .item01 { grid-row: 1 / 2; grid-column: 1 / 2; background: #f6ffc5; } .grid-box .item02 { grid-row: 1 / 5; grid-column: 2 / 3; background: #bef5ff; } .grid-box .item03 { grid-row: 2 / 3; grid-column: 1 / 2; background: #c5ffc8; } .grid-box .item04 { grid-row: 3 / 4; grid-column: 1 / 2; background: #ffc5c5; } .grid-box .item05 { grid-row: 4 / 5; grid-column: 1 / 2; background: #f5c5ff; } .grid-box .item06 { grid-row: 5 / 6; grid-column: 1 / 3; background: #bcbbff; } |
Gridにはグリッド線を使ったレイアウトとグリッドレイアウトを使ったレイアウトがあるなど、やれることもプロパティも豊富です。
詳しく知りたい方は以下のドキュメントや記事をご覧ください。
■参考ドキュメント
CSS グリッドレイアウト
グリッドレイアウトの基本概念
■参考記事
サクッとグリッドCSSを理解して、クライアントワークに使う
また、以下の記事では、実践的なレイアウトをサンプルコード・デモ付きで紹介されています。是非ご覧ください。
【Gridは便利?】CSS Grid Layout(Grid)を使った実践的なコーディングサンプル3選!
IEでCSS Gridを使用するには、ベンダープレフィックスを付けることで対応できます。
その際、IEと他のブラウザで名称の違うプロパティが存在したり、グリッドの解釈が異なったりするため注意が必要です。
詳しくは以下の記事をご覧ください。
CSS GridをIE11、EDGEに対応させるために注意する点
position: sticky;
粘着位置指定といい、position: fixed; に似ていますが、ウィンドウを基準に追従するのではなく、ブロックを基準にして追従します。
サンプルを用意したので、スクロールしてみてください。
Aブロックの間にいるときは「A」の見出しが追従し、Bブロックに移動すると「B」の見出し……と、そのブロックに設置したstickyの要素が追従します。
■参考ドキュメント
position「粘着位置指定」
Aブロック
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
Bブロック
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
Cブロック
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
Dブロック
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // HTML <div class="sticky">A</div> // CSS .sticky { background: #dfdfdf; font-weight: bold; margin-bottom: 20px; padding: 10px 15px; position: -webkit-sticky; // ★ここ position: sticky; // ★ここ left: 0; top: 0; } |
また、IEに対応するためのポリフィルが用意されているので、IEに対応することも可能です。
詳しくは以下の記事をご覧ください。
position:stickyのpolyfillの内部実装を調べてみた
CSS変数(CSS カスタムプロパティ)
CSS変数(CSS カスタムプロパティ)を使うと、変数を定義して別の場所で呼び出すことができます。
例えば、同じ色を複数個所で使っていて後から別の色に書き換えたいというときに、CSS変数を使っていれば変数を書き換えるだけで色の変更ができます。
テーマカラーやサブカラー、決まった余白などはCSS変数で記述しておいて、後から変更しやすいようにしておくと便利です。
変数を定義するときは –(ハイフン2つ)で始まる好きな変数名を付けて、: で区切って好きな値を設定します。
この時、疑似クラス :root に定義しておくと、グローバルな値となり、そのCSSファイルを読み込んであればどこでも使えます。
変数を呼び出すときは var() の中に変数名を記述すると、定義した値を呼び出すことができます。
1 2 3 4 5 6 7 8 9 10 11 | // 変数定義 :root { --red-color: #ca353b; } // 変数呼び出し div { background-color: var(--red-color); } |
変数のスコープ
CSS変数は、変数のスコープを決めて、値を上書きすることができます。
変数のスコープとは、その変数を参照する範囲のことです。
つまり、:rootに設定した全体で使用できる変数を、あるクラスの中では別の値に定義し直すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // グローバル変数の定義 :root { --text-color: #333; --bg-color: #fff; --sub-color: #ca353b; --gray-color: #ababab; } // 再定義 .dark-theme { --text-color: #fff; --bg-color: #38393a; --sub-color: #f4511e; --gray-color: #cdcdcd; } // 再定義 .deep-blue-theme { --text-color: #fff; --bg-color: #272d40; --sub-color: #d1b31e; --gray-color: #accfe3; } |
TwitterやSlack、Chatworkのようなアプリに実装されているダークモード・ライトモードのようなカラーテーマを再現するときや、ブロックごとにテーマカラーが違うデザインなどで便利に使うことができます。
■参考ドキュメント
CSS カスタムプロパティ (変数) の使用
■参考記事
CSSの変数(カスタムプロパティ)便利な使い方を詳しく解説
CSS数学関数
CSS数学関数は現在、calc()、min()、max()、clamp()の4つがあります。
calc()はよく使うと思いますが、min()、max()、clamp()は聞いたことがなかった、という人もいるかもしれません。
CSS数学関数を使用すると、max-width・min-widthのような最大値・最小値の設定が、font-sizeやmarginなどでもできるようになります。
リキッドレイアウトで非常に役立ちます。
詳しい使い方については以下の記事でまとめていますので、是非ご覧ください。
CSSの数学関数を使って記述をスマートに!【calc(), min(), max(), clamp()】
さいごに
ポリフィルが用意されているものもありますが、IE非対応のCSSプロパティは思ったよりもありますよね。
今回紹介しただけで、11個もありました!
今のうちからどんなふうに使えるかな、と考えてみるのもよいのではないでしょうか。
これらのプロパティが自由に使えるようになると、IE用に別のCSSを書いておくことも必要なくなりますし、CSS変数やCSS数学関数、object-fitはコーディングをぐっと効率的にしてくれそうですね。
今は少し手間だなと思っていることも、次第に自由で便利になっていくだろうと考えるととても楽しみです!
本記事がWebに携わる皆さまのお役に立てれば幸いです。