苦戦したのでまとめます。
目次
JavaScriptでヘッダーの高さを取得
ヘッダーの高さをCSSに反映させるには、JavaScriptでヘッダーの高さを取得し、その値をカスタムCSSプロパティ(CSS変数)として設定する。
高さが固定されている場合
JavaScriptで header 要素の高さを取得
document.addEventListener("DOMContentLoaded", () => {
const header = document.querySelector("header"); // ヘッダー要素を取得
const headerHeight = header.offsetHeight; // ヘッダーの高さを取得
// CSS変数を設定
document.documentElement.style.setProperty("--header-height", `${headerHeight}px`);
});header.offsetHeight を使用してヘッダーの高さを取得
document.documentElement.style.setProperty() を使い、CSSで利用可能な変数として設定
CSS変数( –header-height )に値を反映
:root {
--header-height: 0px; /* 初期値 */
}
body {
margin-top: var(--header-height); /* ヘッダーの高さを適用して余白を設定 */
}
header {
margin-top: calc(-1 * var(--header-height, 0px)); /* マイナス値を指定 */
}エラーの原因
DOMが構築される前にスクリプトが実行されていた
スクリプトがヘッダー要素よりも先に読み込まれている場合、要素が正しく取得できない。
スクリプトを </body> の直前に配置して、HTML要素が確実にロードされた後に読み込むようにする。
header が absolute になっていた
getBoundingClientRect を使用
document.addEventListener("DOMContentLoaded", () => {
const header = document.querySelector("header");
// 初期のヘッダー高さを取得してCSS変数に設定
updateHeaderHeight();
// ウィンドウのリサイズ時にも高さを更新
window.addEventListener("resize", updateHeaderHeight);
function updateHeaderHeight() {
const headerHeight = header.getBoundingClientRect().height;
document.documentElement.style.setProperty("--header-height", `${headerHeight}px`);
console.log(`ヘッダーの高さ: ${headerHeight}px`); // 確認用のログ
}
});-var(–header-height) が使えなかった
最初は var(--header-height) を使っていたけれど、値が無効と表示されてしまった。
その後、calc(-1 * var(--header-height)) に変更したところ、-var(--header-height) が無効になる場合でも、正しく計算されることがあるとわかった。
calc() は、CSSプロパティの値を動的に計算できる関数。
たとえば calc(-1 * var(--header-height, 0px)) は、CSS変数 --header-height を取得して、それに -1 をかけることで負の値に変換している。
このとき、var(--header-height, 0px) の第2引数のフォールバック値として 0px を指定している。
つまり、--header-height がまだ設定されていない場合でも、値が 0px として扱われ、CSSが無効にならずに済むようになっている。