📝
CCSのみでメニュー表示切替
はじめに
ちゃんと知っておきたい人のHTML/CSS完全入門でHTML/CSSの学習で最も良いとされている実践的な勉強方法は「模写」であると書いてあったので、Writeー書くためのテーマを模写し始めたが、メニューの表示でいきなり詰まってしまいました。HTMLとCSSの本だから、JavaScriptを使わずにできるのかと思い調べたらできました。
CCSのみで切り替える流れ
① チェックボックスを非表示にして利用
<input type="checkbox" id="menu-toggle" class="menu-button" />
② Labelのfor属性でクリックしたときにチェックボックスと連動する
<label for="menu-toggle" class="menu-label">☰ メニュー</label>
③ チェックボックスが":checked"のときは"~"で同階層の後にあるmenuクラスを指定し、Displayオプションで.menuを表示
.menu-button:checked ~ .menu {
display: block;/*表示しない*/
}
④ チェックボックスが":checked"ではないときは"、その前にdisplay:noneに設定したあるので表示しない
.menu {
display: none;/*表示する*/
}
CCSのみで切り替えるコード全体
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSSのみのメニュー表示切替</title>
<style>
html.body{
font-size: large;
}
/*check buttonは機能だけ残して非表示*/
.menu-button {
display: none;
}
/* labelがボタン代わりになる */
.menu-label {
display: block;
background-color: #333;
color: #fff;
padding: 10px;
text-align: right;
cursor: pointer;
}
/* メニューのスタイル */
.menu {
background-color: #f4f4f4;
padding: 20px;
position: absolute;
top: 50px;
right: 0;
width: 200px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
display: none;/*表示しない*/
}
/* チェックされた場合にメニューを表示 */
.menu-button:checked ~ .menu {
display: block;/*表示する*/
}
</style>
</head>
<body>
<!-- メニューボタン -->
<input type="checkbox" id="menu-toggle" class="menu-button" />
<label for="menu-toggle" class="menu-label">☰ メニュー</label>
<!-- メニュー内容 -->
<nav class="menu">
<ul>
<li><a href="#">ホーム</a></li>
<li><a href="#">カスタマイズ</a></li>
<li><a href="#">ページ</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>
</body>
</html>
JavaScriptとCSSで切り替える流れ
①ページを開いたとき、bodyのclass属性にmenu-closeがあり、menu-openはない状態
<body>
<button class="menu-button">☰ メニュー</button>
</body>
②ボタンをクリックするたびに、menu-openが割り当たる
<script>
// ボタンとbody要素を取得
const button = document.querySelector(".menu-button");
const body = document.body;
// ボタンがクリックされたときにクラスを切り替える
button.addEventListener("click", () => {
// ②
body.classList.toggle("menu-open");
});
</script>
③bodyにmenu-openがあるときはdisplay: block;で表示する
body.menu-open .menu {
display: block;/*表示する*/
}
④bodyにmenu-openがないときはその前にdisplay:noneに設定したあるので表示しない
.menu {
display: none;/*表示しない*/
}
JavaScriptとCSSで切り替えるコード全体
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>JavaScriptでメニュー表示切替</title>
<style>
html.body{
font-size: large;
}
/* ボタンスタイル */
.menu-button {
width: 100%;
position: fixed;
background: #333;
color: #fff;
border: none;
padding: 10px;
text-align: right;
cursor: pointer;
}
/* メニューのスタイル */
.menu {
background-color: #f4f4f4;
padding: 20px;
position: absolute;
top: 50px;
right: 0;
width: 200px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
display: none;/*④*/
}
/* bodyのclassにmenu-openがあるときにメニューを表示 */
body.menu-open .menu {
display: block;/*③*/
}
</style>
</head>
<body>
<!-- トグルボタン -->
<button class="menu-button">☰ メニュー</button>
<!-- メニュー -->
<nav class="menu">
<ul>
<li><a href="#">ホーム</a></li>
<li><a href="#">カスタマイズ</a></li>
<li><a href="#">ページ</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>
<script>
// ボタンとbody要素を取得
const button = document.querySelector(".menu-button");
const body = document.body;
// ボタンがクリックされたときにクラスを切り替える
button.addEventListener("click", () => {
body.classList.toggle("menu-open");
});
</script>
</body>
</html>
まとめ
Writeー書くためのテーマを確認してみると、JavaScriptとCSSで切り替える方法だった。こちらの方が分かりやすいし後々拡張しやすいので、こちらを使用していこうと思いました。
Discussion
CCSって新しい言語ですか?