<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
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.