Scope Bootstrap Css во Vue

Я пытаюсь использовать Bootstrap в компоненте Vue и хочу, чтобы весь CSS был ограничен. Я пробовал что-то вроде этого:

<style scoped>
@import "~bootstrap/dist/css/bootstrap.css";
@import "~bootstrap-vue/dist/bootstrap-vue.css";
</style>

Но не похоже, что css ограничен. Есть ли способ сделать это?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
15
0
13 188
3

Ответы 3

<style scoped src = "~bootstrap/dist/css/bootstrap.css"></style>

<style scoped src = "~bootstrap-vue/dist/bootstrap-vue.css"></style>

Обновлять: взлом с использованием SCSS

Причина, по которой первое решение не работает:

With scoped, the parent component's styles will not leak into child components.

If you want a selector in scoped styles to be "deep", i.e. affecting child components, you can use the >>> combinator

from the Vue doc for scoped CSS

Упомянутое вами модальное окно, по-видимому, не контролируется компонентом, в который вы импортировали бутстрап. Возможно, это дочерний компонент. Возможно, вы используете jquery-версию модального окна Bootstrap. В любом случае атрибуты данных не будут добавлены в модальное окно.

Чтобы решить эту проблему, вам понадобится Deep Selector. (подробнее об этом можно прочитать в https://vue-loader.vuejs.org/en/features/scoped-css.html)

Вот как я бы импортировал весь CSS Bootstrap с помощью SCSS. (Я думаю, что это невозможно сделать, используя только чистый CSS.)

<template>
  <div class = "main-wrapper">
    /* ... */
  </div>
</template>

<style scoped lang = "scss">
.main-wrapper /deep/ {
  @import "~bootstrap/dist/css/bootstrap.min";
}
</style>

Some pre-processors, such as Sass, may not be able to parse >>> properly. In those cases you can use the /deep/ combinator instead - it's an alias for >>> and works exactly the same.

Сгенерированный CSS будет похож на

.main-wrapper[data-v-656039f0] .modal {
    /* some css... */
}

.. что вы хотите.

НО, я должен сказать, что импорт всего Bootstrap CSS - действительно плохая практика. Попробуйте импортировать из bootstrap-sass только то, что вы собираетесь использовать.

Это решение взломано. Но это единственный известный мне способ, который может сработать для вашего варианта использования.

Он выполняет свою работу, но это не нормально в случае Bootstrap - динамически генерируемые элементы, похоже, не имеют атрибутов. Я пробовал это на простом модальном, и, похоже, это не сработало.

vitalii 04.04.2018 17:01

Следует добавить дополнительную информацию и объяснение этой проблемы.

Eka 04.04.2018 17:31

пытаюсь обновить. дай мне еще несколько минут @Eka

Jacob Goh 04.04.2018 17:32

@import не может быть ограничен, он всегда применяется глобально

ctf0 04.08.2018 07:21

@ ctf0 это не импорт css. Это импорт scss

Jacob Goh 04.08.2018 07:26

да, я понимаю, поэтому мы не использовали url() для импорта, однако при компиляции vue преобразует его как обычный импорт css, и вы получите стиль с @import в заголовке ur

ctf0 04.08.2018 07:39

@ ctf0 очевидно, если он преобразован в импорт css, что-то не так с тем, как вы его используете в scss.

Jacob Goh 04.08.2018 07:51

Разве @import "~bootstrap/dist/css/bootstrap.min"; не будет импортировать файл css?

ctf0 04.08.2018 08:02

@ ctf0 да, но он будет импортировать его способом SCSS. Вы не должны видеть @import ... в сгенерированном CSS. (Не уверен, правильно ли я понял вашу проблему)

Jacob Goh 04.08.2018 08:40

Работает отлично. Единственная небольшая проблема была с Модальный компонент, который (логически) должен иметь атрибут static для рендеринга внутри его родительского компонента.

Radek Svítil 02.12.2019 10:13

ВАЖНОЕ примечание re. выше ... Если вы, как и я, попытаетесь @импортировать файл .css, это не сработает (будет применяться глобально). Переименуйте ваш файл .css в .scss, тогда он будет работать ?

LMK 24.02.2021 22:08

@LMK не нужно переименовывать расширение, просто импортируйте его БЕЗ расширения, как в ответе. @import "~bootstrap/dist/css/bootstrap.min";

Jacob Goh 25.02.2021 02:20

Я хотел использовать 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>

Я знаю, что это старый вопрос, но это решение работает для меня

<style lang = "scss" scoped>
 ::v-deep {
   @import 'bootstrap/scss/bootstrap.scss';
 }
</style>

Я использовал вышеупомянутое, и bootstrap css просочился глобально, то есть без области действия.

LMK 24.02.2021 21:51

Другие вопросы по теме