<header id="header" class="header">
  <div class="header-content">
    <div class="header-logo">Logo</div>
    <nav class="header-nav">
      <a href="#" class="nav-link">Home</a>
      <a href="#" class="nav-link">About</a>
      <a href="#" class="nav-link">Contact</a>
    </nav>
  </div>
</header>
<div id="log" class="log-messages">
  <ul></ul>
</div>
<main class="main">
  <div class="card">
    <h2>コンテンツセクション1</h2>
    <p>スクロールしてヘッダーの動作を確認してください。</p>
  </div>
  <div class="card">コンテンツカード2</div>
  <div class="card">コンテンツカード3</div>
  <div class="card">コンテンツカード4</div>
</main>
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  min-height: 200vh;
  font-family: Arial, sans-serif;
}

/* ヘッダー */
.header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 60px;
  background: white;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  transition: transform 0.3s ease;
  z-index: 1000;
}

.header--hidden {
  transform: translateY(-100%);
}

.header-content {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 20px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.header-logo {
  font-size: 1.5rem;
  font-weight: bold;
}

.header-nav {
  display: flex;
  gap: 20px;
}

.nav-link {
  color: #333;
  text-decoration: none;
}

.main {
  max-width: 1200px;
  margin: 60px auto 0; /* ヘッダーの高さ分マージン */
  padding: 20px;
}

.card {
  background: #f5f5f5;
  padding: 20px;
  margin-bottom: 20px;
  border-radius: 8px;
  height: 320px;
}

/* Observe 状態のログを右下に固定表示 */
.log-messages {
  position: fixed;
  bottom: 20px;
  right: 20px;
  background: rgba(0, 0, 0, 0.7);
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
  font-size: 0.9rem;
  z-index: 1001;
  width: 300px;
  max-height: 150px;
  overflow-y: auto;
}

.log-messages ul {
  padding: 0;
  margin: 0;
  list-style-type: none;
}

.log-messages li {
  margin-bottom: 5px;
}
View Compiled
// ヘッダーとログのDOM要素を取得
const header = document.getElementById("header");
const logContainer = document.querySelector(".log-messages ul");

// 初期状態
let lastScrollTop = 0; // 前回のスクロール位置を記録
let eventCount = 0; // イベント発生回数を記録

// スクロールイベントのリスナー
window.addEventListener("scroll", () => {
  // 現在のスクロール位置を取得
  const scrollTop = window.pageYOffset || document.documentElement.scrollTop;

  // スクロール位置に応じてヘッダーを表示/非表示
  if (scrollTop > lastScrollTop) {
    // 下方向にスクロール
    header.classList.add("header--hidden");
    logMessage("Header Hidden");
  } else {
    // 上方向にスクロール
    header.classList.remove("header--hidden");
    logMessage("Header Shown");
  }

  // 前回のスクロール位置を更新
  lastScrollTop = scrollTop;

  // 非効率な部分: ログを更新し続ける
  logMessage(`Scroll Position: ${scrollTop}`);
});

// 非効率なログの更新関数
function logMessage(message) {
  // イベント発生回数をインクリメント
  eventCount++;

  // 現在時刻を取得
  const now = new Date().toLocaleTimeString();

  // ログにメッセージを追加(過剰なDOM操作)
  const logEntry = document.createElement("li");
  logEntry.textContent = `${eventCount}. ${now} - ${message}`;
  logContainer.appendChild(logEntry);

  // 古いログを削除(最大6件まで)
  if (logContainer.children.length > 6) {
    logContainer.removeChild(logContainer.firstChild);
  }
}
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.