Svg外部图标不显示问题

来源:3-9 Icon 图标处理方案:SvgIcon

小白鸭

2023-02-05

图片描述

老师您好,处理外部 svg 图标显示时无法正常显示,对于element-plus图标的问题已按照最新规范 npm install @element-plus/icons-vue 下载处理过,但是外部图标还是无法正常显示通过如下代码处理后

源码:
utils/validate.js

export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path);
}

components/svgIcon/svgIcon.vue

<template>
  <!-- 展示外部图标 -->
  <div
    v-if="isExternal"
    :style="styleExternalIcon"
    class="svg-external-icon svg-icon"
    :class="className"
  />
  <!-- 展示内部图标 -->
  <svg v-else class="svg-icon" :class="className" aria-hidden="true">
    <use :xlink:href="iconName" />
  </svg>
</template>

<script setup>
import { computed } from "vue";
import { isExternal as external } from "@/utils/validate";

const props = defineProps({
  // icon 图标
  icon: {
    type: String,
    required: true
  },
  // 图标类名-便于处理样式
  className: {
    type: String,
    default: ""
  }
});

/**
 * 判断当前图标是否为外部图标
 */
const isExternal = computed(() => external(props.icon));

/**
 * 外部图标样式
 */
const styleExternalIcon = computed(() => ({
  // 通过遮罩或者裁切特定区域的图片
  // 的方式来隐藏一个元素的部分或者全部可见区域
  mask: `url(${props.icon}) no-repeat 50% 50%`,
  "-webkit-mask": `url(${props.icon}) no-repeat 50% 50%`
}));

/**
 * 内部图标
 */
const iconName = computed(() => `#icon-${props.icon}`);
</script>

<style lang="scss" scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}

.svg-external-icon {
  background-color: currentColor;
  mask-size: cover !important;
  display: inline-block;
}
</style>

views/login/login.vue

<svgIcon icon="https://res.lgdsunday.club/user.svg"></svgIcon>

import svgIcon from "@/components/svgIcon/svgIcon.vue";
写回答

1回答

Sunday

2023-02-05

你好

这个应该是缓存的问题。之前有同学遇到过类似的问题。

0
1
中律十七
这个今天我也遇到了,给mask-size添加-webkit-mask-size就好了。用的是最新版的chrome。 我去https://caniuse.com/?search=mask-size 查了mask-size兼容性,说chrome支持加-webkit前缀的写法,不知道老师的代码为啥能显示出来。。。。
2023-10-25
共1条回复

基于Vue3新标准,打造后台综合解决方案

基于Vue3重写Vue-element-admin,打造后台前端综合解决方案

1942 学习 · 1688 问题

查看课程