SVG Gradient turns black when there is a BASE tag in HTML page?
Asked Answered
S

4

26

I am using the Raphaël JavaScript Library to create SVG elements in an HTML page and using CodeIgniter as a PHP framework. In the CodeIgniter framework I need to add a <base> tag in the head of the HTML document to use JS,CSS and images, but it caused a strange problem in the SVG element.

When I use the <base> tag, gradients do not work. Instead, the object turns black. It behaves exactly the same with image filled path objects.

Salad answered 13/10, 2011 at 19:24 Comment(3)
The correct answer is here ... https://mcmap.net/q/112726/-angular-and-svg-filtersGlycine
if using Angular2, solution at https://mcmap.net/q/112949/-angular-2-router-no-base-href-setGalengalena
And for those using AngularJS instead: github.com/angular/angular.js/issues/…Olivares
G
14

SVG Gradients are defined in the document with a unique id attribute, and then referenced from another element as a URL. Typically the URL is just the identifier fragment, e.g.:

<defs>
  <linearGradient id="foo" ...>...</linearGradient>
</defs>
<rect fill="url(#foo)" ... />

If you introduce a <base> element with an href attribute, you change the meaning of such URLs in the document. Instead of being computed relative to the current document, they are computed relative to the specified separate URI.

Grumous answered 14/10, 2011 at 3:57 Comment(5)
is there any solution to exclude svg from base tagSalad
anyway im going to accept your answer but please let me know if you know a way to prevent this problem without removing base tagSalad
@AhmetYıldırım You could try using a full URL to your page with the SVG tag, e.g. fill="url(http://mydomain.com/foo/bar.html#gradient)". However, I would suggest fixing CodeIgniter to not require a <base> tag. Why would you require this?Grumous
Using the full URL does not work, because it goes out and reads the file instead of using the (modified) document as currently constituted in the DOM. There really needs to be a way to disentangle SVG from the HTML base tag.Wayne
If by chance you're using AngularJS, due to this issue they've added an option to eliminate the need for <base>: github.com/angular/angular.js/issues/8934#issuecomment-56568466Kincardine
V
4

see also the following bug report: https://bugzilla.mozilla.org/show_bug.cgi?id=652991

apparently, the notion of referencing (the fill gradient or marker-end, I suspect, too) by URL is problematic for AJAX-style applications that also use history.pushState().

Verjuice answered 17/3, 2012 at 1:13 Comment(0)
E
0

Your gradient definition is getting corrupted Also there are sometimes problems with Opera for certain usages of gradient filled objects

Ermelindaermengarde answered 13/10, 2011 at 23:37 Comment(1)
Please file bugs on Opera here: bugs.opera.com/wizard. And please include a testcase, or a link to one. Thanks :)Marilee
P
-2

I had a similar issue - gradient is rendered all black in Chrome, but I didn't even have a <base> tag.

Changing

<stop  offset="1" style="stop-color:#F26722"/>

to

<stop  offset="1" stop-color="#F26722"/>

seemed to fix the issue.

Another unrelated bug was Chrome being unable to parse transform="translate(...)" on <g> elements, I had to move them into individual <path>-s.

Prescience answered 24/2, 2016 at 22:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.