Firefox has long had strong SVG support, and its DevTools include SVG-specific features that help when debugging vector graphics in web applications. Here's what you need to know.
SVG in Firefox: Current Support
Firefox supports:
- SVG 1.1: Full support
- SVG 2.0: Mostly supported (ongoing)
- CSS animations in SVG: Full support (transform, opacity, stroke)
- SMIL animations: Supported (Chrome deprecated these; Firefox still supports them)
- SVG filters: Full support
- SVG foreign object: Supported
- Inline SVG: Full support
Where Firefox differs from Chrome:
- SMIL (
<animate>,<animateTransform>, etc.): Chrome deprecated SMIL but Firefox still supports it - Some SVG 2.0 features like
dproperty animation differ between engines
Inspecting SVG in Firefox DevTools
Inspector: SVG is just HTML elements in the DevTools Inspector. You can select SVG elements and see their properties.
CSS Rules panel: SVG attributes that are also CSS properties (fill, stroke, transform, opacity) show in the CSS rules panel and can be edited live.
Finding SVG elements:
// In Console: select all SVG paths on the page document.querySelectorAll('svg path') // Count total SVG elements document.querySelectorAll('svg *').length Animating SVG with CSS
SVG animation via CSS transforms works in Firefox:
/* CSS transforms on SVG elements */ .spinning-gear { transform-origin: center; animation: spin 2s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } transform-origin on SVG: Firefox 78+ correctly handles transform-origin: center on SVG elements. Earlier versions required transform-origin: 50% 50% 0.
SVG vs HTML coordinate systems: SVG elements use their own coordinate system, not the viewport. For complex transforms, you may need transform-box: fill-box to use the element's bounding box as the transform origin:
.animated-path { transform-box: fill-box; transform-origin: center; } SVG Filters
Firefox fully supports SVG filter effects:
<svg> <defs> <filter id="blur"> <feGaussianBlur stdDeviation="3"/> </filter> <filter id="dropshadow"> <feDropShadow dx="4" dy="4" stdDeviation="4" flood-color="#333"/> </filter> </defs> <rect filter="url(#blur)" x="0" y="0" width="100" height="100" fill="blue"/> </svg> CSS SVG filters (apply to any HTML element):
.blurred-element { filter: url(#blur); /* Or use CSS filter directly: */ filter: blur(3px) drop-shadow(4px 4px 4px #333); } Debugging SVG filters: DevTools → Inspector → CSS rules panel shows the filter property. Click the filter value to see an expanded view of what CSS filters are applied.
SVG Icons and Sprites
SVG sprites (common pattern):
<!-- Sprite sheet defined in page --> <svg style="display:none"> <defs> <symbol id="icon-arrow" viewBox="0 0 24 24"> <path d="M5 12h14M12 5l7 7-7 7"/> </symbol> <symbol id="icon-close" viewBox="0 0 24 24"> <path d="M18 6L6 18M6 6l12 12"/> </symbol> </defs> </svg> <!-- Use anywhere in the page --> <svg class="icon"><use href="#icon-arrow"/></svg> <svg class="icon"><use href="#icon-close"/></svg> Debugging <use> elements: In Firefox DevTools, <use> elements show in the Inspector. Click to see the referenced symbol. The shadow DOM for the <use> element is visible.
External sprites: <use href="/icons.svg#icon-arrow"/> works in Firefox. External SVG sprites load the SVG file and reference symbols by ID.
CORS and external sprites: If the external SVG is on a different domain, you need CORS headers (Access-Control-Allow-Origin: *) on the SVG file.
SVG Performance
Avoid: animating d (path data) directly. This requires the browser to recalculate path geometry every frame. Use transform animations instead.
Use: CSS transform/opacity animations which run on the compositor thread:
/* Good: compositor-thread animation */ .icon { transition: transform 0.2s ease; } .icon:hover { transform: scale(1.1); } /* Bad: main-thread animation (causes layout) */ .icon { transition: width 0.2s; } .icon:hover { width: 120%; } Firefox performance for SVG: Check in DevTools Performance panel. SVG repaints show in the "Paint" section of the timeline. If SVG is causing excessive painting, look for:
- SVG elements with
will-change: transform - Large SVG areas with complex filters (filters are expensive)
- SVGs that change frequently (animated charts, etc.)
SVG Accessibility
SVG needs additional markup for accessibility:
<!-- Decorative SVG: hide from screen readers --> <svg aria-hidden="true"> <path d="..."/> </svg> <!-- Meaningful SVG: provide title and description --> <svg role="img" aria-labelledby="svg-title svg-desc"> <title id="svg-title">Bar Chart</title> <desc id="svg-desc">Sales data for Q3 2024 showing 20% growth</desc> <!-- chart paths --> </svg> <!-- Icon with label --> <button> <svg aria-hidden="true"><use href="#icon-download"/></svg> Download </button> Test in Firefox Accessibility DevTools: DevTools → Accessibility panel → Select your SVG element. The accessibility properties panel shows whether the SVG is correctly described to screen readers.
SMIL Animations (Firefox-specific)
SMIL animations work in Firefox (Chrome dropped support):
<svg> <circle r="50" cx="50" cy="50"> <animate attributeName="cx" from="50" to="200" dur="2s" repeatCount="indefinite"/> </circle> </svg> Note: Since Chrome doesn't support SMIL, don't use SMIL if you need cross-browser support. Use CSS animations or the Web Animations API instead.
SMIL has one advantage: It can animate SVG attributes that CSS can't animate, like d (path data), points (polygon), and viewBox. For Firefox-only SVG work, SMIL is still viable.
Debugging SVG Path Issues
Common problem: SVG paths look different in different browsers.
In Firefox DevTools:
- Inspector → select the path element
- Look at the
dattribute in the HTML panel - Edit it directly to test changes
Checking bounding boxes:
// In Console: check an SVG element's bounding box document.querySelector('path').getBoundingClientRect() document.querySelector('path').getBBox() // SVG-specific, coordinate system of SVG getBBox() gives you the bounding box in SVG coordinates. getBoundingClientRect() gives viewport coordinates. Both work in Firefox.
Quick Reference
| Feature | Firefox |
|---|---|
| SVG 1.1 | Full |
| Inline SVG | Full |
| CSS animations on SVG | Full |
| SMIL | Supported (Chrome dropped) |
| SVG filters | Full |
<use> external sprites | Supported (requires CORS) |
transform-box: fill-box | Firefox 78+ |
transform-origin: center on SVG | Firefox 78+ |