javascript - litelement - 在开槽元素中设置嵌套元素的样式
问题描述
我正在使用 litelement 创建一个简单的自定义元素。该元素将通过插槽接受各种输入。在这一点上,我什至没有使用命名插槽。
我无法将样式应用于嵌套在开槽中的元素。例如,在此代码段https://codepen.io/aver-mimas/pen/qePZXY中,我正在使用此元素的 3 种不同变体,如下所示:
<content-card>
<p>This is a paragraph</p>
</content-card>
<content-card heading="Card2 title" background="grey">
<p>Content of Card 2</p>
<a href="#">Terms of Use</a>
<p>There's more</p>
</content-card>
<content-card heading="Another card with long title & content" background="dark">
<p>Content of card3. <a href="#">Policy</a></p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Animi nesciunt cupiditate, nam vel ad sit maxime soluta? Molestias accusamus cupiditate, dolor corrupti id pariatur laudantium velit. Odio temporibus nesciunt officiis!</p>
</content-card>
我似乎无法将背景/颜色样式应用于<a>
最后一个自定义元素中的元素。如果它不像 2nd 那样嵌套<content-card>
,那就没关系。
我错过了什么,以便我可以将相同的样式应用于<a>
元素,而不管它在自定义元素的插槽中的什么位置?
解决方案
::slotted()
仅适用于在 a 中分配的顶级元素<slot>
。
因此,您不能使用它来设置嵌套元素的样式。在您的情况下,<a>
样式将是主文档中定义的样式(因为<a>
在轻 DOM 中,所以它继承自全局 CSS 样式)。
然后解决方案是<a>
在主文档中定义 CSS。你可以将它插入到<head>
元素中,或者在 light DOM 级别。要将特定样式限制为自定义元素内容,请在之前添加其名称:
<style>
custom-card a {
color: white;
background-color: red;
}
</style>
customElements.define( 'custom-card', class extends HTMLElement {
connectedCallback() {
this.insertAdjacentHTML( 'beforeBegin', `<style> custom-card a { color: red } </style>` )
this.attachShadow( { mode: 'open' } )
.innerHTML = `<div><slot></slot></div>`
}
} )
<custom-card>
<a href>First level link</a>
<p><a href>Link inside a paragraph</a></p>
</custom-card>
推荐阅读
- javascript - Vue.js 在拖动和单击时转换
- python - 为什么“\n”出现在我的字符串输出中?
- kubernetes - dsl.ContainerOp 与 python
- javascript - 如何在 NodeJS 中限制跨多个请求的函数调用?
- python - 如何使用 praw 从 reddit 下载视频
- amazon-web-services - 在 java 中使用带有 OR 和 AND 条件的 Amazon/AWS DynamodB 扫描过滤器
- javascript - React - 具有多个类的样式化组件
- angular - 根据物料表中的值隐藏行
- python - 获取数据框中基于常见项目列表的列
- wordpress - 我们的服务器和 CDN 准备好迎接更多活跃用户了吗?