本文へスキップ

技術

animation-range を cover にすると、ページの末尾で完走しない

スクロールに合わせて要素を現す演出を、JS を使わず animation-timeline: view() だけで組みました。ページのいちばん下の要素だけ、薄いまま終わります。

何が起きたか

最初はこう書いていました。

animation-timeline: view();
animation-range: entry 0% cover 28%;   /* ← ページの末尾で完走しない */

3つあるページのうち、いちばん短いページで気づきました。最後の節が画面いっぱいに見えているのに、薄いままなのです。計算値を拾うとこうでした。

端末画像   0.63
見出し     0.59
箇条書き   0.47   ← 画面に入りきっているのに半分以下

手前の節   0.93 / 0.88   (下へ行くほど薄い)

理由 —— cover はスクロールし「過ぎる」量で進む

cover は、要素が画面を通り過ぎていく量で進みます。ということは、ページのいちばん下にある要素には、その量ぶんのスクロールが残っていません。 下へ行くほど薄くなるのはそのためです。

長いページでは目立ちません。ページが短いほど、そして要素が下にあるほど強く出ます。

直し方 —— 終わりを entry 100% にする

animation-timeline: view();
animation-range: entry 0% entry 100%;  /* 全体が画面に入りきったら完了 */

entry 100% は「要素の下端が画面の下端に達する」、つまり全体が画面に入りきった時点です。行き過ぎる量に依存しないので、ページの末尾にあっても必ず完走します。

「画面に入りきったものは必ず不透明」という、読み手の側から見て素直な約束にもなりました。

検証は、実際にホイールを回すこと

ここがいちばんの落とし穴でした。window.scrollTo() では検証できませんanimation-timeline: view() の値が更新されず、常に 1 に見えます

自動で確かめようとして「直った」と判断しかけました。実際に指とホイールで送るまで、壊れたままだと分かりません。
Notes 一覧へ戻る