Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SVG Icons Not Displaying Correctly in Multi-Tabs (ID collision) #45

Open
mostafaznv opened this issue Jul 22, 2023 · 3 comments
Open

SVG Icons Not Displaying Correctly in Multi-Tabs (ID collision) #45

mostafaznv opened this issue Jul 22, 2023 · 3 comments
Labels
bug Something isn't working

Comments

@mostafaznv
Copy link

mostafaznv commented Jul 22, 2023

I don't know if this is a bug report or a feature request because I think it is not directly related to nuxt-icons. However, there is a problem, and I reported it here in the hope that someone comes up with a solution.

Describe the bug
When I use an SVG icon in 2 or more tab items, it doesn't display correctly.

To Reproduce

  1. Define a multi-tab using vuetify.
  2. Place the same SVG into all tabs
  3. Observe that only the first item displays correctly

Expected behavior
I expect all other SVGs in the other tabs to display correctly.

Desktop:

  • OS: Mac
  • Browser: Chrome/Firefox (It works with Safari but it has some other issues)
  • Version: Latest Versions

Reproduction link:
https://stackblitz.com/edit/github-remtxs-pnzwnx

Some Reaserch:
I believe that nuxt-icons should prefix IDs of defs with a unique value for each render.
Currently, it renders something like this for all SVGs in all tabs:

<defs>
    <linearGradient id="i" x1="64.421" x2="79.438" y1="71.286" y2="184.675" gradientUnits="userSpaceOnUse">...</linearGradient
    <linearGradient id="j" x1="52" x2="60.884" y1="46.942" y2="108.476" gradientUnits="userSpaceOnUse">...</linearGradient
    <linearGradient id="k" x1="107.644" x2="116.528" y1="46.942" y2="108.476" gradientUnits="userSpaceOnUse">...</linearGradient
</defs>

Since all of them are using the same ID (i, j, k), I think Chrome/Firefox only consider the defs of the first SVG, and when the first SVG is gone, all other SVGs face with the problem.




nuxt-icons.mp4
@mostafaznv mostafaznv added the bug Something isn't working label Jul 22, 2023
@mostafaznv
Copy link
Author

mostafaznv commented Jul 22, 2023

In addition to multi-tabs, if someone uses services like SVGO to optimize SVG files, SVGO replaces all IDs of SVG files with short IDs (i, j, k), and multiple non-related SVGs could face conflicts.

Example:
https://jsfiddle.net/jhmbunc7/
In this example (pure html/js), only the first SVG displays correctly, while the second and third are corrupted.

Even if someone doesn't use SVGO, there is still a chance to face conflicts, and developers always should manipulate the SVG manually to fix this type of issue.

Anyway, We can change IDs manually. But this workaround doesn't work when we are using SVGs into multi-tabs components.

Edit:
I found an article about this issue:
https://medium.com/pixel-and-ink/fix-duplicate-svg-id-collision-in-react-36bc9e068333
And there is a nice example describing it:
https://codepen.io/antonjb/pen/JjGPbyy

@mostafaznv mostafaznv changed the title SVG Icons Not Displaying Correctly in Multi-Tabs SVG Icons Not Displaying Correctly in Multi-Tabs (ID collision) Jul 22, 2023
@gitFoxCode
Copy link
Owner

thanks a lot for writing this issue up in such a way! Currently I don't have the time to address this issue, I will take care of it in the future, but you can try using the nuxt/icon module

@JuerGenie
Copy link

thanks a lot for writing this issue up in such a way! Currently I don't have the time to address this issue, I will take care of it in the future, but you can try using the nuxt/icon module

look like cause the icon's source code contain reference that use id, like this: fill="url(#gradient-color), multi icons render repeat id much time, and reference always use first matched defs's children (html rule it). when first matched defs's children hidden (e.g. display: none), reference will be hidden too.

so, I afraid nuxt/icon module has this problem too...

maybe <img> is the solution? no idea XD

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants