タイトルのとおりなのですが、Bluma CSSでNavbarのレスポンシブ対応の一環でハンバーガーメニューを実装しようとしました。

こういうやつ


まあ要するに、こういうやつを実装したいです。

JavaScript自分で書かないといけない


んでまあ、こういうの、フレームワークですしコピペすればいけるんかな?と思ったらダメなんですね。ドキュメントに書いてあるんですがJavaScriptでほげほげしてあげないとダメなんですよ。

The Bulma package does not come with any JavaScript. Here is however an implementation example, which toggles the class is-active on both the navbar-burger and the targeted navbar-menu, in Vanilla Javascript.

フロントエンド超絶わからないおじさんにこんなことさせるんかいな。というのとVanilla Javascriptとかいう単語が出てきた時点で「んはぁ~~ん」という気持ちが発生した[1]のですが、文句を言ったところで何も進まないので実装することにします。

実装


前述のドキュメントを読むとnavbar-burgernavbar-menuのclassにis-activeを付ければいいのがわかります。is-activeの有無でハンバーガメニューの表示非表示を変えるんですね。これをVue.jsでやるにはクラスとスタイルのバインディングに書いている通りです。

コード


というわけで実装した。下記のサンプルはNuxt.jsでやったものをほぼそのままコピペしてますが、まあ普通にVue.jsでやるときもほぼ一緒です。

ハンバーガメニューをクリックしたらchangeBurgerVisibillityメソッドが呼ばれてclassis-activeが付いたり消えたりします。後はコード見てください。よろしく。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<template>
<nav class="navbar" role="navigation" aria-label="main navigation">
<!--
このdivがハンバーガメニューに該当する
クリックしたらchangeBurgerVisibillityが呼ばれて class に is-active が付与されたり消えたりする
-->
<div role="button"
class="navbar-burger burger"
aria-label="menu" aria-expanded="false"
v-on:click="changeBurgerVisibillity"
v-bind:class="{ 'is-active': burgerVisibillity }"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</div>
<!--
ハンバーガメニューをクリックするとこっちの class も is-active が付与されたり消えたりする
-->
<div class="navbar-menu" v-bind:class="{ 'is-active': burgerVisibillity }">
<div class="navbar-start">
<a class="navbar-item">
Home
</a>
</div>
<div class="navbar-end">
<a class="navbar-item">
Blog
</a>
</div>
</div>
</nav>
</template>

<script>
export default {
data() {
return { burgerVisibillity: false };
},
methods: {
changeBurgerVisibillity() {
this.burgerVisibillity = !this.burgerVisibillity;
}
}
};
</script>

おわり。


  1. Vanilla JSはNativeのJSのことで、知ってたのでいいんですが素直にNativeと言えや!!という気持ちになりました ↩︎