可変ヘッダーの高さ分のネガティブマージンを設定

苦戦したのでまとめます。

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が無効にならずに済むようになっている。

コメントを残す

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください