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

Posted

技术标签:

【中文标题】具有作用域 css 的 Vue.js 样式 v-html【英文标题】:Vue.js style v-html with scoped css 【发布时间】:2017-12-04 07:33:47 【问题描述】:

如何使用 vue-loader 使用作用域 css 设置 v-html 内容的样式?

简单示例: 组件.vue

<template>
  <div class="icon" v-html="icon"></icon>
</template>
<script>
  export default 
    data () 
      return icon: '<svg>...</svg>'
    
  
</script>
<style scoped>
  .icon svg 
    fill: red;
  
</style>

生成html &lt;div data-v-9b8ff292="" class="icon"&gt;&lt;svg&gt;...&lt;/svg&gt;&lt;/div&gt;

生成CSS .info svg[data-v-9b8ff292] fill: red;

如您所见,v-html 内容没有 data-v 属性,但生成的 css 具有 svg 的 data-v 属性。

我知道这是 vue-loader (https://github.com/vuejs/vue-loader/issues/359) 的预期行为。在这个问题中提到了后代选择器。但正如你所见,我在我的 css 中使用了它,但它不起作用。

如何设置 v-html 内容的样式?

【问题讨论】:

【参考方案1】:

As stated in my answer here:

vue-loader 的新版本(从版本 12.2.0 开始)允许您使用“深度作用域”css。你需要这样使用它:

&lt;style scoped&gt; 现在支持可以影响子级的“深度”选择器 使用 &gt;&gt;&gt; 组合器的组件:

.foo &gt;&gt;&gt; .bar color: red; 会被编译成:

.foo[data-v-xxxxxxx] .bar color: red;

更多关于the release page 的信息vue-loader

【讨论】:

太棒了,谢谢!绝对应该在文档中提及。 添加是因为它发生在我身上,如果上述方法不起作用,.foo /deep/ .bar 可能会起作用。 上面的 cmets 必须是它自己的答案,在我阅读评论之前,我一直在努力解决这个问题。 这不适用于 vue-loader 15.9.1。有人有同样的问题吗?【参考方案2】:

AS Sarumanatee 说,如果接受的答案不起作用,请尝试:

.foo /deep/ .bar  color: red; 

【讨论】:

这个对我有用,“::v-deep”也是。不知道哪个最好?【参考方案3】:

我正在使用vue-loader 15.9.1&gt;&gt;&gt; 解决方案对我不起作用(无效),而 /deep/method 导致构建错误......

以下是可行的方法:

.foo ::v-deep .bar color: red;

【讨论】:

其他答案都不起作用,但这是完美的! 非常感谢!只有你的回答有帮助【参考方案4】:

在 SCSS 中使用 /deep/ 选择器对我不起作用,但后来我尝试使用 ::v-deep 选择器

例如

::v-deep a 
  color: red;

见this回答

【讨论】:

有一个 SFC 可以将其更改为 :deep(a)。收到警告[@vue/compiler-sfc] ::v-deep usage as a combinator has been deprecated. Use :deep(&lt;inner-selector&gt;) instead. @Mrweiner 可以分享链接吗? 看起来这是github.com/vuejs/rfcs/blob/master/active-rfcs/…

以上是关于具有作用域 css 的 Vue.js 样式 v-html的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vue js 作用域样式

在 Vue.js 中有条件地定位具有 CSS 样式的类

Vue JS CSS 样式绑定

Vue.js 源码分析(二十六) 高级应用 作用域插槽 详解

vue.js methods中的方法互相调用时变量的作用域是怎样的

Vue项目中 css样式的作用域(深度作用选择器)