CSSの新機能×バリアブルフォント
このnoteで紹介するのは "Scroll-driven Animations" と呼ばれる新機能です。2023年7月リリースのGoogle Chrome 115に搭載されました。JavaScroptを用いずに,CSS数行でスクロール駆動アニメーションを実装できるようになります。
CSS初心者でもかなり簡単に実装できた
バリアブルフォントとの相性が良かった
ので,簡単なWebページを作ってみました。その解説?が主な内容となります。
Scroll-driven Animationsについて
今までCSSで実装できるアニメーションは,時間に依存するものに限られていました。今回のアップデートは,その依存先に「スクロール進捗度 (Scroll Progress) 」と「ディスプレイ上の相対位置 (View Progress) 」が加わったというものです。
スクロール進捗度 (Scroll Progress)
これは「ページ全体(または特定の子要素)をスクロールした割合」をタイムラインに置くものです。以下を "Run Pen" より試してみてください。(アプリの場合はブラウザに飛ばされるのでご注意を)
スクロールに従って,ボックスの色・サイズ・角度が連続的に変化していると思います。これは以下のようなCSSで実装されます。
@keyframes box-progress {
from {
scale: 1 1;
transform:rotate(0deg);
}
to {
scale: 2 2;
transform:rotate(180deg);
}
}
.box {
animation: box-progress linear;
animation-timeline: scroll();
2~5行目の "from" (or "0%") でスクロール0%の状態を,6~9行目の "to" (or "100%") で100%の状態を定めます。中間は補完され,連続的に変化します(バリアブルフォントの概念に通ずる部分がある)。また,例えばその間に "50%" の状態を定義すれば,2段階の変化をします。以上は従来のアニメーションにも共通することではありますが,かなり設計しやすいです。
そして,このアニメーションを適用する要素に13, 14行目を入れます。
14行目でタイムラインにスクロール進捗度を設定しています。
ディスプレイ上の相対位置 (View Progress)
こちらは,「実際に表示されている位置」をタイムラインとするものです。
すなわち上のデモのように,要素が画面内に入ってきたときにのみ動くようにできます。前半はほぼ同じで後半は以下のようになります。
.box {
animation: scroll-progress linear;
animation-timeline: view();
animation-range: entry 0% exit 150%;
Scroll-driven Animationsの詳細に関しましては,以下のリンクをご参照ください。
バリアブルフォントをアニメーションにしてみた
早速ですが,今回制作したページです。
(ポリフィルを適用しているので,遷移は少しぎこちないですがSafari等でも動くと思います)
また以下がほぼ同じものとなりますので,ぜひ見てみてください!
テキストはクリックして編集できます!
スクロールに連動してフォントのウエイトが変化するアニメーションです。
今回は,Noto Sans JP, M PLUS 1, Jost, Bodoni Modaの4つのバリアブルフォントをGoogle Fontsから読み込んでみました。このうち前の2つは和文フォントです。このようなアニメーションはJavaScriptを利用しても制作できますが,簡単な記述で実装できるという点で,Scroll-driven Animationsには魅力があると思います。
コードについて
@keyframes noto-animation {
from {
font-size: 15vw;
font-variation-settings: "wght" 100;
}
to {
font-size: 16vw;
font-variation-settings: "wght" 900;
}
}
"@keyframes" は,上のようなコードとなっています( "from" は明示的に書いています)。ここで,"font-variation-settings" は,"wght"(ウエイト)に限らず, "wdth", "opsz", "slnt" など,バリアブルフォントの様々な "axis"(軸)を設定できます(フォントによりけりです)。
なお,Google Fontsで利用できる軸の定義および各フォントが対応している軸は,以下の公式ページに記載があります。
ここには数十種類の軸の説明がありますが,単一のファミリーに限定すると,Roboto Flexの11つが最高だとは思います。
Google Fontsの利用について
個人的に一番躓いたのがGoogle Fontsの利用方法だったので,最後に備忘録として書いておきます。。
Google FontsのAPIはv2に更新され,これにより初めてバリアブルフォントをWebフォントとして完全に利用することができるようになりました:
<!-- Roboto Flexを読み込む場合(ウエイト:400がデフォルト) -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto+Flex">
<!-- Roboto FlexとNoto Sans Japanese(../css? 以下)-->
family=Roboto+Flex&family=Noto+Sans+JP
<!-- Jost ウエイト:123 -->
family=Jost:wght@123
<!-- Jost ウエイト:123,456 -->
family=Jost:wght@123;456
<!-- Jost ウエイト:300~700 -->
family=Jost:wght@300..700
<!-- Jost 斜体のウエイト:300~700 -->
family=Jost:ital,wght@1,300..700
<!-- 0(立体),1(斜体)の2択 -->
<!-- Jost 立体のウエイト300~700と斜体のウエイト456 -->
family=Jost:ital,wght@0,300..700;1,456
<!-- Bodoni Moda オプティカルサイズ6~96とウエイト400~900の組合せ -->
family=Bodoni+Moda:opsz,wght@6..96,400..900
<!-- axis(軸)はアルファベット順に記述 -->
<!-- Bodoni Moda テキスト"Hello"のみの読み込みでウエイト:456 -->
family=Bodoni+Moda:wght@456&text=Hello
おわりに
ここまで読んでくださりありがとうございます。今でこそバリアブルフォントのアニメーションがWebに用いられることは殆どないですが,今後表現手段の一つとして広まっていくのかな?と思っています。
(「スクロール進捗度 (Scroll Progress) 」「ディスプレイ上の相対位置 (View Progress) 」は公式の和訳ではありません)