是否有可能在 SVG fill=url(#) 中使用动态 id
Is there a possibility to use a dynamic id in SVG fill=url(#)
我正在创建一个 svg 图标来填充 linearGradient 的颜色百分比。
在 linearGradient 中,我正在动态创建 id,并希望在
中使用相同的动态创建的 id
我试过插值 fill={url(#linear${i}
)} 但没有用,不确定这是否是在 SVG 中使用的正确方法。
有没有更好的方法来实现这个?
<div *ngFor="let block of filteredBlocks; let i = index">
<svg xmlns="http://www.w3.org/2000/svg"
height="100px"
viewBox="0 0 24 24"
width="100px"
fill="url(#'linear' + i)">
<defs>
<linearGradient [attr.id]="'linear' + i">
<stop [attr.offset]="block.percent + '%'" stop-color="green"/>
<stop [attr.offset]="(100 - block.percent) + '%'" stop-color="white"/>
</linearGradient>
</defs>
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M17 4h3v16h-3V4zM5 14h3v6H5v-6zm6-5h3v11h-3V9z" />
</svg>
</div>
有多种方法可以使其发挥作用:
对属性绑定使用插值
attr.fill="url(#linear{{i}})"
在属性绑定上使用字符串连接
[attr.fill]="'url(#linear' + i + ')'"
将其包装在所有现代浏览器都支持的原生 JS Web 组件中,
如果您使用 shadowDOM,则不需要唯一 ID
如果您不想要 shadowDOM,请坚持使用 new Date()/1
以强制使用新的唯一 ID
customElements.define("svg-icon",class extends HTMLElement{
connectedCallback(){
let offset = this.getAttribute("offset") || 5;
let color = this.getAttribute("color") || "green";
let id = "gradient"; // + (new Date()/1)
this
.attachShadow({mode:"open"}) // leave out for no shadowDOM
.innerHTML = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
height="100px" width="100px"
fill="url(#${id})">
<defs>
<linearGradient id="${id}">
<stop offset="${offset}%" stop-color="${color}"/>
<stop offset="${100 - offset}%" stop-color="white"/>
</linearGradient>
</defs>
<path d="M0 0h24v24H0V0z" fill="none"/>
<path d="M17 4h3v16h-3V4zM5 14h3v6H5v-6zm6-5h3v11h-3V9z"/>
</svg>`
}
});
<svg-icon></svg-icon>
<svg-icon offset="20"></svg-icon>
<svg-icon color="red"></svg-icon>
我正在创建一个 svg 图标来填充 linearGradient 的颜色百分比。
在 linearGradient 中,我正在动态创建 id,并希望在
中使用相同的动态创建的 id我试过插值 fill={url(#linear${i}
)} 但没有用,不确定这是否是在 SVG 中使用的正确方法。
有没有更好的方法来实现这个?
<div *ngFor="let block of filteredBlocks; let i = index">
<svg xmlns="http://www.w3.org/2000/svg"
height="100px"
viewBox="0 0 24 24"
width="100px"
fill="url(#'linear' + i)">
<defs>
<linearGradient [attr.id]="'linear' + i">
<stop [attr.offset]="block.percent + '%'" stop-color="green"/>
<stop [attr.offset]="(100 - block.percent) + '%'" stop-color="white"/>
</linearGradient>
</defs>
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M17 4h3v16h-3V4zM5 14h3v6H5v-6zm6-5h3v11h-3V9z" />
</svg>
</div>
有多种方法可以使其发挥作用:
对属性绑定使用插值
attr.fill="url(#linear{{i}})"
在属性绑定上使用字符串连接
[attr.fill]="'url(#linear' + i + ')'"
将其包装在所有现代浏览器都支持的原生 JS Web 组件中,
如果您使用 shadowDOM,则不需要唯一 ID
如果您不想要 shadowDOM,请坚持使用
new Date()/1
以强制使用新的唯一 ID
customElements.define("svg-icon",class extends HTMLElement{
connectedCallback(){
let offset = this.getAttribute("offset") || 5;
let color = this.getAttribute("color") || "green";
let id = "gradient"; // + (new Date()/1)
this
.attachShadow({mode:"open"}) // leave out for no shadowDOM
.innerHTML = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
height="100px" width="100px"
fill="url(#${id})">
<defs>
<linearGradient id="${id}">
<stop offset="${offset}%" stop-color="${color}"/>
<stop offset="${100 - offset}%" stop-color="white"/>
</linearGradient>
</defs>
<path d="M0 0h24v24H0V0z" fill="none"/>
<path d="M17 4h3v16h-3V4zM5 14h3v6H5v-6zm6-5h3v11h-3V9z"/>
</svg>`
}
});
<svg-icon></svg-icon>
<svg-icon offset="20"></svg-icon>
<svg-icon color="red"></svg-icon>