- From: Robert O'Callahan <robert@ocallahan.org>
- Date: Thu, 29 Aug 2013 10:21:31 +1200
- To: Simon Fraser <smfr@me.com>
- Cc: "Tab Atkins Jr." <jackalmage@gmail.com>, Andrew Dupont <w3@andrewdupont.net>, www-style <www-style@w3.org>
- Message-ID: <CAOp6jLYPZb5arCji6eg=F1jnqOgrASBAsjsQp37tTVY+wsRZHw@mail.gmail.com>
[Reviving old thread] On Fri, Sep 9, 2011 at 7:01 AM, Simon Fraser <smfr@me.com> wrote: > The basic pieces seem to be: > > 1. Get an element's padding, content, border and margin boxes relative to > its own border-box, as rects. > 2. Convert a rect to a quad. > 3. Map arbitrary point from one element to another. > 4. Map arbitrary quad from one element to another (mapping 4 points) > Splitting the pieces up this way has a problem: with CSS Regions (or CSS Overflow), it's possible for a CSS transform to apply to one box of an element, but not another --- when one fragment flows into a container that has a CSS transform, and another fragment flows into a different container with no transform. In such a case, step 1 is lossy :-(. Therefore I think we need to offer a way to get the boxes as a list of quads. In that case, I think we may as well offer coordinate-space conversion in the same call. Part 3 has been more recently addressed: http://lists.w3.org/Archives/Public/public-pointer-events/2013JanMar/0099.html So here's my proposal: Rename ClientRect to CSSRect. [Constructor(CSSPoint, CSSPoint, CSSPoint, CSSPoint), Constructor(ClientRect)] interface Quad { readonly attribute CSSPoint p1; // 2D only (z,w not present) readonly attribute CSSPoint p2; readonly attribute CSSPoint p3; readonly attribute CSSPoint p4; readonly attribute CSSRect bounds; }; [Constructor(sequence<Quad>)] interface QuadList { readonly attribute unsigned long length; getter Quad item(unsigned long index); readonly attribute CSSRect bounds; }; enum BoxType { "margin", "border", "padding", "content" }; dictionary BoxQuadOptions { attribute BoxType box; // defaults to "border" attribute Node relativeTo; // defaults to viewport }; partial interface Node { QuadList getBoxQuads(BoxQuadOptions options); Quad convertQuadFromNode(Node from, Quad quad); Quad convertRectFromNode(Node from, CSSRect rect); }; Edge cases handled as in http://lists.w3.org/Archives/Public/public-pointer-events/2013JanMar/0099.htmland following thread. I've proposed packing getBoxQuads parameters into a dictionary. Separate getMarginBoxQuads etc methods, each with an optional "Node relativeTo" parameter, would work too, but I think would be less easily extended in the future. I also think that in this case naming the "relativeTo" parameter is a good thing (e.g. "node.getBoxQuads({relativeTo:otherNode})" seems easier to read than "node.getBoxQuads(otherNode)"). Any thoughts? Rob -- Jtehsauts tshaei dS,o n" Wohfy Mdaon yhoaus eanuttehrotraiitny eovni le atrhtohu gthot sf oirng iyvoeu rs ihnesa.r"t sS?o Whhei csha iids teoa stiheer :p atroa lsyazye,d 'mYaonu,r "sGients uapr,e tfaokreg iyvoeunr, 'm aotr atnod sgaoy ,h o'mGee.t" uTph eann dt hwea lmka'n? gBoutt uIp waanndt wyeonut thoo mken.o w * *
Received on Wednesday, 28 August 2013 22:21:58 UTC