Firefox and Safari are not rendering SVGs properly - wordpress
I'm making a website for a client which sells a board game. The boards come with different coloring, so to display them it felt natural to use SVG, because they designed them with illustrator. Everything was fine on chrome and edge, the 2 browsers I'm using daily. However, on Safari and firefox some of the SVGs appears glitchy, with missing parts or miss connected ones.
Here is how one looks like on edge:
And here it is on firefox (the difference is circled in red):
Here is a minimal reproducible example:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 134.92 134.92">
<defs>
<style>
.cls-2{clip-path:url(#clip-path);}
.cls-3{fill:url(#linear-gradient);}
.cls-4{fill:#dcccb9;}
.cls-5{fill:#fff;}
</style>
<linearGradient xmlns="http://www.w3.org/2000/svg" id="linear-gradient" x1="0.06" y1="-0.06" x2="134.85" y2="134.98" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#eb600a"/>
<stop offset="1" stop-color="#ec7724"/>
</linearGradient>
</defs>
<g id="Calque_2" data-name="Calque 2">
<g id="PLATEAUX">
<g class="cls-2">
<rect xmlns="http://www.w3.org/2000/svg" class="cls-3" width="134.92" height="134.92"/>
<rect xmlns="http://www.w3.org/2000/svg" class="cls-4" x="10.22" y="10.22" width="114.48" height="114.48" rx="3.01"/>
<path xmlns="http://www.w3.org/2000/svg" class="cls-5" d="M33.45,120.25h0l0,0a.42.42,0,0,0,0-.06s0,0,0-.06l0,0,0-.07a373164063697.4,373164063697.4,0,0,1,0-.1.13.13,0,0,1,0-.06.08.08,0,0,1,0,0,.05.05,0,0,1,0,0l.06,0,.06,0,0,0a.14.14,0,0,1,0,.06.2.2,0,0,1,0,.07.25.25,0,0,1,0,.08s0,.05,0,.08l.06,0a.09.09,0,0,0,0-.06l0,0h0v0h0a.16.16,0,0,1-.06.08.17.17,0,0,1-.1,0l0,.09-.06.07-.07,0a.11.11,0,0,1-.08,0h-.06l-.06,0a.15.15,0,0,1,0-.06.36.36,0,0,1,0-.11.69.69,0,0,1,0-.13.75.75,0,0,1,.07-.12l0,0h0s0,0,0,0v0l0,0a.35.35,0,0,0,0,.06.19.19,0,0,0,0,.08.46.46,0,0,0,0,.14A.08.08,0,0,0,33.45,120.25Zm.11-.27a.39.39,0,0,0,0-.13s0,0,0,0a0,0,0,0,0,0,0v.07s0,0,0,0,0,0,0,0l0,0v0Z" transform="translate(3.68 3.68)"/>
</g>
</g>
</g>
</svg>
It looks like paths are not rendered in the same order on chrome and firefox.
Additional information:
My client is designing these boards with an old version of illustrator (2010 or something similar)
The website is made with wordpress, meaning that I import the svg with the editor and the client will in the future use wordpress to add more SVGs
There are smaller glitches with the texts on the image but they are due to the decimal precision (2 diigits) and they are ok
My question is: What can I do to make the SVGs render properly on Safari and Firefox?
Thanks for your help.
The problem is an overflow. Look at this path d attribute string. The bold part is supposed to be two fixed point numbers:
M33.45,120.25h0l0,0a.42.42,0,0,0,0-.06s0,0,0-.06l0,0,0-.07a373164063697.4,373164063697.4,0,0,1,0-.1.13.13,0,0,1,0-.06.08.08,0,0,1,0,0,.05.05,0,0,1,0,0l.06,0,.06,0,0,0a.14.14,0,0,1,0,.06.2.2,0,0,1,0,.07.25.25,0,0,1,0,.08s0,.05,0,.08l.06,0a.09.09,0,0,0,0-.06l0,0h0v0h0a.16.16,0,0,1-.06.08.17.17,0,0,1-.1,0l0,.09-.06.07-.07,0a.11.11,0,0,1-.08,0h-.06l-.06,0a.15.15,0,0,1,0-.06.36.36,0,0,1,0-.11.69.69,0,0,1,0-.13.75.75,0,0,1,.07-.12l0,0h0s0,0,0,0v0l0,0a.35.35,0,0,0,0,.06.19.19,0,0,0,0,.08.46.46,0,0,0,0,.14A.08.08,0,0,0,33.45,120.25Zm.11-.27a.39.39,0,0,0,0-.13s0,0,0,0a0,0,0,0,0,0,0v.07s0,0,0,0,0,0,0,0l0,0v0Z
Firefox seems to have a problem interpreting this as a number, while Chrome at least seems not to produce a suprising rendering.
Adobe Illustrator has a way of minimizing these path commands that makes them hard to read, but you can make out what is supposed to happen:
...0-.07a373164063697.4,373164063697.4,0,0,1,0-.1.13.13,0,0,1,0-.06...
is two relative arc commands, the first with a very large radius. You can safely replace the first arc segment with a line segment. But since the following command is also an arc, written without the command letter a, it needs now to be amended for the following segment:
...0-.07l0-.1a.13.13,0,0,1,0-.06...
Here is the completed result:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 134.92 134.92">
<defs>
<style>
.cls-2{clip-path:url(#clip-path);}
.cls-3{fill:url(#linear-gradient);}
.cls-4{fill:#dcccb9;}
.cls-5{fill:#fff;}
</style>
<linearGradient xmlns="http://www.w3.org/2000/svg" id="linear-gradient" x1="0.06" y1="-0.06" x2="134.85" y2="134.98" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#eb600a"/>
<stop offset="1" stop-color="#ec7724"/>
</linearGradient>
</defs>
<g id="Calque_2" data-name="Calque 2">
<g id="PLATEAUX">
<g class="cls-2">
<rect xmlns="http://www.w3.org/2000/svg" class="cls-3" width="134.92" height="134.92"/>
<rect xmlns="http://www.w3.org/2000/svg" class="cls-4" x="10.22" y="10.22" width="114.48" height="114.48" rx="3.01"/>
<path xmlns="http://www.w3.org/2000/svg" class="cls-5" d="M33.45,120.25h0l0,0a.42.42,0,0,0,0-.06s0,0,0-.06l0,0,0-.07l0-.1a.13.13,0,0,1,0-.06.08.08,0,0,1,0,0,.05.05,0,0,1,0,0l.06,0,.06,0,0,0a.14.14,0,0,1,0,.06.2.2,0,0,1,0,.07.25.25,0,0,1,0,.08s0,.05,0,.08l.06,0a.09.09,0,0,0,0-.06l0,0h0v0h0a.16.16,0,0,1-.06.08.17.17,0,0,1-.1,0l0,.09-.06.07-.07,0a.11.11,0,0,1-.08,0h-.06l-.06,0a.15.15,0,0,1,0-.06.36.36,0,0,1,0-.11.69.69,0,0,1,0-.13.75.75,0,0,1,.07-.12l0,0h0s0,0,0,0v0l0,0a.35.35,0,0,0,0,.06.19.19,0,0,0,0,.08.46.46,0,0,0,0,.14A.08.08,0,0,0,33.45,120.25Zm.11-.27a.39.39,0,0,0,0-.13s0,0,0,0a0,0,0,0,0,0,0v.07s0,0,0,0,0,0,0,0l0,0v0Z" transform="translate(3.68 3.68)"/>
</g>
</g>
</g>
</svg>
I have no idea if the path in this new variant is what was originally intended. The outline looks a bit strange:
If it is not, Illustrator is the problem.
Related
How do you target objects nested within a <symbol> in an external sprite sheet?
I'm using an external svg file for my graphics. I have a few that are multi color and look something like this. <svg xmlns="http://www.w3.org/2000/svg" style="display:none;"> <symbol viewBox="0 0 300 220" id="some_logo"> <path id="shape01" d="...." /> <path id="shape02" d="...." /> <path id="shape03" d="...." /> </symbol> <symbol>...</symbol> <symbol>...</symbol> <symbol>...</symbol> </svg> of course using it in the HTML looks like this. <svg> <use xlink:href="../../assets/symbol_sprite.svg#some_logo" /> </svg> The problem I'm having is I would like to target the #shape01, #shape02 and #shape03 ids to apply different css fills. So far I tried <use xlink:href="../../assets/symbol_sprite.svg#some_logo/#shape01" /> <use xlink:href="../../assets/symbol_sprite.svg#some_logo#shape01" /> <use xlink:href="../../assets/symbol_sprite.svg#some_logo>#shape01" /> just to see if I could find a way of targeting them but nothing happened. I went to googling everything I could think of that might get a result but didn't get anything. How can we target those elements?
Why Doesn't Chrome Display SVG's with <use> and Filter="url(#id)" Attributes?
Background I have a set of SVG icons that all have drop shadows. To make this work in Chrome, I can't just use filter:drop-shadow. I have to use filter:url(#drop-shadow), and define the drop shadow in my <defs> section. I also have multiple instances of these icons on the page (they are filetype icons in a list of files), so I am using <use> to keep my page DRY. Code Exernal SVG File <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <defs> <filter id="drop-shadow"> <feGaussianBlur xmlns="http://www.w3.org/2000/svg" in="SourceAlpha" stdDeviation="4"/> ..... more filter lines, shortened for brevity </filter> </defs> <symbol id="download-pdf"> <path filter="url(#drop-shadow)" d="" fill="">...</path> </symbol> <symbol id="download-zip"> ..... another icon </symbol> ... more icons </svg> Inline SVG on the Page <svg> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="URL_OF_EXTERNAL_SVG"></use> </svg> See minimal working example here: http://h.andymercer.net/chrome-svg-bug/ Problem The problem is that Chrome isn't finding the #drop-shadow link, and so is breaking the icons. Firefox, conversely, displays the icons perfectly. Firefox: Chrome: If you notice, the Chrome screenshot DOES show some portion of the icon. It is displaying the portions that don't use the drop shadow filter. I can't figure out why this is, because the drop shadow is in the <defs> that is on the same page as the <symbol>. Question Is there something I am missing, or is this a Chrome bug? Edit Per comments, I was asked for a MCVE. I hadn't done that because the problem inherently requires external URLs, which is typically frowned upon here. However, to demonstrate the problem, take a look at this: http://h.andymercer.net/chrome-svg-bug/ In Firefox, you can see the icon. In Chrome, it is blank.
In Chrome, <defs> must be located inside the same <svg>. In your case: <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <defs> <filter id="drop-shadow"> <feGaussianBlur xmlns="http://www.w3.org/2000/svg" in="SourceAlpha" stdDeviation="4"/> </filter> </defs> <symbol id="download-pdf"> <path filter="url(#drop-shadow)" d="" fill="">...</path> </symbol> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#download-pdf"></use> </svg> Conforming to modern browsers capabilities, it's easier and cleaner to create different external svg files, one for each icon, then embed them using <object> or <img> tags. <object> lets javascript access and modify SVG code via DOM, while <img> embed SVGs denying DOM access to them. So, in your case using <img> should be a better choice.
SVG, how would I define text to apply to a Cylinder?
I am attempting to apply text to a 3D image of a Cylinder using HTML and SVG. I can get the text to follow a textpath or calculate dx and dy for a textspan so that it follows the curve of an ellipse but the perspective is wrong. I have seen examples with the correct perspective but they were created using a drawing program like Corel Draw and I need this to work in a responsive Web site. The textpath bends the text vertically so for example an L is just tilted at the outer edges of the cylinder where the vertical part of the L should stay parallel to the sides of the cylinder. Using textspan with dx and dy attributes keeps the vertical part of an L vertical but the base does not follow the elliptical path. The text I am writing to the cylinder is fairly limited so I could possibly pre-process it into a set of glyphs but there is too many possibilities to do this manually. I appreciate any tips offered on how to make this look visually correct. -- edited -- Based on the comments I now realize that even though I can fake a 3D image there is no z axis so to make this work correctly I might need to generate the graphic using something that supports 3D images. If I use something like that ideally it would allow for a responsive feel. Here is an example: https://jsfiddle.net/9bzaytnj/ <svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <ellipse cx="65" cy="50" rx="60" ry="15" id="lid"></ellipse> <linearGradient id="gradient" x1="0%" y1="0%" x2="100%" y2="0%"> <stop offset="0%" stop-color="rgb(80,80,80)"></stop> <stop offset="30%" stop-color="rgb(255,255,255)"></stop> <stop offset="100%" stop-color="rgb(80,80,80)"></stop> </linearGradient> <ellipse cx="65" cy="70" rx="60" ry="15" id="bottom"></ellipse> <rect x="5" y="50" width="120" height="20" id="face"></rect> <clipPath id="clip" clipPathUnits="userSpaceOnUse"> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#bottom"></use> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#face"></use> </clipPath> <path id="myTextPath" d="M5,62.5 a35,9 0 1,0 120,0"></path> </defs> <rect x="5" y="50" width="120" height="35" fill="url(#gradient)" clip-path="url(#clip)"></rect> <use fill="grey" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#lid"></use> <text style="font-size:10"> <textPath anchor="middle" startoffset="20%" xlink:href="#myTextPath" >LX HHH LL HHH</textPath> </text> <path d="M5,70 a35,9 0 1,0 120,0" style="stroke:#660000; fill:none;"></path> </svg>
SVG CSS animation star glittering moving toward 0,0 point
I'm trying to animation a svg star with glittering made in css. The thing is the star moves toward 0,0 position of svg during the animation. I would like the star to stay in position during the animation. What I'm guessing is that the position of each points that make the star (in path) are not used during the animation. <svg width="300" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <g> <rect fill="#009eff" height="351.7699" width="300.36301" class="color-fill"/> <path class="glittering" fill="#ffcc00" d="m270.88123,28.60792l-7.20074,6.20193l1.02679,9.44777l-8.12354,-4.93181l-8.66808,3.89605l2.18013,-9.24996l-6.38396,-7.03987l9.47093,-0.78498l4.72256,-8.24694l3.67325,8.76482l9.30264,1.94299z"/> </g> </svg> I made a codepen so that you can see what I mean. codepen Can you help me community? Thanks a lot !
When you scale the star, you're effectively multiplying all the path coordinates by the scale factor. Since the path coordinates are all some distance from the origin, the star is moving about. You need to define the star coordinates centered on the origin, and then use a <g> element with a suitable transform to park the star where you actually want it to be. Assuming you plan to have more than one star in this picture, I would recommend defining the star shape in the <defs> section. This will make your SVG much easier to work with: <svg width="300" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <path id="star1" fill="#ffcc00" d="M0.000-10L2.939-4.05L9.511-3.09L4.755 1.55L5.878 8.09L0 5L-5.878 8.09L-4.755 1.55L-9.511 -3.09L-2.939-4.05L0-10Z"/> </defs> <g> <rect fill="#009eff" height="100" width="300" class="color-fill"/> <g transform="translate(200,30)"> <use xlink:href="#star1" class="glittering"/> </g> <g transform="translate(100,60)"> <use xlink:href="#star1" class="glittering"/> </g> </g> </svg> Updated copepen link here
Make sun rays figure using css3
Please I want to know how to make something similar to sunrise using css3. Below is a sample.
This article (though it talks about animating the rays also) decribes making a suburst pattern http://designrshub.com/2013/01/css3-keyframe-animations.html. But, I would use an svg image. See Is Starburst effect doable in CSS3? the SVG: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="512px" height="512px" viewBox="-256 -256 512 512" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>Burst</title> <defs> <g id="burst"> <g id="quad"> <path id="ray" d="M0,0 -69,-500 69,-500 z" /> <use xlink:href="#ray" transform="rotate(30)"/> <use xlink:href="#ray" transform="rotate(60)"/> <use xlink:href="#ray" transform="rotate(90)"/> </g> <use xlink:href="#quad" transform="rotate(120)"/> <use xlink:href="#quad" transform="rotate(240)"/> </g> <radialGradient id="grad" cx="50%" cy="50%" r="50%" fx="50%" fy="50%"> <stop offset="0%" stop-color="white" stop-opacity="0.65"/> <stop offset="100%" stop-color="black" stop-opacity="0.65"/> </radialGradient> <!-- a circle mask --> <mask id="m"><circle r="256" fill="white"/></mask> </defs> <!-- added a mask and scaled it to a different aspect ratio below. scale(x,y) --> <g mask="url(#m)" transform="scale(1, 0.75)"> <use xlink:href="#burst" fill="lightslateblue"/> <use xlink:href="#burst" fill="darkslateblue" transform="rotate(15)"/> <circle r="360px" fill="url(#grad)" /> </g> </svg>
Yes, it is possible. Working demo: https://codepen.io/lethargic/full/RRYdxX I've written a vanilla CSS version as well as a Sass mixin at github.com/pestbarn/starburst.css. Cross-browser? As far as I can tell, yes. Needs testing in IE versions below 11, but seems well supported otherwise (full browser support as of 2019). Animatable? Yep, like you would animate any other elements. Caveats? Alas, there is. Using colors that are far from another on the color wheel will create jagged edges. I'd recommend using colors that are close to one another. Also, since the effect is created using pseudo elements, you will in some cases need to explicitly set the element's height and width. Using the Sass mixin, you can simply do the following: #include starburst(both, 11, #184256, #194052); This will create a starburst/sunburst effect with the colors you asked for, with the bursts being 11 degrees apart (smaller number = tighter burst).