Vue 中的范围引导 Css

Posted

技术标签:

【中文标题】Vue 中的范围引导 Css【英文标题】:Scope Bootstrap Css in Vue 【发布时间】:2018-09-14 04:30:56 【问题描述】:

我正在尝试在 Vue 组件中使用 Bootstrap,并且我希望所有 CSS 都具有范围。我尝试过这样的事情:

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

但似乎 css 没有作用域。有什么办法吗?

【问题讨论】:

【参考方案1】:
<style scoped src="~bootstrap/dist/css/bootstrap.css"></style>

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

更新:使用 SCSS 的 hack

第一个解决方案不起作用的原因:

使用作用域,父组件的样式不会泄漏到子组件中 组件。

如果您希望范围样式中的选择器“深”,即影响 子组件,你可以使用 >>> 组合器

来自Vue doc for scoped CSS

您提到的模式显然不受您导入引导程序的组件控制。也许它是一个子组件。也许您正在使用 Bootstrap 模态的 jquery 版本。无论哪种方式,数据属性都不会添加到模式中。

为了解决这个问题,你需要 Deep Selector。 (您可以在https://vue-loader.vuejs.org/en/features/scoped-css.html 中详细了解它)

以下是我如何使用 SCSS 导入整个 Bootstrap CSS。 (我认为仅使用纯 CSS 是不可能做到这一点的。)

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

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

</style>

某些预处理器,例如 Sass,可能无法解析 >>> 适当地。在这些情况下,您可以改用 /deep/ 组合器 - 它是 >>> 的别名,工作原理完全相同。

生成的 CSS 类似于

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

..这就是你想要的。

但是,我得说,导入整个 Bootstrap CSS 是一种非常糟糕的做法。尝试仅从 bootstrap-sass 导入您将要使用的内容。

这个解决方案很老套。但这是我知道的唯一适用于您的用例的方法。

【讨论】:

它完成了这项工作,但在 Bootstrap 的情况下就不行了——动态生成的元素似乎没有属性。我在简单的模态上尝试过,它似乎不起作用。 应该为这个问题添加更多信息和解释。 我正在尝试更新。再给我几分钟@Eka @import 不能限定范围,它总是全局应用 @LMK 您不需要重命名扩展名,只需在没有扩展名的情况下导入它,就像答案中一样。 @import "~bootstrap/dist/css/bootstrap.min";【参考方案2】:

我知道这是一个老问题,但这个解决方案对我有用

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

【讨论】:

我用了上面的,bootstrap css 全局泄露了,即没有作用域。【参考方案3】:

我想在我的应用程序中仅在页面上使用 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>

【讨论】:

【参考方案4】:

对我来说,这是让它工作并防止泄漏的解决方案:

<style lang="less" scoped>
    ::v-deep 
        @import (less) "../node_modules/vuetify/dist/vuetify.min.css";
    
</style>

转换成 less 显然也可以改成 scss。

【讨论】:

【参考方案5】:

他们在 Vue 3 中更改了 ::v-deep 选择器,旧方法仍然有效,但已弃用(如果您以这种方式导入 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 并选择根 div SFC 组件。假设您的组件名称是 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() 选择器在官方 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

【讨论】:

以上是关于Vue 中的范围引导 Css的主要内容,如果未能解决你的问题,请参考以下文章

b-form-select VUE 引导样式/CSS 问题

如何在 vue.js 欢迎组件中使用引导程序而不是尾风 CSS

无法更改 css 模态引导程序。引导程序中的模态淡入淡出自动添加填充左 15px

如何将引导颜色作为css中的变量引用?

Vue js引导程序在折叠时添加动画

如何在卡组引导 vue 上设置行中的列?