1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Vuetify のメニュー(v-menu)を DOM 内のスクロールに追随させる方法

Posted at

はじめに

Vuetify の v-list 内で v-menu を表示したときに、スクロールに応じてメニューが追随しない問題の対応方法を記載します。
実装内容は大したことはないですが、思いのほか調査に時間がかかりましたので、誰かの参考になればと投稿します。

実現方法

v-menuattach オプションを指定するだけでした。

attach の説明文は以下の通り。

Specifies which DOM element that this component should detach to.String can be any valid querySelector and Object can be any valid Node. This will attach to the root v-app component by default.

結局は v-menu の DOM をどこに格納するか、ってだけの話ですね。
今まで jQuery で散々こういった対応をしてきたはずなのに、流行りのフレームワークを利用した開発だと最終的に出来上がる DOM をイメージする機会が減っているようで、盲点でした。

最終的な Vue template の抜粋配下通りです。
ポイントは v-list-item に適当なクラスを定義して v-menuattach を指定するところです。
Vuetify を使ったの開発で css selector を書いたのは初めてかも?

<template>
  <v-layout>
    <v-navigation-drawer>
      <v-list>
        <v-list-item-group>
          <template v-for="item in items">
            <v-list-item :class="`list-item-${item}`">
              <v-list-item-content>
                <v-list-item-title>{{ item }}</v-list-item-title>
              </v-list-item-content>
              <v-menu
                :attach="`.list-item-${item}`"
                left
                offset-y
              >
              </v-menu>
            </v-list-item>
          </template>
        </v-list-item-group>
      </v-list>
    </v-navigation-drawer>
  </v-layout>
</template>

ちょっとしたポイント

メニューを追随させるだけなら attach の指定だけでいいですが、
v-navigation-drawer と併用した場合、ドロワーからはみ出た DOM は表示されないため、ドロワー内に収める必要があります。
そのため、ここでは v-menuleft を指定しています。

おわりに

記載内容は、https://markdown.aprifield.com (Markdown でメモを取って Google Drive に保存するサービス) を開発中に調査した内容です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?