stylus 设置全局样式_解决 v-html 元素中标签样式失效 - Vue

最近在做一个项目,是对富文本编辑器生成的 HTML 渲染到页面中,大家都会想到当然是用 Vue 的 v-html 属性,于是我写下了这样的代码

<template>
  <div class="content-html" v-html="article.contentHtml" />
</template> 


<style lang="scss" scoped>
.content-html {
    p {
      font-size: 16px;
    }
    a {
      color: blue;
    }
  }
</style>

然而 style 并没有生效


解决方法 一

去掉 <style> 标签中的 scoped,但是这个方法并不建议,取消了 scoped 属性,就会污染全局变量,可能导致不可预估的后果

如何 fix 呢 ? 官方给出了两个解决方法

In single-file components, scoped styles will not apply to content inside v-html, because that HTML is not processed by Vue’s template compiler. If you want to target v-html content with scoped CSS, you can instead use CSS modules or an additional, global <style> element with a manual scoping strategy such as BEM.

在单文件组件中,带有 scoped 属性的 styles 不会作用于 v-html 里的内容,因为 v-html 里面的内容,并没有经过 Vue's template compiler 的处理。

官方建议的解决方法一,css module 是一个解决全局变量和代码依赖的规范,原理是对声明了 module 的样式表中的样式赋予哈希 class 名,可以参考 官网 或 阮一峰老师的文章

官方建议的解决方法二,意思是在全局变量中,通过特殊命名 (比如 BEM) 来手动约束样式 - BEM书写规范

可惜以上都不是我想要的解决办法,最终我在 Stack Overflow 中找到了另一种解决思路

另一种解决思路

可以使用 deep scoped来实现对v-html的样式应用,并且不设置为全局

deep 选择器在 CSS 的写法是 >>>

<template>
  <div class="content-html" v-html="article.contentHtml" />
</template> 


<style scoped>
.content-html {
    >>> p {
      font-size: 16px;
    }
    >>> a {
      color: blue;
    }
  }
</style>

可惜 >>> 在 sass/less 中不作用

我们需要用 /deep/ 来代替 >>> 写法

<style lang="scss" scoped>
.content-html {
    /deep/ p {
      font-size: 16px;
    }
    /deep/ a {
      color: blue;
    }
  }
</style>

如果没解决问题?

由于我的项目需要后端渲染,我使用了 nuxt.js 框架,不知道什么原因,>>>/deep/ 都不起作用

最后的救命稻草 ::v-deep

<style lang="scss" scoped>
.content-html {
    ::v-deep p {
      font-size: 16px;
    }
    ::v-deep a {
      color: blue;
    }
  }
</style>

这样一来,这些样式就会影响到该组件的子组件,v-html 中的内容也因此而改变,但又不会 污染 全局

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue-Echarts多列柱状图是使用Vue框架和Echarts图表库来实现的一种图表类型。它可以显示多个列的柱状图,每个列代表不同的数据系列。在Vue-Echarts,可以通过高度封装的方式来使用Echarts的折线图和柱状图功能。引用的混入文件可以帮助实现窗口改变时,使Echarts图表自适应。 对于多列柱状图,每一列的数据可以通过series的配置来设置。在3D柱状图,数据分为底部切片、间柱子和顶部切片三个部分。可以通过配置不同的系列来表示不同的数据列。 具体实现多列柱状图的步骤如下: 1. 使用Vue-Echarts库来创建一个Vue组件,并引入相关依赖。 2. 在Vue组件,使用Echarts的option配置对象来设置图表的样式、数据和系列。 3. 在option的series属性,通过配置不同的系列来表示多个数据列。 4. 按照需求配置其他的Echarts选项,如x轴、y轴、图例等。 5. 在Vue组件渲染并显示Echarts图表。 通过以上步骤,可以实现一个Vue-Echarts多列柱状图。在图表,每一列代表一个数据系列,可以展示多个数据的对比情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue-echarts-element-stylus:高度封装的elemnet表格组件,高度封装echarts,excel表格上传,excel表格下载](https://download.csdn.net/download/weixin_42133452/18559339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue2.x-echarts公共组件封装--简易篇(3d柱状图,炫酷仪表盘,折线,曲线图)](https://blog.csdn.net/vscode_js/article/details/125913485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值