使用 js 动态修改在线 svg 背景色
由于网上搜了很多相关资料,都是介绍如何通过 js 修改本地 svg 资源。不过我们要求是要修改在线 svg 资源,因此,在一顿研究之后,封装了如下组件。
js
<template>
<img v-if="url" class="hyl-svg-container" :src="url"/>
</template>
<script>
export default {
name: 'hyl-svg-container',
props: {
src: String,
fill: String,
options: {
type: Object,
default: () => ({})
}
},
data() {
return {
content: '',
url: ''
};
},
watch: {
fill: {
handler(v) {
if (this.content && v) {
this.fillColor();
}
},
immediate: true
}
},
created() {
this.fetchSvgSource();
},
methods: {
async fetchSvgSource() {
if (!this.src) return;
const response = await fetch(this.src);
const contentType = response.headers.get('content-type');
const [fileType] = (contentType || '').split(/ ?; ?/);
// 异常状态
if (response.status > 299) {
console.error('Not found');
}
this.url = '';
// 非有效格式
if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) {
console.error(`Content type isn't valid: ${fileType}`);
this.url = this.src;
return;
}
// 获取内容
const content = await response.text();
this.content = content;
this.fillColor();
},
fillColor() {
if (this.fill) {
// 支持自定义填充颜色
this.content = this.content.replace(/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g, this.fill);
}
// 转换base64
const base64Code = btoa(this.content);
const base64SVG = `data:image/svg+xml;base64,${base64Code}`;
this.url = base64SVG;
}
}
};
</script>
<style>
.hyl-svg-container {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
</style>