LoginSignup
3
4

More than 3 years have passed since last update.

Nuxtでモーダル実装時に背景がスクロールできてしまう時の対処法

Posted at

モーダルコンポーネントを作る

<template>
  <transition name="modal">
    <div class="modal-mask" @click="closeModal">
      <div class="modal-wrapper">
        <div class="modal-container" @click.stop>
          <div class="modal-contents">
            <slot></slot>
          </div>
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
export default {
  name: "TheModal",
  methods: {
    closeModal() {
      this.$emit("closeModal");
    }
  }
};
</script>

<style scoped>
省略
</style>

ソースコードはこちら

pageコンポーネントのtemplateで以下のように呼び出し

<TheModal v-show="showModal" @closeModal="showModal = false">
 モーダル
</TheModal>

結果

スクリーンショット 2019-11-19 15.59.08.png

しかし、このままだとモーダルを表示した状態でも後をスクロールすることができてしまう。

スクリーンショット 2019-11-19 16.09.20.png

解決方法

モーダルが表示されているときにbodyタグに以下のクラスを付与する。

modal-body {
  overflow-y: hidden;
  position: fixed;
}

bodyにクラスを付与するためにグローバルに読み込まれているCSSなどに上のクラスを定義しておく。

ページコンポーネントのhead()に以下を設定する

<script>
import Logo from "~/components/Logo";
import TheModal from "~/components/TheModal";

export default {
  components: {
    Logo,
    TheModal
  },
  data() {
    return {
      showModal: false
    };
  }
  // ↓追加↓
  head () {
    return {
      bodyAttrs: {
        class: this.showModal ? 'modal-body' : ''
      }
    }
  },
};
</script>

this.showModalがtrueの時(モーダルが表示されている)にbodyタグに
modal-bodyクラスを付与することができ背景をスクロールさせなくできます。

3
4
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
3
4