質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2301閲覧

Nuxtアプリでv-showで制御するボタンが一瞬見えてしまう

hajifu

総合スコア88

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2020/02/16 18:26

作ろうとしているもの

今、Nuxtを使って簡単なホームページのようなものを作ろうとしています。
ヘッダー部分にナビゲーションとしてボタンを並べていて、スマホサイズの時はそれらをハンバーガーメニューの中にしまいたいです。

そこで下記のようなコードを書きました。

layouts/default.vue <template> <v-app dark> <v-app-bar clipped-right fixed app> <template v-for="item in items"> <v-btn v-show="!isMobile" :key="item.title" tile text height="100%" :to="item.to" >{{ item.title }}</v-btn > </template> <v-spacer /> <v-btn icon @click.stop="rightDrawer = !rightDrawer" v-show="isMobile"> <v-icon>mdi-menu</v-icon> </v-btn> </v-app-bar> <v-content> <v-container> <nuxt /> </v-container> </v-content> <v-navigation-drawer clipped v-model="rightDrawer" right temporary fixed width="100%" > 。。。

データには {title: "Home", to: "/"} などといったオブジェクトの配列が items として用意してあり、 isMobile については computed 内で

computed: { isMobile() { return this.$vuetify.breakpoint.xs } }

のように書いています。

起こっていること/お聞きしたいこと

上記のコードをスマホから開くと、PC画面の時と同じように一瞬ヘッダー内にボタンが描画されたあと、ハンバーガーメニューが出てきます。(コードでいうと <template v-for=~ > の部分)。
これをスマホから開いたときにラグなしに一発でスマホ用レイアウトが描画されるようにしたいです。

試したこと

isMobileの参照されるタイミングが悪いのかと思って、いろいろbeforeMountでdataに入れたものを監視するようにしてみたり、 v-cloak を使ってみたりしたのですが、解決しませんでした。

根本的なことのミスかもしれませんが、解決方法をご教示いただければさいわいです。
宜しくお願い致します!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CSS frameworkにVuetify.jsを利用されているという前提で回答致します。
下記のようにv-showの代わりにclassを指定する方法をお試しください。

v-show="!isMobile"の代わりにclass="hidden-xs-only"

vue

1<v-btn 2 :key="item.title" 3 tile 4 text 5 height="100%" 6 :to="item.to" 7 class="hidden-xs-only" 8> 9 {{ item.title }} 10</v-btn>

v-show="isMobile"の代わりにclass="hidden-sm-and-up"

vue

1<v-btn 2 icon 3 @click.stop="rightDrawer = !rightDrawer" 4 class="hidden-sm-and-up" 5> 6 <v-icon>mdi-menu</v-icon> 7</v-btn>

この指定では表示されない要素のcssにdisplay: noneが当たっているだけで、要素自体は存在します。
要素自体描画したくない場合はclassを下記のように変えてみてください。

  • hidden-xs-onlyd-none d-sm-flex
  • hidden-sm-and-upd-flex d-sm-none

classの意味についてはCSS Display helpers - Vuetify.jsで確認できます。

投稿2020/02/17 05:05

rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajifu

2020/02/18 15:49

お返事遅くなり申し訳ありません! 教えていただいた方法で解決できました!ありがとうございます! 追加で一つだけお聞きしてもよろしければ… hiddenで隠す方法と、noneを当てる方法、どちらもできたのですが、 noneの場合、消さない条件のときにflexを当てるのはどうしてなのでしょうか? ためしにd-xs-only-noneとしてみたらそれでも同じような挙動をしてくれたのですが、flexを当てておかないと何か不具合がでるのでしょうか??
hajifu

2020/02/18 16:06

すみません。上記についてd-xs-only-noneで消えたと書きましたが、気のせい(キャッシュのせい?)だったようです。 しかしもし制御する対象がflexボックスになることでレイアウトが変わるようなもの(複数のdivとか)だったら困るなあと思ってしまいました…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問