先日、超速! Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)という本を読んで知ったのですが、最近のWebブラウザのJavaScriptには、「Intersection Observer」というAPIがあるらしく、このAPIを使うことで画面内に入ったか(もしくは画面外に出たか)どうかを判定できるそうです。
便利そうなので、試しに使ってみました。画面に四角い要素を100個並べて、画面に入ったり出たりすることで背景色が変わるサンプルです。試しに、今まで知ってはいたけど使ったことがないCSSアニメーションや、ES6から実装されたletやconstやアロー関数も使っています。
HTML
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Intesection Observeテスト</title> <link rel="stylesheet" href="intersectionObserve.css"> <script src="intersectionObserve.js" defer></script> </head> <body> <div id="main"></div> </body> </html>
CSS
#main > div{ float:left; width:100px; height:100px; margin-right:10px; margin-bottom:10px; background-color:#4169e1; text-align:center; line-height:100px; color:white; transition: background 1s linear, color 1s linear; /* 1秒書けて背景色と文字色を変化 */ } /* 画面内に入った時用のクラス */ #main > div.in{ background-color:orange; color:black; }
JavaScript
const main = document.getElementById('main'); //Intersection Observerの使用 const observer = new IntersectionObserver(entries => { console.log(entries); for(const entry of entries){ const item = entry.target; //要素に入ってるか、入ってないかの特定 if(entry.intersectionRatio > 0){ //要素内 item.classList.add('in'); }else{ //要素外 item.classList.remove('in'); } } }) //要素作成 for(let i = 0; i < 100; i++){ const newDiv = document.createElement('div'); newDiv.innerHTML = i; main.appendChild(newDiv); observer.observe(newDiv); }
スクロールしたり画面サイズを変更したりすることで、四角い要素が画面内に入ると、背景色が1秒かけて青からオレンジに変わると思います(IE以外の最新ブラウザ対応)。
ただ、すばやくスクロールしているとたまにうまく動作しないことがあるみたいです。あまりアテにしすぎるのもよくないのかも(自分がよく分かってない可能性もおおいにあります)。
なお、IntersectionObserverの第2引数にはどの要素の交差を判定するか(なければブラウザのビューポート)のrootと、ルート回りの余白を指定できるrootMargin、それと可視性がどれぐらい入ってるか出ているかでコールバックを実行するthresholdというオプションがあるそうです。
参考:Intersection Observer API - Web API インターフェイス | MDN
超速! Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)
posted with amazlet at 18.03.11
佐藤 歩 泉水 翔吾
技術評論社
売り上げランキング: 11,340
技術評論社
売り上げランキング: 11,340
コメント