bootstrap-vue меняет положение ‹b-modal›

По умолчанию <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> и стилизовать его. Ничего не получилось. Пожалуйста помоги.


person Minjun Yu    schedule 23.04.2018    source источник
comment
@Sphinx спасибо, но он все еще не работает.   -  person Minjun Yu    schedule 24.04.2018


Ответы (4)


Если вы хотите поместить модальное окно в определенную позицию, ниже представлено мое решение:

  1. добавить определенный класс в <b-modal> его props = modal-class

  2. затем добавьте свои стили в myclass > div

Вы можете заглянуть в github (строка #: 176), Bootstrap-vue поместит один div.modal-content (включая header / body / foot) в один div с class = "modal-dialog", который является прямым потомком root.

Вот почему в приведенном выше решении используется селектор css = .myclass > div.

Если вы посмотрите на дерево dom: структура одного модального файла bootstrap-vue будет:

один корневой div (сюда будет добавлен myclass) -> один div с модальным диалогом -> один div с модальным содержимым -> header / body / footer

Ниже приведен один пример: (Я установил другой цвет фона для модального диалога и модального содержимого.)

app = new Vue({ //not vue, it is Vue
  el: "#app",
  data: {
    myclass: ['myclass']
  },
  methods: {
    showModal: function(){
      this.$refs.myModalRef.show()
    }
  }
})
.myclass > div {
  position:absolute !important;
  top: -10px !important;
  left: -10px !important;
  background-color:yellow !important;
}

.myclass > .modal-dialog > .modal-content {
  background-color:red !important;
}
<!-- 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/[email protected]/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>

person Sphinx    schedule 23.04.2018
comment
спасибо, +1. Я вижу твои работы. с моей стороны он все еще не работает. У меня немного другая настройка. Мой <b-modal> завернут в <AppModal> компонент, который используется в другом компоненте. myclass правильно прикреплен к корневому тегу <b-modal>, но его прямой дочерний элемент не имеет стиля. Другими словами, myclass > div по какой-то причине не работает. - person Minjun Yu; 24.04.2018
comment
@MinjunYu, не имеет значения, что является родительским для <b-modal>, вероятно, это вызвано другой версией. Вы можете открыть своего веб-разработчика, затем проверить дерево dom на наличие <b-modal> и, наконец, применить соответствующий селектор css. или вы можете добавить html в вопрос, мы можем помочь вам оттуда. - person Sphinx; 24.04.2018
comment
@MinjunYu .myclass > .modal-dialog > .modal-content этот тоже не работает? - person Sphinx; 24.04.2018
comment
Нет, этот тоже не работает. Я поместил соответствующие компоненты html source и vue. Спасибо! - person Minjun Yu; 24.04.2018
comment
@MinjunYu, я видел ваш исходник html, он почти такой же, как мой. Могу я узнать, где вы определяете CSS? в одном глобальном файле css или в текущем виде с <style>? - person Sphinx; 24.04.2018
comment
@MinjunYu, это должно быть вызвано спецификой css. add !important сможет исправить текущую проблему, с которой вы столкнулись. проверьте обновленное. - person Sphinx; 24.04.2018

я использую

<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

person evavargas    schedule 08.02.2021

Может быть, вы могли бы попробовать что-нибудь вроде margin-top: 100px.

person Valentin    schedule 23.04.2018

Я думаю, это из-за точки останова @media Bootstrap. Затем в <style> вы просто переопределяете его.

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