Closed Bug 874811 Opened 8 years ago Closed 2 years ago

clientWidth and clientHeight on outermost <svg> elements are always 0


(Core :: SVG, defect)

21 Branch
Not set



Tracking Status
firefox68 --- fixed


(Reporter: herr.ernst, Assigned: emilio)




(2 files, 1 obsolete file)

For inline SVG elements in HTML5, the DOM properties clientWidth and clientHeight are always zero. This breaks some librarys and makes getting the size of an svg element difficult.
As per the CSSOM View Module, the client* properties are extension to the Element interface [1], so they should be also supported for SVG elements (in contrast to the offset* properties, which are extensions to the HTMLElement interface, also see discussion for bug 649285). Every other major browser I have tested supports the client* properties (IE9, IE10, Chrome (26), Opera (12.14), Safari (6.0.4)).

It would be great if Firefox would also support them.

Attachment #752639 - Attachment mime type: text/plain → text/html
Component: General → SVG
Product: Firefox → Core
Same with scrollWidth and scrollHeight as in bug 804201
scrollWidth and scrollHeight return 0 per the cssom specification for the reasons given in that bug. Let's try to stick to one topic per bug please.
SVG elements don't have a CSS layout box (except for the outer <svg> element when it is embedded inline in html). 

Then per

The clientTop, clientLeft, clientWidth, and clientHeight attributes must return zero if the element does not have any associated CSS layout box

So we're doing the right thing per the specification here. Get the specification changed and we'll likely implement it, providing it say something sensible.
Closed: 8 years ago
Resolution: --- → INVALID
> SVG elements don't have a CSS layout box (except for the outer <svg> element
> when it is embedded inline in html). 

But that's exactly the case here (the outermost SVG element embedded in HTML).
So you're just asking for it to be non-zero on the outermost <svg> element when embedded in html.
Resolution: INVALID → ---
Summary: clientWidth and clientHeight on svg elements are always 0 → clientWidth and clientHeight on outermost <svg> elements are always 0
(In reply to Robert Longson from comment #5)
> So you're just asking for it to be non-zero on the outermost <svg> element
> when embedded in html.
Yes, exactly (sorry about the confusion, when I wrote "svg element", I meant the <svg> element).
Duplicate of this bug: 958273
I am observing another client size weirdness (tested on - drag and rotate that green wheel, the client size is displayed on mouse release):
1. The client size of standalone SVGs returns dimensions of the page (not SVG) content.
2. When the same SVG file is viewed from a local drive, the client size is 0 x 0px.
ad 1) same in Chrome. IE returns the exact SVG size which is IMHO the only sensible approach.
ad 2) both Chrome and IE return the same dimension as when viewed from the web.
Finally I am about to release my new SVG based web app and this incorrect returning of client coords is quite serious issue for me. With deep sorrow I have to mark FF as unsupported browser :-(
Are client coords considered as non-standard ones and hence handled with lower priority?
I am also working on an app using SVG, and I cannot believe this bug exists.

Some bugs I can understand, but a basic function of the DOM just not working *at all* for an important element like SVG? An Mozilla appears to have no interest in fixing it?

When an SVG is being used as a drawing surface in a context where its size can change, such as on a responsive site, or within a flex container, it is vital to be able to determine its size in order to lay out its contents properly.
Why can't you use getBoundingClientRect?
Aha! I can. I didn't think to check. I figured the dimensions were just broken. Silly me.

Thanks for you help.
Why the status is UNCONFIRMED since it's definitly a bug ?
This also applies to SVG embedded via EMBED, OBJECT and IFRAME.

All dimensions, clientWidth/Height and scrollWidth/Height are always 0.

The previous suggested workaround of using getBoundingClientRect does not work as it behaves differently when css transforms are applied. In fact I need to use both the client* properties and getBoundingClientRect to calculate which transforms are in effect.
Assignee: nobody → violet.bugreport
Ever confirmed: true
Attachment #9059710 - Attachment is obsolete: true
Assignee: violet.bugreport → emilio
Pushed by
Outer svg is a replaced box with CSS layout, and CSSOM should reflect that accordingly. r=dholbert,violet
Closed: 8 years ago2 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla68
Created web-platform-tests PR for changes under testing/web-platform/tests
You need to log in before you can comment on or make changes to this bug.