Сфера Bootstrap Css в Vue
Я пытаюсь использовать Bootstrap в компоненте Vue, и я хочу, чтобы весь CSS был ограничен. Я попробовал что-то вроде этого:
<style scoped>
@import "~bootstrap/dist/css/bootstrap.css";
@import "~bootstrap-vue/dist/bootstrap-vue.css";
</style>
Но не похоже, что CSS ограничен. Есть ли способ сделать это?
6 ответов
<style scoped src="~bootstrap/dist/css/bootstrap.css"></style>
<style scoped src="~bootstrap-vue/dist/bootstrap-vue.css"></style>
Обновление: взлом с использованием SCSS
Причина, по которой первое решение не будет работать:
В области видимости стили родительского компонента не проникают в дочерние компоненты.
Если вы хотите, чтобы селектор в стилях областей был "глубоким", то есть влиял на дочерние компоненты, вы можете использовать комбинатор >>>
Упомянутый вами модал явно не контролируется компонентом, в который вы импортировали начальную загрузку. Возможно, это дочерний компонент. Возможно, вы используете jquery-версию Bootstrap. В любом случае, атрибуты данных не будут добавлены к модальному.
Чтобы решить эту проблему, вам нужен Deep Selector. (вы можете прочитать об этом более подробно в https://vue-loader.vuejs.org/en/features/scoped-css.html)
Вот как я могу импортировать весь Bootstrap CSS, используя SCSS. (Я думаю, что это невозможно сделать, используя только чистый CSS.)
<template>
<div class="main-wrapper">
/* ... */
</div>
</template>
<style scoped lang="scss">
.main-wrapper /deep/ {
@import "~bootstrap/dist/css/bootstrap.min";
}
</style>
Некоторые препроцессоры, такие как Sass, могут не иметь возможности правильно проанализировать >>>. В этих случаях вы можете использовать /deep/ combinator - это псевдоним для >>> и работает точно так же.
Сгенерированный CSS будет похож на
.main-wrapper[data-v-656039f0] .modal {
/* some css... */
}
.. чего ты хочешь
НО, я должен сказать, что импортирование всего Bootstrap CSS - очень плохая практика. Попробуйте импортировать только то, что вы собираетесь использовать из bootstrap-sass.
Это решение взломано. Но это единственный способ, который я знаю, который может работать для вашего случая использования.
Я знаю, что это старый вопрос, но это решение работает для меня
<style lang="scss" scoped>
::v-deep {
@import 'bootstrap/scss/bootstrap.scss';
}
</style>
Я хотел использовать Vuetify в моем приложении только на странице, и это разбило мой CSS, тогда я использую
<style scoped src="vuetify/dist/vuetify.min.css"></style>
и теперь все работает отлично.
<template>
<div> ....... </div>
</template>
<style scoped src="vuetify/dist/vuetify.min.css"></style>
<script> ...... </script>
Они изменили
::v-deep
селектор в Vue 3, старый метод все еще работает, но устарел (что может привести к множеству сообщений об устаревании в вашей сборке, если вы импортируете css / scss таким образом).
Итак, для записи, вот как вы поступили бы в Vue 3:
<template>
<div class="main-wrapper">
<div class="bootstrap-scope">
/* All children that need Bootstrap including slotted content etc */
</div>
</div>
</template>
<style scoped lang="scss">
.main-wrapper::v-deep(.bootstrap-scope) {
@import "~bootstrap";
}
</style>
Вы также можете опустить
div.main-wrapper
и выберите корневой компонент SFC div. Допустим, имя вашего компонента
my-awesome-component
селектор будет:
<style scoped lang="scss">
.my-awesome-component::v-deep(.bootstrap-scope) {
@import "~bootstrap";
}
</style>
Или, если вы предпочитаете не использовать сгенерированное имя класса, вы также можете выбрать:
<style scoped lang="scss">
div:first-child::v-deep(.bootstrap-scope) {
@import "~bootstrap";
}
</style>
В реальном shadowDom вы должны использовать
:host
селектор, чтобы выбрать корень вашего компонента, что сделает его более кратким, но, насколько я понимаю (https://github.com/vuejs/vue-loader/issues/1601), команда vue-loader еще не решила что с этим делать.
В
:deep()
selector имеет небольшой раздел, посвященный ему в официальных документах Vue 3: https://v3.vuejs.org/api/sfc-style.html#deep-selectors
Также есть VueJS RFCS на глубоком селекторе, который более подробно описывает, почему он продолжает меняться: https://github.com/vuejs/rfcs/blob/master/active-rfcs/0023-scoped-styles-changes.md
Для меня это было решением, чтобы заставить его работать и предотвратить утечку:
<style lang="less" scoped>
::v-deep {
@import (less) "../node_modules/vuetify/dist/vuetify.min.css";
}
</style>
Приведение к меньшему, очевидно, также может быть изменено на scss.
Обратите внимание, читая решение сегодня:
Атрибут scoped устарел и будет удален. Не используйте это.