JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

CSSとJavaScriptで作る!左からスライドするオフキャンバスメニューの実装方法

オフキャンバスメニューとは、普段は画面の外に隠れており、ボタン操作によってスライドインして表示されるナビゲーションメニューのことです。スマートフォンサイトやレスポンシブデザインでよく使われるUIパターンの一つで、限られた画面スペースを有効活用できます。

本記事では、CSSとバニラJavaScriptのみを使用して、画面左からスライドインするオフキャンバスメニューを作成する手順を、実際のコード例とともにわかりやすく解説します。


サンプルコード

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.sideNav {
    height: 100vh;
    width: 0;
    position: fixed;
    z-index: 1;
    top: 0;
    left: 0;
    background-color: rgb(46, 218, 195);
    overflow-x: hidden;
    padding-top: 60px;
    transition: 0.5s;
}
.sideNav a {
    padding: 8px 8px 8px 32px;
    text-decoration: none;
    font-size: 25px;
    color: #000000;
    font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    display: block;
    transition: 0.3s;
}
.sidenav a:hover {
    color: #f1f1f1;
}
.sideNav .closeBtn {
    position: absolute;
    top: 0;
    right: 25px;
    font-size: 36px;
    margin-left: 50px;
}
button {
    padding: 15px;
    background-color: rgb(0, 27, 145);
    color: rgb(255, 255, 255);
    font-size: 20px;
    border: none;
    border-radius: 2%;
}
.main-content{
    transition: 0.5s;
}
</style>
</head>
<body>
<nav class="sideNav">
<a href="#" class="closeBtn">&times;</a>
<a href="#">Login</a>
<a href="#">Register</a>
<a href="#">Home</a>
<a href="#">About Us</a>
</nav>
<main class="main-content">
<button class="openSideNav">Click here to open sideNav</button>
<h1>Here is some sample text</h1>
<p>Here is some random sample text too</p>
</main>
<script>
let openBtn = document.querySelector(".openSideNav");
openBtn.addEventListener("click", () => {
    showNav();
});
let closeBtn = document.querySelector(".closeBtn");
closeBtn.addEventListener("click", () => {
    hideNav();
});
function showNav() {
    document.querySelector(".sideNav").style.width = "300px";
    document.querySelector('.main-content').style.marginLeft = "300px";
}
function hideNav() {
    document.querySelector(".sideNav").style.width = "0";
    document.querySelector('.main-content').style.marginLeft = "0px";
}
</script>
</body>
</html>

コードのポイント解説

CSS側のポイント

  • .sideNavwidth: 0 に設定して初期状態では非表示にし、position: fixed で画面左端に固定しています。overflow-x: hidden を指定することで、メニューが閉じている間に中身がはみ出すのを防ぎます。
  • transition: 0.5s:幅の変化にアニメーションを適用し、メニューの開閉を滑らかに演出します。メインコンテンツ側にも同じ transition を指定することで、全体が一体となって動くようになります。
  • .closeBtn:「×」ボタンを absolute 配置でメニュー右上に配置し、いつでもメニューを閉じられるようにしています。

JavaScript側のポイント

  • document.querySelector() でメニューを開くボタンと閉じるボタンを取得し、それぞれに click イベントリスナーを登録しています。
  • showNav():サイドナビの style.width を "300px" に変更してメニューを展開すると同時に、メインコンテンツの marginLeft も "300px" にすることで、コンテンツを右へ押し出しています。
  • hideNav():両方の値を初期値(0)に戻し、メニューを閉じます。

このように、CSSの transition とJavaScriptのスタイル操作を組み合わせるだけで、外部ライブラリに依存しないシンプルなオフキャンバスメニューが実装できます。

実行結果

上記のコードをブラウザで開くと、まず次のような初期状態の画面が表示されます。

CSSとJavaScriptで作る!左からスライドするオフキャンバスメニューの実装方法

「Click here to open sideNav」と書かれたボタンをクリックすると、左側からナビゲーションメニューがスライドインで開き、それに合わせてメインコンテンツが右へシフトします。

CSSとJavaScriptで作る!左からスライドするオフキャンバスメニューの実装方法

まとめ

オフキャンバスメニューは、CSSの position: fixedtransition、そしてJavaScriptによるスタイルの切り替えだけで簡単に実装できます。今回の例ではインラインスタイルを直接書き換えましたが、classList.toggle() でクラスを付け替える方式にすれば、より保守しやすいコードになります。ぜひご自身のプロジェクトにも応用してみてください。

  1. CSSとJavaScriptでスナックバー/トーストを実装する方法【サンプルコード付き】

    スナックバー(トースト)は、画面の端に一時的に表示される小さな通知メッセージのことです。「保存が完了しました」などの操作結果をユーザーへ伝える際によく使われ、数秒後に自動的に消えるのが特徴です。CSSとJavaScriptを組み合わせれば、特別なライブラリを使わずとも簡単に実装できます。以下に、ボタンをクリックすると画面下部にスナックバーが表示され、数秒後にフェードアウトするサンプルコードを示します。コード例<!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu

  2. CSSとJavaScriptでアコーディオン(開閉パネル)を作成する方法をわかりやすく解説

    CSSとJavaScriptを組み合わせることで、クリックすると内容が開閉する「アコーディオン(折りたたみパネル)」を簡単に実装できます。本記事では、実際に動作するサンプルコードをもとに、その作成手順と仕組みを詳しく解説します。 アコーディオンの実装例 以下は、HTML・CSS・JavaScriptを使ってアコーディオンを実装した完全なサンプルコードです。 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, ini