bootstrap-vue改变<b-modal>的位置

时间:2018-04-23 20:58:40

标签: css vue.js vuejs2 bootstrap-vue

默认情况下,<b-modal>显示在页面顶部。将属性centered添加到标记时。它居中。

但是,我想在页面顶部显示一个带有一定间隙的模态 打开主页时会显示模态。

AppModal.vue

<template>
<b-modal ref="thisModalRef" :modal-class="my-modal" size="lg" hide-header hide-footer no-close-on-backdrop hide-header-close>
    //...
</b-modal>
</template>
<script>
export default {
  data () {
    return {
      mymodal: ['mymodal']
    }
  },
  methods: {
    hideModal () {
      this.$refs.thisModalRef.hide()
    },
    showModal () {
      this.$refs.thisModalRef.show()
    }
  }
}
</script>

<style scoped>
  .mymodal > div {
    position: absolute;
    top: 300px;
    right: 100px;
    background-color: yellow;
  }
</style>

AppHome.vue

<template>
  <div>
    // omitted
    <AppModal ref="modalRef"></AppModal>
  </div>
</template>

<script>
import AppModal from './AppModal'

export default {
  components: {
    AppModal
  },
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  methods: {
    showModal: function () {
      this.$refs.modalRef.showModal()
    }
  },
  mounted () {
    this.showModal()
  }
}
</script>

<style scoped>
// ommitted
</style>

与模态相关的HTML源

<div id="__BVID__16___BV_modal_outer_">
   <div id="__BVID__16" role="dialog" class="modal fade show d-block mymodal" style="padding-right: 15px;">
      <div class="modal-dialog modal-lg">
         <div tabindex="-1" role="document" aria-describedby="__BVID__16___BV_modal_body_" class="modal-content">
            <!---->
            <div id="__BVID__16___BV_modal_body_" class="modal-body">
               // ommitted
            </div>
            <!---->
         </div>
      </div>
   </div>
   <div id="__BVID__16___BV_modal_backdrop_" class="modal-backdrop fade show"></div>
</div>

如您所见,mymodal类已正确应用。但div .modal-dialog没有我给它的css属性。

在开发工具中找到的真实css属性

.modal-dialog {
    position: relative;
    width: auto;
    margin: 0.5rem;
    pointer-events: none;
}

我尝试将自定义类添加到<b-modal>并设置样式。没有任何效果。 请帮忙。

4 个答案:

答案 0 :(得分:2)

如果你想把模态放到特定的位置,下面是我的解决方案:

  1. 通过其props = <b-modal>

  2. 将特定类添加到modal-class
  3. 然后将您的样式添加到myclass > div

  4. 您可以查看the github (line#:176),Bootstrap-vue会将一个div.modal-content(包括标题/正文/英尺)放入一个div中,其中class =&#34; modal-dialog&#34;这是root的直接孩子。

    这就是为什么上面的解决方案使用css selector = .myclass > div

    如果你看一下dom树:一个bootstrap-vue模式的结构将是:

    一个根div(myclass将添加到此处) - &gt;一个div与模态对话 - &gt;一个带模态内容的div - &gt;页眉/体/页脚

    下面是一个示例:(我为模态对话框添加了不同的背景色,模态内容。

    &#13;
    &#13;
    app = new Vue({ //not vue, it is Vue
      el: "#app",
      data: {
        myclass: ['myclass']
      },
      methods: {
        showModal: function(){
          this.$refs.myModalRef.show()
        }
      }
    })
    &#13;
    .myclass > div {
      position:absolute !important;
      top: -10px !important;
      left: -10px !important;
      background-color:yellow !important;
    }
    
    .myclass > .modal-dialog > .modal-content {
      background-color:red !important;
    }
    &#13;
    <!-- Add this to <head> -->
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css"/>
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css"/>
    
    <!-- Add this after vue.js -->
    <script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script>
    <script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script>
    <script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
    <div id="app">
        <b-button @click="showModal">
          Open Modal
        </b-button>
      <b-modal ref="myModalRef" :modal-class="myclass" size="lg">
          <h2>Test</h2>
      </b-modal>
    </div>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:1)

我用

<b-modal
    body-class="modalcart"
    ref="addToCart"
    id="addToCarModal"
    hide-footer
    hide-header
>
<b-container class="text-center modal-product-content">
  <img class="modal-image" src="~/assets/images/add-to-cart.png" alt=""/>

和:

<style lang="scss" scoped>
/deep/ .modalcart {
  font-family: 'poppins-bold';
  /deep/ .modal-product-content {
    padding: 3rem;
    margin: 0 auto !important;
    /deep/ .modal-image {
      height: 150px;
      margin-bottom: 2rem;
      }
    }
  ...
  }
  </style>

然后工作!谢谢
请记住,如果没有 body-class 和 /deep/ 我使用 node-sass、vue 3、vue-loader 15

答案 2 :(得分:0)

也许你可以尝试像margin-top: 100px这样的东西。

答案 3 :(得分:0)

我认为这是因为Bootstrap的@media断点。然后,在<style>中,您只需覆盖它。

@media (min-width: 576px) {
    .modal-dialog {
        margin: .5rem auto;
    }
}