如何在 vue 中隔离/作用域全局 css

Posted

技术标签:

【中文标题】如何在 vue 中隔离/作用域全局 css【英文标题】:How to isolate / scope global css in vue 【发布时间】:2019-07-22 09:01:30 【问题描述】:

上下文:我有一个 Vue CLI 项目,由两个主要部分组成:1) 客户看到的内容和 2) 管理员看到的内容。客户部分使用 Bootstrap CSS,另一部分使用 Vue Material。 尽管我打算将 Vue Material 部分重写为 Vuetify,但问题很可能仍然存在。

问题: Bootstrap CSS 与 Vue Material CSS 冲突。当 Bootstrap CSS 应用于 Vue Material 部分时,它看起来很乱。反过来也是;当 Vue Material CSS 应用于 Bootstrap 部分时,它看起来很乱。

我有什么办法可以完成这项工作吗?

这个 Vue 项目曾经被封装在一个 Laravel 项目中,大量使用 Laravel Mix。然后我可以使用混合文件将所有 Bootstrap CSS 编译成 1 个包。此捆绑包将在索引页面中使用以下行进行引用:

<link rel="stylesheet" href="bootstrap-bundle.css" id="bootstrap-stylesheet">
<link rel="stylesheet" href="vue-material-bundle.css" id="vue-material-stylesheet">

在 Vue 中使用两个布局组件,然后我可以像这样切换样式表:

// The Bootstrap layout component:
created() 
  document.getElementById('bootstrap-stylesheet').disabled = false;
  document.getElementById('vue-material-stylesheet').disabled = true;



// The Vue-Material layout component:
created() 
  document.getElementById('bootstrap-stylesheet').disabled = true;
  document.getElementById('vue-material-stylesheet').disabled = false;

这可能不是一个很好的解决方案,但它确实有效。也适用于大多数浏览器。

但是,我现在使用 Vue CLI 而不是 Laravel 和 Laravel Mix。这意味着我不能再轻松地命名生成的输出了。

我已经尝试过使用 CSS 深度选择器:/deep/ & &gt;&gt;&gt;。但这并不完全有效,因为引导程序还将样式设置为 :roothtmlbody 元素。因此,在作用域 CSS 中使用深度选择器时,不会应用这些样式,因为最终结果会是这样的:

.customers-container 
    body 
        // bootstrap adds style to the body
    

上述方法不起作用,因为 body 不是 customers-container 的子代,而是相反。

我觉得可能有一个解决方案,使用包名称或块名称或来自 Webpack 或 Vue 配置的其他内容。但是我的 Webpack 知识不足以自己解决这个问题,而且我似乎无法在网上找到答案。

【问题讨论】:

我相信在特定的 Vue 组件中,您可以使用 【参考方案1】:

我想到的第一件事就是下载 bootstrap 和 vue-material 样式表。然后您可以尝试执行以下操作,获取引导程序样式表并将其包装在如下内容中:

.administrator-view 

/// the complete bootstrap stylesheet


对 vue-material 执行相同操作,但使用客户类 .customer-view

然后,您可以在视图之间切换时在 HTML 或 body 元素中添加其中一个类。

不要忘记包含两个样式表!

编辑:在网站上进行了搜索,您应该检查Limit the scope of bootstrap styles

【讨论】:

问题是引导程序还会向htmlbody 元素添加内容。我已经编辑了我的问题以明确这一点。 什么意思?您是否从 index.html 中删除 CSS?如果您将整个引导程序样式限定在其中一个类中,然后将该类添加到 HTML 标记中,那么您应该不会有太大问题。在最坏的情况下,您需要搜索引导样式表并删除 html 选择器,以便将这些样式应用于您的基类。编辑:在网站上进行了搜索,您应该检查***.com/questions/10568065/… 感谢您的帮助,但下载 bootstrap css 并自己编辑它让我以后很难更新我的依赖项。我很想在 webpack 代码拆分和块命名或类似的东西中找到答案。

以上是关于如何在 vue 中隔离/作用域全局 css的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js:如何使动态创建的 HTML 使用作用域 CSS?

Vue 中作用域 CSS 的那点事

如何使用 vue js 作用域样式

如何覆盖 Vue 组件中的作用域样式?

Vue:如何更改作用域子组件的样式

具有作用域 css 的 Vue.js 样式 v-html