ShadowDOM是web compon【原创不易,请尊重版权】【本文首发于唐霜的博客】ents方案中非常重要的一个新增对象,它本文作者:唐霜,转载请注明出处。原创内容,盗版必究。通过在custom element中使用本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】attachShadow来开启,开启之后未经授权,禁止复制转载。【转载请注明来源】,一个HTMLElement将不再显示其【作者:唐霜】未经授权,禁止复制转载。原本内部的元素,而是显示其shadowR本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】oot内的元素,shadowRoot是一【作者:唐霜】【关注微信公众号:wwwtangshuangnet】个document fragment,是本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】脱离原始文档流的一种存在,因此它具有cs【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】s样式隔离性,通过这种隔离,我们可以很好转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net的在应用中实现一些局部样式的重置和定义(【转载请注明来源】本文版权归作者所有,未经授权不得转载。当然,还有组件化效果)。本文将详细介绍你【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。在处理shadowDOM时可能需要用到的【关注微信公众号:wwwtangshuangnet】【作者:唐霜】一些样式处理方法。
本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net样式隔离未经授权,禁止复制转载。
原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。你可以利用shadowDOM的特性来实现【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。样式隔离,举个例子:
【原创不易,请尊重版权】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。<div id="snake"> <span>snake</span> </div>
在默认情况下,snake中的文本样式继承本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】了来自父元素的文本样式。但是你希望不要继著作权归作者所有,禁止商业用途转载。【作者:唐霜】承,除了通过css写重置的样式规则外,你著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】还可以用shadowDOM来实现。
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。const snake = document.querySelector('#snake');
const root = snake.createShadowRoot();
root.inner = `
<style>span { color: red }</style>
${snake.innerHTML}
`;
通过这种方案,可以帮助我们在一些情况下少【未经授权禁止转载】【原创不易,请尊重版权】写css,或者处理比较难的样式重置问题。
【作者:唐霜】【转载请注明来源】本文版权归作者所有,未经授权不得转载。:host【作者:唐霜】
【作者:唐霜】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】原创内容,盗版必究。:host让你可以选择shadowDOM【转载请注明来源】【作者:唐霜】的寄生元素,也就是开启shadowDOM本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】的那个元素。shadowRoot是一个d未经授权,禁止复制转载。【原创不易,请尊重版权】ocument fragment,这个f【未经授权禁止转载】原创内容,盗版必究。ragment被安排在一个隐性的文档流中【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。,寄生在host元素下,并替代了host【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】元素的innerHTML。所以,在元素文转载请注明出处:www.tangshuang.net原创内容,盗版必究。档中host元素(也就是被开启shado原创内容,盗版必究。【版权所有,侵权必究】wDOM的元素)还是一个正常可以被css原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net描述的元素,但是它的内部元素的展示被拖到原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netshadowRoot中展示,甚至不被展示【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。。举个例子:
本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。<button class="red">My Button</button>
<script>
var button = document.querySelector('button');
var root = button.createShadowRoot();
root.innerHTML = '<style>' +
':host { text-transform: uppercase; }' +
'</style>' +
'<slot></slot>';
</script>
代码【本文受版权保护】来源【本文受版权保护】。这里,button元素被开启了shad【未经授权禁止转载】未经授权,禁止复制转载。owDOM,在shadowRoot的in原创内容,盗版必究。本文作者:唐霜,转载请注明出处。nerHTML中使用:host选择了bu本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。tton元素,从而可以从shadowDO【本文受版权保护】转载请注明出处:www.tangshuang.netM内部对被寄生的button元素进行样式转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。修改。
【本文受版权保护】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【本文受版权保护】同时,:host可以是一个选择器函数,例【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net如:
【作者:唐霜】【转载请注明来源】【本文首发于唐霜的博客】:host(.some-class) {}
:host(:hover) {}
这样,我们可以在shadowDOM内选择【转载请注明来源】【本文受版权保护】不同状态下的宿主元素进行样式调整,这种能本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】力有的时候很有用。(为了方便记忆,你可以【转载请注明来源】未经授权,禁止复制转载。把它理解为 :host:is() 的综合效果。之所以要提这个,是因为你可【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net能把一段:host css代码用在多处,【本文首发于唐霜的博客】【转载请注明来源】通过:is的理解,你就可以更好的对一些特转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net殊宿主元素做进一步控制。)但是,这一选择【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。器能力只能针对宿主元素本身,有没有可能宿【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】主元素不会发生任何状态的变化,而宿主元素本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】的父元素、祖先元素发生变化,从而影响宿主【原创内容,转载请注明出处】【本文受版权保护】元素的样式呢?通过:host-conte原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。xt()可以从宿主元素的祖先元素特征中挑原创内容,盗版必究。【原创内容,转载请注明出处】选宿主元素。举个例子:
<div class="dark-mode">
<div>
<x-foo></x-foo>
</div>
</div>
此时,dark-mode是被动态加上去的转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】,所以,在shadowDOM内通过 :host-context() 就可以通过祖先元素的特性来选择宿主元素转载请注明出处:www.tangshuang.net【转载请注明来源】。
:host-context(.dark-mode) {}
也就是说只有宿主元素在.dark-mod本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。e元素内部时,这段css才生效。
【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。注意,你无法通过 【转载请注明来源】:host div 这种语法从shadowDOM内部去控制【未经授权禁止转载】【本文首发于唐霜的博客】shadowDOM外部宿主元素内部的元素未经授权,禁止复制转载。【转载请注明来源】的样式。听起来比较绕,但是在下文::sl【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。otted, :part()等部分,你会本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】接触到这部分内容。
::shadow【关注微信公众号:wwwtangshuangnet】(depracated)本文版权归作者所有,未经授权不得转载。
【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】
::shadow伪类让你可以从shado原创内容,盗版必究。未经授权,禁止复制转载。wDOM外部(也就是正常的文档流中)选择【本文受版权保护】【本文首发于唐霜的博客】shadowDOM的shadowRoot【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net。举个例子:
【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】【本文首发于唐霜的博客】【原创不易,请尊重版权】<style>
#host::shadow span {
color: red;
}
</style>
<div id="host">
<span>Light DOM</span>
</div>
<script>
var host = document.querySelector('div');
var root = host.createShadowRoot();
root.innerHTML = "<span>Shadow DOM</span>" +
"<slot></slot>";
</script>
这里从shadowDOM外部通过 【访问 www.tangshuang.net 获取更多精彩内容】#host::shadow 选中了shadowRoot,对上面标红【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。的一行代码的样式进行了控制,这样,就实现本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。从外部控制shadowDOM内部的元素的著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】样式。甚至,如果一个shadowDOM内著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。部还有其他shadowDOM,你还可以通【本文受版权保护】【本文受版权保护】过连写来找到对应的shadowRoot,【版权所有,侵权必究】【作者:唐霜】例如:
x-tabs::shadow x-pannel::shadow span {}
不过这里需要注意,这一句里面以为着<【原创不易,请尊重版权】【转载请注明来源】;x-pannel>是被直接写在x【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。-tabs的shadowRoot的,用伪【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。代码表示就是 xTabs.shadowRoot > xPannel.shadowRoot 不能跨shadowDOM选择。本文版权归作者所有,未经授权不得转载。
/deep/转载请注明出处:www.tangshuang.net(depracated)【原创不易,请尊重版权】
原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】原创内容,盗版必究。
/deep/ 是一个连接符,它的作用和:未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】:shadow有点像,但是穿透性更强。如本文作者:唐霜,转载请注明出处。【作者:唐霜】上面举例的x-tabs和x-pannel【本文首发于唐霜的博客】【本文受版权保护】的连选问题,通过/deep/就可以直接跨著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】shadowRoot选中。举个例子:
【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【作者:唐霜】【本文首发于唐霜的博客】x-tabs /deep/ x-pannel {}
意味着<x-pannel>可著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】能是直接写在x-tabs的shadowR转载请注明出处:www.tangshuang.net【本文受版权保护】oot中,也可能是在更深的shadowR本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】oot中,总之只要x-pannel被放在未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netx-tabs的shadowDOM中,就生【未经授权禁止转载】【版权所有,侵权必究】效这一段css。
【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】原创内容,盗版必究。body /deep/ .m1 {}
这一句代码威力极强,它让body中的所有原创内容,盗版必究。【本文首发于唐霜的博客】.m1都生效,无论这个.m1是在正常文档未经授权,禁止复制转载。未经授权,禁止复制转载。流中,还是在一个shadowDOM中。
【原创内容,转载请注明出处】【转载请注明来源】【作者:唐霜】转载请注明出处:www.tangshuang.net【转载请注明来源】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。/deep/在一些场景下面非常有用,但是【版权所有】唐霜 www.tangshuang.net【作者:唐霜】如果你不懂它们的用法,你就在一些需求下无【未经授权禁止转载】【本文首发于唐霜的博客】能为力。举个例子,你怎么去控制<v转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netideo>视频播放器里面的进度条呢本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。?实际上<video>是一个转载请注明出处:www.tangshuang.net【本文受版权保护】浏览器自己实现的custom eleme【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.netnt,通过展开它的shadowRoot你本文作者:唐霜,转载请注明出处。【未经授权禁止转载】就可以慢慢找到进度条,再通过/deep/本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net来实现,例如:
转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】本文作者:唐霜,转载请注明出处。video /deep/ input[type=range] {}
::part()著作权归作者所有,禁止商业用途转载。
本文版权归作者所有,未经授权不得转载。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】ShadowDOM parts是一块比较【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net复杂的内容,我尽可能讲到所有点,但一定会本文作者:唐霜,转载请注明出处。原创内容,盗版必究。有遗漏。首先,::part()是一个伪选【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。择器函数,为方便理解,你可以把它理解为 ::shadow :is([part=xxx]) 的组合效果,也就是在shadowRoo【原创不易,请尊重版权】【原创内容,转载请注明出处】t中挑选part属性为传入值的元素。举个例子:【本文受版权保护】
<x-foo>
#shadow-root
<div part="some-box"><span>...</span></div>
<input part="some-input">
<div>...</div>
</x-foo>
<style>
x-foo::part(some-box) {}
x-foo::part(some-box):hover {}
</style>
首先,它和::shadow, /deep本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。/一样,是在shadowDOM外部对内部【版权所有,侵权必究】【版权所有,侵权必究】的某个元素进行选择;其次,它需要在sha本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】dowRoot内的元素上用part/ex【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】portparts进行标记,在选择时传入本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。标记的名称;最后,它是终结点,不能再找子本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】元素,例如 ::part(xx) span ::part(a)::part(b) 是不允许的,也就是说选择时 ::par【本文受版权保护】【本文受版权保护】t() 是结尾,不能再往下面找(这一点非原创内容,盗版必究。转载请注明出处:www.tangshuang.net常重要,对理解下面 ::slotted 【未经授权禁止转载】【转载请注明来源】也有帮助)。
这里面比较关键的点就是你必须使用 par【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。t/exportparts 对元素进行标【本文首发于唐霜的博客】【作者:唐霜】记。例如:
【转载请注明来源】【版权所有,侵权必究】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】<span part="a"></span> <div exportparts="b c"></div> <section part="d" exportparts="e f g"></section>
这两个属性其实比较容易理解,你不要想太多著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】就行,只是标记了名字。标记了名字之后,就转载请注明出处:www.tangshuang.net【版权所有,侵权必究】可以在外部使用::part()选择它。
【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【未经授权禁止转载】::theme()著作权归作者所有,禁止商业用途转载。
【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。就像/deep/是::shadow的增强本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。一样,::theme()是对::part本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】()的增强。::part()只能选择一层【作者:唐霜】【原创不易,请尊重版权】shadowDOM的标记元素,而::th转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。eme()可以跨越层级,进行深度的par【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】ts选择。
【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【转载请注明来源】【版权所有,侵权必究】原创内容,盗版必究。::soltted()本文作者:唐霜,转载请注明出处。
【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。Web components中一个非常重【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net要的标准涉及slot这个部分,它也是非常【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】复杂和难懂的一个部分,对于浏览器厂商而言未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。,也是比较难实现的部分。在使用中,我们是【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】这样的:
未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【本文受版权保护】<x-foo> <div>aaaa</div> <div>bbbb</div> </x-foo>
在shadowRoot中使用slot作为【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。占位符:
【未经授权禁止转载】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。#shadow-root <section> <div>foo shadow root</div> <slot></slot> </section>
那么在显示的时候,会把<x-foo本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】>的内容先放到<slot&g转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】t;的位置后,再渲染出来。但是非常坑的地【作者:唐霜】未经授权,禁止复制转载。方在于,被传到<slot>位置的两个【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】div的样式,只使用外部文档定义的样式。这是一个非常奇葩的设计,也让slot部【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net分的样式处理极为复杂。
本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。简单总结一下一些规则:1. shadow【本文受版权保护】本文版权归作者所有,未经授权不得转载。DOM内部无法定义外部除宿主元素本身以外原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。的其他元素的样式;2. <slot未经授权,禁止复制转载。【原创内容,转载请注明出处】>是shadowRoot内的元素,【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】但是作为占位符被替换后,替换内容的仍然是转载请注明出处:www.tangshuang.net【转载请注明来源】在shadowDOM外部,相当于slot【作者:唐霜】未经授权,禁止复制转载。只是一个用于显示外太空的显示器,显示器上著作权归作者所有,禁止商业用途转载。【作者:唐霜】显示的内容不符合地球上的物理规律;3. 未经授权,禁止复制转载。【本文受版权保护】<slot>本身不会从sha未经授权,禁止复制转载。【原创内容,转载请注明出处】dowDOM中移除,它把外部传入的内容作【版权所有,侵权必究】转载请注明出处:www.tangshuang.net为自己的子元素,所以,你可以在shado原创内容,盗版必究。原创内容,盗版必究。wRoot内调整slot的样式,但是由于本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。slot是display:content【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】s,所以也不占用文档占位;4. 在sha【版权所有,侵权必究】转载请注明出处:www.tangshuang.netdowRoot内通过给:host设定一些【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。通用样式,这些样式又会作用到slot被替【转载请注明来源】【作者:唐霜】换后的外部元素上,虽然最终还是以外部设定著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。的样式为准(外部元素仍然属于外部文档,因【本文首发于唐霜的博客】【转载请注明来源】此,外部文档作用在它身上的样式优先级更高转载请注明出处:www.tangshuang.net【作者:唐霜】),这又使得样式处理更复杂了。你可以试试原创内容,盗版必究。【本文首发于唐霜的博客】下面这份代码:
【原创不易,请尊重版权】原创内容,盗版必究。【版权所有,侵权必究】未经授权,禁止复制转载。<!DOCTYPE html>
<style>
.aaa {
color: red;
}
p {
color: green;
}
</style>
<x-foo>
<div class="aaa">aaa</div>
<div>bbb</div>
<p slot="ccc">ccc</p>
</x-foo>
<script>
class Foo extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.shadowRoot.innerHTML = `
<style>
:host {
color: yellow;
}
div {
color: blue;
height: 40px;
}
</style>
<section>
<div>foo shadow root</div>
<slot></slot>
<slot name="ccc"></slot>
</section>
`;
}
}
customElements.define('x-foo', Foo);
</script>
通过这些规则,你可以发现,slot部分的转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】样式处理太复杂了,但是,你可以得到一个通【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。用性比较强的原则:shadowDOM内部【转载请注明来源】本文作者:唐霜,转载请注明出处。无法对外部样式做强处理。为了能够对在sl【原创不易,请尊重版权】转载请注明出处:www.tangshuang.netot处传入的元素进行一定的样式处理,we【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。b components里面提供了目前还原创内容,盗版必究。【未经授权禁止转载】不够完善的::slotted()伪选择器【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】函数。
未经授权,禁止复制转载。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net::slotted()可以选中传入slo【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】t处的外部元素的顶级元素进行样式处理。在原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】上面的代码中我们在shadowRoot中【版权所有,侵权必究】【本文受版权保护】加入如下代码:
本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【原创不易,请尊重版权】【版权所有,侵权必究】::slotted(p) {
color: grey !important;
}
就可以覆盖外部对p的样式描述。注意,这里未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net加入了!impotatnt,因为遵循上面【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net的原则,内部无法对外部样式做强处理,所以【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】外部的样式优先级更高,会覆盖内部::sl本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。otted(p)设计的效果,因此,加上!未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netimportant又可以提交其权限,但是未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net加入外部也加一个!important,那【转载请注明来源】转载请注明出处:www.tangshuang.net::slotted也毫无办法。
未经授权,禁止复制转载。【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】另外,一个重要注意点是,::slotte【原创不易,请尊重版权】【本文首发于唐霜的博客】d()只能选择传入的顶级元素,加入传入的【原创不易,请尊重版权】未经授权,禁止复制转载。元素是有更深嵌套的,是无法直接选择的,例【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】如下面:
【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【原创不易,请尊重版权】<x-foo>
<div class="top">
<div class="sub">xxx</div>
</div>
</x-foo>
你是不能用 【访问 www.tangshuang.net 获取更多精彩内容】::slotted(.sub) 选择到.sub的,但你可以通过 【访问 www.tangshuang.net 获取更多精彩内容】::slotted(.top .sub) 选择到它。【未经授权禁止转载】
另外,和::part()一样,::slo著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。tted()只能作为选择的尾节点,你不能未经授权,禁止复制转载。【作者:唐霜】做 ::slotted(.top) .sub 这种选择,没有用。另外,由于::slo著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。tted()只能直接选中一个节点,所以无【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net法通过 + 连接符选择兄弟节点,比如 ::slotted(div + p) 也是无效的。这些都是坑,你需要特别注意转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。。
【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。早期的shadowDOM提案中有<【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netcontent>和::conten【原创内容,转载请注明出处】原创内容,盗版必究。t,现在关于content的提案已经从标【未经授权禁止转载】原创内容,盗版必究。准中移除了,千万不要再使用。
【本文受版权保护】【版权所有,侵权必究】【本文受版权保护】原创内容,盗版必究。
Css变量【未经授权禁止转载】
【原创内容,转载请注明出处】【本文首发于唐霜的博客】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】Css变量在shadowDOM中是什么规【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】则呢?不拐弯抹角了,shadowDOM内【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】只应用:host上的css变量。也就是说本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】,在正常的文档流中,使用:root,bo【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】dy之类的设定的css变量,是无法在sh本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。adowDOM内使用的。然而,:host【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】上的css变量,无论是在shadowRo【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】ot内还是外部文档中设定的,都可以在sh本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。adowDOM内使用。举个例子:
【作者:唐霜】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】<style>
x-foo {
--color: red;
}
</style>
<x-foo style="--color: blue;">
#shadow-root
<style>
:host {
--color: green;
}
p {
color: var(--color);
}
</style>
<p>xxx</p>
</x-foo>
在上面的代码中,在最外面的style里面【本文首发于唐霜的博客】【本文首发于唐霜的博客】、x-foo的style属性里、shad【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。owRoot里面的style里面,三个地著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。方都对x-foo都配置了–c【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】olor,都可以在shadow-root本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】中的元素上使用。当然,优先级还是不一样,未经授权,禁止复制转载。【本文受版权保护】这里要怎么去思考呢?css变量的优先级和【版权所有,侵权必究】转载请注明出处:www.tangshuang.netcss样式表的优先级一致;css变量是宿【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】主元素的性质,因此,优先级遵循宿主元素c转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。ss样式表的优先级。说人话,上面的例子中【原创内容,转载请注明出处】【本文首发于唐霜的博客】,优先级顺序如下:green < 著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】red < blue。为什么:ho本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】st的优先级是最低的呢?这个我还真不知道【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。,如果你有兴趣,了解后请在文末留言告知我【本文首发于唐霜的博客】【版权所有,侵权必究】。
【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】Vue有一个本文版权归作者所有,未经授权不得转载。提案【关注微信公众号:wwwtangshuangnet】,可以实现动态样式表,它的实现原理就是通【转载请注明来源】【作者:唐霜】过修改行内style属性的值,把css变转载请注明出处:www.tangshuang.net【本文受版权保护】量加到属性值中进行修改,从而做到动态样式著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】的效果。我写的一个 web compon【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。ents 框架 sfcjs 也支持类似的本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】动态样式功能,你可以通过npm找到这个包未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net,但是原理和vue不同,是通过修改:ho【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。st来实现。
本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net总之,搞清楚css变量的优先级顺序之后,本文作者:唐霜,转载请注明出处。【本文受版权保护】能为我们将来解决一些样式问题打好基础。
【未经授权禁止转载】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】@import/link[rel=sty【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。lesheet]
【作者:唐霜】【未经授权禁止转载】【原创不易,请尊重版权】在shadowRoot中使用@impor【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】t或<link rel=̶本文版权归作者所有,未经授权不得转载。【转载请注明来源】1;stylesheet” 本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。/>是生效的,你可以像在普通的ht【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。ml文档中使用它们一样使用。但是大部分情本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。况下不推荐,因为你需要解决引入文件的路径【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】问题,因为我们很多时候,创建shadow【本文受版权保护】转载请注明出处:www.tangshuang.netDOM的代码会放在js文件中,而js文件【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。究竟会被哪个页面使用,你根本不知道,所以【作者:唐霜】未经授权,禁止复制转载。,这个路径问题就很复杂。
【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】样式复用【版权所有,侵权必究】
著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【作者:唐霜】转载请注明出处:www.tangshuang.net除了通过import/link方案复用样原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。式,实际上,由于我们大部分都是用js来写本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。custom elements的,所以这【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】些shadowDOM中的css代码常常也本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net是被打包在js代码中,因此,要复用css【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】,就需要在整个项目中,把css文本字符串【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net独立出来,让后在需要用的地方使用这个字符【未经授权禁止转载】【版权所有,侵权必究】串。最终的效果是,源码只有一份,但是在实【本文首发于唐霜的博客】未经授权,禁止复制转载。际运行时,会在每一个shadowRoot转载请注明出处:www.tangshuang.net【版权所有,侵权必究】中都出现一次这些css代码。
转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net结语未经授权,禁止复制转载。
本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】本文详细介绍了shadowDOM中有关c本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】ss样式处理的内容,基本上涵盖了你所需要著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。知道的所有知识点,当然,可能还有一些更细未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。节的东西没有讲到。掌握shadowDOM【作者:唐霜】【转载请注明来源】是现代web编程非常重要的一环,shad本文作者:唐霜,转载请注明出处。【转载请注明来源】owDOM也是web编程区别于其他平台编著作权归作者所有,禁止商业用途转载。【转载请注明来源】程的重要对象,当然,掌握它你在小程序开发【本文首发于唐霜的博客】原创内容,盗版必究。中也会如鱼得水。如果你对shadowDO【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。M的css处理有自己的想法和疑问或补充,著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net都可以在本文下方留言,一起探讨。
转载请注明出处:www.tangshuang.net【转载请注明来源】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【转载请注明来源】2022-02-28 8911



::shadow 这个为何无效,是需要满足什么条件吗
贴代码看看
确实不生效
Document
#box::shadow #pp {
color: white !important;
}
123
#pp { color: red; }
ppppp
const shadowRoot = document.querySelector(‘#box’).attachShadow({mode: ‘open’})
const temp = document.querySelector(‘.box-template’)
shadowRoot.appendChild(document.importNode(temp.content, true))
建议用codesandbox写个demo,而不是这样发代码
有没有可能是你这个评论写链接过不了审核,我才直接贴的代码
示例:https://codepen.io/Chenjiujiu/pen/JjZPWzG?editors=1010
我刚才试了一下,确实不生效,然后又去翻了一圈儿,很遗憾的 ::shadow 和 /deep/ 都不支持了。。。2015-2016 的事了,我这文章没有求证
原生HTML ::shadow哦,不是小程序