速報

SageMaker SDKの既定バケットに所有者確認漏れ|成果物の改変を防ぐ更新と点検

CATEGORY

【Vue.js】v-if・v-showのtransitionでスクロールバーが表示される

※本ページのリンクにはプロモーションが含まれています。

【Vue.js】v-if・v-showのtransitionでスクロールバーが表示される

目次

本記事では、Vue.jsのv-ifやv-showのtransitionでスクロールバーが表示される場合の対処法をご紹介しています。

Vue.jsでv-ifやv-showで要素を表示する際にtransitionを使用すると、アニメーション時にスクロールバーが表示されるんだけど、非表示にする方法ないかな?

上記の疑問にお答えします。

本記事では下記バージョンのVue.jsで動作確認をしております。

  • Vue.js:v3.2.20

では、解説していきます。

スポンサーリンク

スクロールバーが表示される原因

v-ifやv-showで条件に応じてレンダリングする要素を切り替えると、処理中に一時的に切り替え前・切り替え後の要素が表示されます。その際に二つの要素を足した高さが親要素の高さを超えると、スクロールバーが表示されます。

v-ifやv-showで切り替えを行うと一瞬のことなのであまり気にならないですが、transition等でアニメーションを付与すると、スクロールバーの表示が気になります。下記にデモをご用意しましたので、ボタンをクリックして二つの要素が切り替わる際の動作をご確認ください。

See the Pen 7299-1 by ryohei (@intotheprogram) on CodePen.

上記デモは極端な例ですが、やっぱりスクロールバーがあると気になりますよね。なのでスクロールバーを非表示にする対処法を2パターンご紹介したいと思います。

CSSで親要素にスタイルを追加する

要素のスクロールバーを非表示する場合、overflowプロパティを使用します。親要素のスタイルにoverflow: hiddenとheight(autoや100%は除く)を追加することでスクロールバーを非表示にすることができます。

HTML

<div id="app">
    <transition>
        <section v-if="show">1</section>
    </transition>
    <transition>
        <section v-if="!show">2</section>
    </transition>
    <button v-on:click="toggle">Click Me!</button>
</div>

CSS

#app {
    height: 100vh;
    overflow: hidden;
}

DEMO

See the Pen 7299-2 by ryohei (@intotheprogram) on CodePen.

スクロールバーが非表示になっていますね。CSSによる対応は以上となります。

スポンサーリンク

JavaScripttでスクロールバーを非表示にする

CSSを試してみたけど、高さの指定等の理由で対応できない場合はJavaScriptでスクロールバーを非表示にする方法が良さそうです。処理の流れは下記のようになります。

  • 親要素のclientHeightを取得・設定する
  • 親要素のスクロールバーを非表示にする
  • transitionのアニメーション終了後に再度スクロールバーを表示する

下記にサンプルを掲載しています。他にも効率の良い方法はあると思うので、参考程度にしていただければ幸いです。

HTML

<div id="app">
    <transition>
        <section v-if="show">1</section>
    </transition>
    <transition>
        <section v-if="!show">2</section>
    </transition>
    <button v-on:click="toggle">Click Me!</button>
</div>

CSS

.v-enter-from, .v-leave-to {
    opacity: 0;
    transition: .3s;
}

.v-leave-from, .v-enter-to {
    opacity: 1;
    transition: .3s;
}

JavaScript

const App = {
    data() {
        return {
            show: true,
        }
    },
    methods: {
        toggle(){
            this.height()
            this.hidden()
            this.visible()
            this.show = !this.show
        },
        height(){
            document.getElementById('app').style.height = document.getElementById('app').clientHeight + 'px'
        },
        hidden(){
            document.getElementById('app').style.overflowY = 'hidden'
        },
        visible(){
            setTimeout(function () {
                document.getElementById('app').style.overflowY = 'auto'
            }, 350)
        }
    }
}

Vue.createApp(App).mount('#app')

DEMO

See the Pen 7299-3 by ryohei (@intotheprogram) on CodePen.

以上でJavaScriptでスクロールバーを非表示にすることができました。

最後に

Vue.jsのtransitionはあまり使ったことがなかったので実装時に一部詰まる場面がありました。ただ、transition要素でアニメーションしたい要素をラップするだけで実装できるのは、かなり便利です。一度コツをつかんでしまえばわかりやすい機能ですので、今後も末永く使っていきたいと思います!

以上、Vue.jsでv-if・v-showのtransitionでスクロールバーが表示される場合の対処法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、ヒアリングや進行管理から、コーディング、CMSの構築、システム開発、サーバーの構築・保守・運用まで、Webサイト制作の工程を幅広く担当しています。Webサイトは、これまでに100以上の構築・保守を手がけてきました。

個人でもWebサイトの制作・改修やWebアプリの開発・運用を行い、AIを活用した開発にも取り組んでいます。近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
Webサイト構築・保守・運用 / HTML/CSS / JavaScript / PHP / WordPress / サーバー構築・保守・運用 / アプリ開発 / セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
PHP8技術者認定ウィザード
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

関連する記事

おすすめの書籍

キーワードから探す

スポンサーリンク