在 Vue 模板文件中的伪元素内容或背景图片中使用 SVG

Posted

技术标签:

【中文标题】在 Vue 模板文件中的伪元素内容或背景图片中使用 SVG【英文标题】:Use SVG in pseudo element content or background image in Vue template file 【发布时间】:2019-11-27 05:22:39 【问题描述】:

我不知道如何在 Vue 模板文件中使用 SVG 文件作为伪内容元素。

在我的 Vue 模板文件 (Select.vue) 的范围 CSS 中,我有:

.wrap 
  &:after 
    content: url("../../assets/icons/caret-down-solid.svg");
    position: absolute;
    right: 0;
    width: 50px;
    height: 50px;
  

路径是相对于组件位置的。但它不会简单地出现。

我尝试并注意到的事情:

我也尝试过在 URL 周围不使用 " "。 我尝试使用background-imagecontent: " " 代替,但也没有用。 工作绝对网址(例如网络上的测试文件) 在我的示例中它确实解析了本地 URL,因为当我执行 ../../../asserts/icons/caret-down-solid.svg 以采用错误的路径时,它将无法编译。

所以看起来文件已被解析,语法正确,但无论出于何种原因,它都没有显示出来。

编辑:在使用 background-image 检查伪元素时,我看到了:

background-image: url([object Module]);

【问题讨论】:

这个作用域的 CSS 是如何渲染的?这是 vue 直接放入页面源的东西,还是通过外部样式表加载的? (外部样式表中的相对路径是相对于样式表的位置的。) @misorude 并非如此,正如您在我的编辑中看到的那样,它试图将链接作为模块加载。 【参考方案1】:

如果有人遇到这个问题,我设法解决了这个问题。 问题是我使用的vue-svg-loader.svg 文件作为模块导入。所以我不得不使用svg-url-loader 将svgs 导入到样式中。

在我添加的chainWebpack 选项下的vue.config.js 中:

config.module.rule("svg")
  .oneOf("inline")
    .resourceQuery(/inline/)
    .use("svg-url-loader")
      .loader("svg-url-loader")
      .end()
    .end()
  .oneOf("external")
    .use("vue-svg-loader")
      .loader("vue-svg-loader");

当您将 ?inline 附加到您的 svg 时,它会使用不同的加载器(在本例中为 svg-url-loader)处理它

所以在 CSS 中你这样做:

.wrap 
  &:after 
    content: url("../../assets/icons/caret-down-solid.svg?inline");
    position: absolute;
    right: 0;
    width: 50px;
    height: 50px;
  

它会正确内联导入 SVG。

【讨论】:

以上是关于在 Vue 模板文件中的伪元素内容或背景图片中使用 SVG的主要内容,如果未能解决你的问题,请参考以下文章

如何将graphQl查询中的变量转换为内联样式或样式组件中的伪元素

Vue3基础-模板语法

用于在另一个元素内插入图标的伪元素选择器

如何在 :before 元素的伪元素上添加 svg 作为内容? [复制]

css中的伪类和伪元素

之前和之后的伪元素在顺风 CSS 中不起作用