@int32_t is right in that Shadow DOM, by definition, is a way to fill a node with DOM that you want to hide from external sources (Encapsulation). The point is that you as the component author get to choose exactly which parts will be exposed to outside CSS or JavaScript and which will not.
Unfortunately, you cannot create a public JavaScript interface to your Shadow DOM without using another bleeding-edge spec called Custom Elements. If you choose to do that, it's as simple as adding custom public methods to your element's prototype. From these you can access the internals of your Shadow DOM (see the third example here).
You can, however, expose hooks for CSS to access the internals of your Shadow DOM without using Custom Elements. There are two ways to do that:
- Pseudo-elements
- CSS Variables
Pseudo-elements
Chrome and Firefox expose certain parts of their Shadow DOM to CSS through special pseudo-elements. Here's your example of the date
input with the addition of a CSS rule that only applies to the numerical part of the date field through use of the Chrome-provided -webkit-datetime-edit
pseudo-element.
Here's a partial list of the available WebKit pseudo-elements. You can also just enable the Show Shadow DOM
option in DevTools and look for attributes named pseudo
.
Component authors can also create their own pseudo-elements to expose parts of their Shadow DOM (see the 2nd example here).
CSS Variables
An even better way is to use CSS Variables, which you can enable with Enable experimental WebKit features
in about:flags
in Chrome. Then check out this fiddle which uses CSS Variables to communicate to the Shadow DOM what color it should use for its "theme."
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…