🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Nuxt.js

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

Vuetify.js

Vuetify.jsは、マテリアルデザインを基本とするVue.jsのCSSフレームワークです。多くのマテリアルデザインのコンポーネントを提供しており、あらゆるアプリケーションに対応可能。vue-cli用テンプレートがあり、簡単にページを作成できます。

Q&A

解決済

1回答

2895閲覧

Vuetifyのv-paginationにtransitionを付けたい

asasaas

総合スコア26

Vue.js

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

Nuxt.js

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

Vuetify.js

Vuetify.jsは、マテリアルデザインを基本とするVue.jsのCSSフレームワークです。多くのマテリアルデザインのコンポーネントを提供しており、あらゆるアプリケーションに対応可能。vue-cli用テンプレートがあり、簡単にページを作成できます。

0グッド

0クリップ

投稿2021/01/20 15:53

編集2021/01/21 05:33

Nuxt.jsにて作成したブログにVuetifyのv-paginationを導入しました.
ページネーションを利用してブログ一覧のページを変更する際,transitionがなく切り替わってしまうのでtransitionを利用したページ遷移アニメーションのようなものを付けたいのですが,どこにつければ良いのか分かりません.

いくつかの部分にtransitionを付けてみたのですがいづれも反映されませんでした.
これは,パスの変更が発生しないのでtransitionが発生しないという認識であっているのでしょうか.
また,遷移アニメーションを付ける方法があればお伺いしたいです.

追記
記事データはCMSであるcontentfulから取得しています.

vue

1//index.vue 2 3<template> 4 <div> 5 <section class="p-posts"> 6 <Card 7 v-for="post in pagePosts" 8 :key="post.fields.slug" 9 :title="post.fields.title" 10 :slug="post.fields.slug" 11 :header-image="post.fields.headerImage" 12 :published-at="post.fields.publishedAt" 13 :tag="post.fields.tag.fields.tag" 14 :tag-slug="post.fields.tag.fields.tagSlug" 15 /> 16 </section> 17 <article class="pagination"> 18 <v-pagination 19 v-model="page" 20 :length="length" 21 :circle="true" 22 color="#00aca3" 23 @input = "pageChange" 24 /> 25 </article> 26 </div> 27</template> 28 29<script> 30import { createClient } from "~/plugins/contentful.js"; 31 32const client = createClient(); 33export default { 34 transition: "fade", 35 data () { 36 return { 37 page: 1, 38 pagePosts: [], 39 pageSize: 6, 40 length:0, 41 } 42 }, 43 async asyncData({ env, params }) { 44 return await client 45 .getEntries({ 46 content_type: env.CTF_BLOG_POST_TYPE_ID, 47 order: "-fields.publishedAt", 48 }) 49 .then(entries => { 50 return { 51 posts: entries.items 52 }; 53 }) 54 .catch(console.error); 55 }, 56 mounted: function(){ 57 this.posts 58 this.pagePosts = this.posts.slice(0,this.pageSize) 59 this.length = Math.ceil(this.posts.length/this.pageSize); 60 }, 61 methods: { 62 pageChange: function(pageNumber){ 63 this.pagePosts = this.posts.slice(this.pageSize*(pageNumber -1), this.pageSize*(pageNumber)) 64 }, 65 }, 66}; 67</script> 68 69<style> 70.fade-enter-active, 71.fade-leave-active { 72 transition: all .5s ease-out; 73} 74 75.fade-enter, 76.fade-leave-to { 77 opacity: 0; 78} 79 80.fade-enter { 81 transform: translateY(15px); 82} 83 84.pagination { 85 margin-top: 64px; 86} 87</style> 88

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

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

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

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

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

guest

回答1

0

ベストアンサー

Vue.jsのtransitionを利用すると良いと思いました。

まず、記事表示部分 Cardタグを transitionタグで囲い、Cardタグにv-show="show"を追加してみました。

HTML

1<section class="p-posts"> 2 <transition name="fade"> 3 <Card 4 v-show="show" 5 v-for="post in pagePosts" 6 :key="post.fields.slug" 7 :title="post.fields.title" 8 :slug="post.fields.slug" 9 :header-image="post.fields.headerImage" 10 :published-at="post.fields.publishedAt" 11 :tag="post.fields.tag.fields.tag" 12 :tag-slug="post.fields.tag.fields.tagSlug" 13 /> 14 </transition> 15</section>

次に dataにshowを追加します。初期値:true

Vue

1data () { 2 return { 3 page: 1, 4 pagePosts: [], 5 pageSize: 6, 6 length:0, 7 show: true 8 } 9}

最後に pageChange関数を以下のようにしました。

Vue

1pageChange: function(pageNumber){ 2 this.show = false; 3 this.pagePosts = this.posts.slice(this.pageSize*(pageNumber -1), this.pageSize*(pageNumber)) 4 window.setTimeout(() => { 5 this.show = true; 6 }, 500); 7 8 }

ご定義いただいているstyleをそのまま利用します。
Cardコンポーネントをdivタグで代用し上記で動作いたしました。

もっと良い方法があるかもしれませんが、ご参考になれば幸いです。

投稿2021/01/21 05:07

編集2021/01/21 09:26
Twoshi

総合スコア354

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

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

asasaas

2021/01/21 05:35

ご回答ありがとうございます. こちら記述不足で誤解させてしまい申し訳ありませんが,記事データはCMSより取得し,メソッドで表示する記事一覧の変更を行っています. コードの追記をしましたので確認いていただけると助かります.
Twoshi

2021/01/21 09:11

ご質問の追記ありがとうございます! 上記承知いたしました! 回答修正いたします。 よろしくお願いいたします。
asasaas

2021/01/21 13:02

ご回答ありがとうございます. こちら試したところ,Cardを1ページで全て表示したときの位置にtransitionで現れてから移動するという現象が発生してしまいます. 1ページあたりのCard表示数を2とした場合,電卓でいう7,8の部分に表示されていた2枚のCardがフェードアウトすると同時に9,4の位置に新しいCardがフェードインし,それが終わってから7,8の位置に移動するといった感じです. Twoshiさんの実装ではこのような現象は発生しませんでしたでしょうか?
asasaas

2021/01/21 13:26

すいませんこちらはv-showの記述漏れによるもので解決しました. しかし,現状transitionのフェードアウトが効かない状態です.
asasaas

2021/01/21 13:33

>>しかし,現状transitionのフェードアウトが効かない状態です. こちらの問題はpageChange内のpagePostsを変更する式をsetTimeout内に移動することで解決致しました! showをtrueからfalseに変更し終わってから表示Cardの変更を行うと同時にshowをtrueにするといったことですね,とても参考になりました. 以上,特に問題がなければベストアンサーを選び質問を閉じさせていただきます.
Twoshi

2021/01/21 14:00

ご確認いただきありがとうございます! 解決されてよかったです! > こちらの問題はpageChange内のpagePostsを変更する式をsetTimeout内に移動することで解決致しました! こちらの変更タイミングまで行き届いておらず、お手数をおかけしましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問