How can I contain the styles of a Chrome Extension content script?
我正在开发一个将一些 UI 反应组件注入页面的 Chrome 扩展程序。
UI 组件来自 react-mdl。使用它们需要我在项目顶部包含一个 css 文件。
不幸的是,一旦将 css 注入页面,整个页面的字体就会改变。
有没有办法限制 react-mdl 使用的 css 的范围,这样它就不会影响我要注入的页面?
- 所以这只发生在其他使用反应的网页上?
- 不,我只注入到一个域中的页面,并且它的页面都没有使用 React(或任何框架 – 只是 vanilla JS/jquery 和 css/html)
- 好的,你能分享一些css文件吗?也许只是使用您知道不会在其他任何地方使用的自定义类名
- 实际上,我看到了这个问题。您链接的 css 文件具有非常通用的标签,例如 body。您可能需要手动重命名这些
- 啊,我害怕那个。据您所知,没有办法强制范围吗?我可以对 material.css 进行一点处理并摆脱页面级的东西,但如果我可以避免篡改它,我会喜欢它。
- 听起来如果你明白了,你应该没问题。让我知道它是否有效:)
- 凌乱的工作,这个网页设计。谢谢@NoamHacker。我可以先体验一下
- @NoamHacker 证明下面@Deliaz 提到的 shadowDOM 效果很好。它将我需要的样式完全封装在我注入的 div 中。
- 谢谢,很高兴我学到了新东西!
将这个作为已接受的答案发布给后人值得称赞,但如果有人发现自己处于类似的困境中,以下是对我有用的代码片段:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// my injected code
window.addEventListener(‘load’, () => { const injectDiv = document.createElement(‘div’) const shadowRoot = injectDiv.attachShadow({ mode: ‘open’ }) // note inline use of webpack raw-loader, so that the css shadowRoot.innerHTML = // just using template string |
那么,果然:
我认为你应该使用 Shadow DOM API。当您只需要将 UI 组件附加到网页时,这是一种很好的做法。
https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom
- 谢谢。我将不得不稍微调整一下我的 webpack 配置以使 css 内联正常工作,但是当我将整个 material.css 粘贴到 shadow 根目录中的 style 标记中时,效果很好。
正如在另一篇 SO 帖子中提到的,也支持 <link> 标签,因此可以简单地执行以下操作:
1
2 3 4 5 6 7 |
const injectedDiv = document.createElement(‘div’);
const shadowRoot = injectedDiv.attachShadow({ mode: ‘open’ }); shadowRoot.innerHTML = `\\ <link rel=“stylesheet” type=“text/css” href=“${chrome.extension.getURL(“bootstrap.min.css“)}”></link>\\ <link rel=“stylesheet” type=“text/css” href=“${chrome.extension.getURL(“whatever.css“)}”></link>\\ `; document.body.appendChild(injectedDiv); |
注释:
来源:https://www.codenong.com/42072905/