- From: François REMY <fremycompany_pub@yahoo.fr>
- Date: Sat, 16 Jun 2012 15:35:58 +0200
- To: "Dimitri Glazkov" <dglazkov@google.com>, <www-style@w3.org>
- Cc: "Roland Steiner" <rolandsteiner@google.com>
Just a thought: since you can have multiple nested levels of shadow trees,
you may experience problems (with an @host at-rule) in getting the 'root'
level (where html & body lives) or the 'n-2' level.
document's tree:
html
body
ctrl1
div#box1
ctlr1's shadow tree:
:root
div#insertionPoint
ctrl2
ctlr2's shadow dom:
:root
input
style ---> for examples
If you want to control ctlr2's input styling based on document's <body>
classes (Modernizr...) you can't use @host as you defined it.
There are probably numerous ways to soleve this problem, here's the one I
thought of: adding the "::host()" and "::host-root()" pseudo-elements that
only the ":root" elements of a shadow trees have and which refers to their
host.
Some notes:
- By 'layout tree' I mean the 'tree has rendered'.
- I use '=>' as the "direct child in the layout tree" combinator, and
'==>' as the "descendant in the layout tree" combinator.
Examples using that proposal (content of the style tag of ctrl2's shadow
tree):
* {
matches every node of the <ctrl2>'s shadow tree (<:root>, <input>,
<style>)
}
::host {
// matches the <ctrl2> tag, in <ctrl1>'s shadow tree
// identical to ":root::host" because <:root> is the only selectable
element by "*" which has the "::host" pseudo-element
}
::host:hover {
// matches the <ctrl2> tag, if the mouse pointer is over it
}
::host:matches(div, span) {
// doesn't match anything, the host element is a <ctrl2> tag
}
::host-root {
// matches the <:root> of the <ctrl1>'s shadow tree
// identical to ":root::host-root" because <:root> is the only
selectable element which has the "::host" pseudo-element
}
::host-root > div {
// matches <div#insertionPoint> in <ctrl1>'s shadow tree
}
::host-root > div => * {
// matches <div#box1> because it is a direct child, in the layout
tree, of <div#insertionPoint> (which matches the "::host-root > div"
selector)
}
body ==> :root input {
// matches <ctlr2>'s shadow tree's <input>, because it is a
descendant, in the layout tree, of the <body> tag (which matches the "body"
selector)
}
::host ==> * {
// matches the <:root>, <input> and <style> tags of <ctrl2>'s shadow
tree, because they are descendants; in the layout tree, of the <ctrl2> tag
(which matches ::host)
}
::host => *::host {
// creepy example, that also matches the <ctrl2>'s tag because
"::host => *" matches the <:root> element of the <ctrl2>'s shadow tree,
which as a "::host" pseudo-element which is <ctrl2>
// identical to "::host => *::host => *::host" for the same reason
}
I think you can make select any element you want accross the branches of the
shadow trees with those four additions to CSS. But this is just an idea,
maybe there are other ways to achieve this which are more intuitive.
-----Message d'origine-----
From: Dimitri Glazkov
Sent: Friday, June 15, 2012 11:17 PM
To: www-style@w3.org
Cc: Roland Steiner
Subject: Re: CSS + Shadow DOM = <3 + more
Following thoughtful analysis by Roland on
https://www.w3.org/Bugs/Public/show_bug.cgi?id=16519, I went ahead and
killed :host pseudo-class in favor of the @host @-rule:
http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#host-at-rule
:DG<
Received on Saturday, 16 June 2012 13:36:24 UTC