首页 > 解决方案 > (Vue.js) 在模态中滚动也会滚动到模态的后面

问题描述

单击图像会弹出一个长的滚动模式。问题是,如果您在模态中滚动也会滚动模态的背面。你如何解决它?

模态是一个组件。这是我的代码:

轮播.vue

<template>
  <div>
    <div v-for="(item, index) in photos" :key="index">
      <div @click="imgClick(item)" style="cursor:pointer;">
        <img :src="item.thumbnail" />
      </div>
      <Modal v-if='item.show' @close="item.show = false">
        <div slot='body'>
          <img :src="item.thumbnail" :class="`img-index--${index}`"/>
        </div>        
      </Modal>
    </div>
  </div>
</template>

<script>
import Modal from './Modal.vue'
export default {
  props: {
    items: { type: Array, default: () => [] }
  },
  data() {
    return {
      photos: {}
    }
  },
  created() {
    this.photos = this.items.map(item => {
      return { ...item, show: false }
    })
  },
  methods: {
    imgClick(item) {
      item.show = true
    }
  },
  components: {
    Modal: Modal
  }
}
</script>

标签: vue.jsscrollmodal-dialogpopupmodalpopup

解决方案


大多数模态包通过在打开模态时将类应用于<body>标记来解决此问题。例如,<body class="modal-open">。然后在您的应用程序的 CSS 中,您可以添加以下规则:

body.modal-open {
  overflow: hidden;
}

这将使模式后面的页面不再可滚动。

无论您使用哪个模态包,都可能在模态打开或关闭时触发事件。您可以将此类应用于事件处理程序中的<body>标记,并从事件处理程序中的标记中open删除该类。<body>close


更新

根据您添加的代码,您可以通过以下方式切换标签modal-open上的类:<body>

...

<div @click="showModal(item)" style="cursor:pointer;">
  <img :src="item.thumbnail" />
</div>
<Modal v-if='item.show' @close="hideModal(item)">
  <div slot='body'>
    <img :src="item.thumbnail" :class="`img-index--${index}`"/>
  </div>        
</Modal>

...

{
...

methods: {
  showModal(item) {
    item.show = true
    document.body.classList.add("modal-open");
  },
  hideModal(item) {
    item.show = false;
    document.body.classList.remove("modal-open");
  }
},

...
}

请参阅此jsFiddle以供参考。


推荐阅读