Polyermer使用的是Shadow DOM styling规则来限定每一个自定义组件的样式范围(即每一个组件均可以定义本身内部独立的样式,而不受外界全局样式的干扰)。如何定义组件内部样式呢,咱们须要在<dom-module>标签内使用<style>标签(1.1版本开始推荐与<template>平级)。css
咱们来看个例子
首先是自定义组件的代码html
<link rel="import" href="../bower_components/polymer/polymer.html"> <dom-module id="sub-element"> <style> :host { display: block; border: 1px solid red; } #child-element { background: yellow; } .content-wrapper >::content .special { background: silver; } </style> <template> <div id="child-element">In local DOM!</div> <div class="content-wrapper"> <content></content> </div> </template> <script> Polymer({ is: 'sub-element' }); </script> </dom-module>
主index.html的代码web
<!DOCTYPE html> <html> <head> <script src="bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> <link rel="import" href="components/sub-element.html"> <style> #child-element{ background: green; } </style> </head> <body> <div id="child-element">native div of index page</div> <sub-element id="subElement"> <div class="special">I'm content child of sub element</div> </sub-element> </body> </html>
运行结果以下:
能够看到咱们在主index.html里也定义了一个#child-element的全局样式,效果为背景绿色,可是这个咱们在sub-element中的style设置里对这个样式进行了再次定义,因此最终渲染时会以自组建为先,覆盖父容器中的定义,或者是全局的样式定义。若是咱们把sub-element中这个style注释掉,则子组件会使用外层的定义,显示为绿色。app
#child-element { /*background: yellow;*/ }
咱们接着看style中几个和以往传统写法不同的地方,dom
:host { display: block; border: 1px solid red; }
:host 是对宿主子容器进行设定,你能够把它当成是<template></template>,或者是<sub-element></sub-element>翻译
.content-wrapper >::content .special { background: silver; }
::content 是对被插入的child标签进行设定,也就是途中灰色的<div class="special">I'm content child of sub element</div>设计
.content-wrapper >::content .special ---->最终会被翻译成 .content-wrapper >.special
为何要让自定义组件的style有本身独立的做用域呢!道理其实请简单,咱们开发一套系统通常都要定义全局一套主题,每一个控件的样色设计风格要统一一致,可是一旦我对某些组件进行了扩展,须要一些特殊的样式设置,咱们就能够在每一个自定义组件内部进行设置,而不须要破坏全局的css文件。
Polymer team如今以为::content的写法有些冗长,会在后续版本中加以改进,咱们也拭目以待code