【发布时间】:2025-12-08 04:25:01
【问题描述】:
我正在尝试在自定义 Web 组件中使用 CDN 中的 Bulma,但它似乎不起作用。
我的 html 有这个:
<!DOCTYPE html>
<html lang="en">
<head>
<title>hello</title>
<meta charset="utf-8">
</head>
<body>
<my-element></my-element>
<script src="index.js"></script>
</body>
</html>
这是我的 js 文件:
const sheet = new CSSStyleSheet()
sheet.replace('@import url("https://cdn.jsdelivr.net/npm/bulma@0.9.2/css/bulma.min.css")');
class MyElement extends HTMLElement {
connectedCallback(){
let that = this
let id = Math.random()
this.id = id
const shadowRoot = this.attachShadow({ mode: 'open' })
shadowRoot.adoptedStyleSheets = [sheet]
let child = document.createElement('button')
child.classList.add("button")
child.innerText = id
child.id = count
shadowRoot.appendChild(child)
this.addEventListener('click', e => {
e.target
console.log(that.id)
that.remove()
})
}
}
if(!customElements.get('my-element')){
customElements.define('my-element', MyElement)
}
let count = Math.floor(Math.random() * 10) + 1
for(i = 0; i <= count; i++){
let el = document.createElement('my-element')
document.body.appendChild(el)
}
值得注意的是,如果我使用sheet.replaceSync('button { color: green; }') 而不是sheet.replace(...),它可以正常工作。但是为什么外部 CSS 链接引用导入不起作用?
更新:我意识到我在控制台中收到以下警告:
index.js:6 @import rules are not allowed here. See https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418.
作为说明,我正在尝试使用这种方法,因此我可以以相同的方式设置多个自定义 Web 组件的样式,而无需多次导入样式表。
谢谢!
【问题讨论】:
-
在 Devtools 的 Network 选项卡中是否有任何 Cors 错误?
-
@zergski - 没有 CORS 错误,但我刚刚意识到我收到了已添加到问题中的相关警告。
-
我认为
@import规则不能动态使用,您可以通过将<link type="stylesheet" href="url">附加到您的文档来添加样式表 -
顺便说一句,您应该在构造函数中创建影子 DOM,而不是在 connectedCallback 中,因为后者可以被多次调用(例如在 DOM 中添加或移动元素时)。
-
const shadowRoot这个变量是不必要的。 shadowRoot 在this.shadowRoot的实例上始终可用。
标签: javascript css web-component