交差オブザーバー API 「Intersection (要素間交差) Observer (監視) API」 は、ターゲットとなる要素が、祖先要素または文書の最上位のビューポートと交差する変化を非同期的に監視する方法を提供する。このページでは監視対象を 'hr' とする。スクロールしてこの区切り線と出現してくるヘッダーの動きに注視していただきたい。
HTML の <hr> タグは、段落レベルの要素間でテーマの意味的な区切りを表す要素である。
JavaScript の記述にて、「document の querySelector('hr')」 メソッドは、指定されたセレクター'hr' に一致する、文書内の最初の Element を取得するように指示している。「ob.observe(hr);」の設定により、監視する対象要素の 'hr' の監視を開始させる。
ビューポートと「hr」が交差すると、「<div class="sticky-header">」の「class」に「visible」を付け加えるとヘッダーを表示する(表示になったときの状態)、交差から外れるとこれを削除しヘッダーは非表示になる。
以下は Intersection Observer API を利用できるようにする JavaScript の記述である。
< script >
"use strict";
const hr = document.querySelector('hr');
const sticky = document.querySelector('.sticky-header');
const ob = new IntersectionObserver(obCallback);
function obCallback(payload) {
if (payload[0].boundingClientRect.y < 0) {
//boundingClientRect.y は、オブジェクトの y 座標を取得する
sticky.classList.add('visible');
} else {
sticky.classList.remove('visible');
}
}
ob.observe(hr); //observeメソッドで、監視する要素を指定
< /script>
<body>
<main>
<header>
<h1>Sticky Header Using Intersection Observer</h1>
<div style="height: 200px; width: 100%; background-color: orange;"></div>
</header>
<div class="sticky-header">
<div id="areaA">
<h2>Sticky Header Using <span style="color: red;">Intersection Observer</span></h2>
</div>
<div id="areaB">
<p> 対応ブラウザ: Chrome、Edge、Safari、Firefox、Opera、Safari on iOS </p>
</div>
</div>
<section class="content">
<p>Etc. text…</p>
<hr>
<p>Etc. text…</p>
</section>
</main>
<script>
…
</script>
</body>
.sticky-header.visible {
display: flex;
transform: none;
}
.sticky-header.visible p {
width: 60%;
margin: 0 auto;
text-align: center;
width: -moz-fit-content;
width: fit-content;
display: inline-block;
height: 2.2rem;
line-height: 2.2rem;
background-color: #265294;
}