我正在编写一个Google Chrome扩展,它在每个页面上运行一个内容脚本。在我的内容脚本中,我向页面注入了一个<div>
以及一些<ul>
和<li>
子元素。我在样式表中为这些元素指定了一些样式。
但是我发现在一些随机的页面上,我的元素会从网页上定义的元素继承样式,因为我没有为我的div指定每个样式属性。
阻止注入元素继承这些样式的最佳方法是什么?
在我看来,我可以:
- 指定样式表中的每一个样式(例如,通过查看没有干扰时计算的样式),或者
- 我可以把我的
<div>
放在<iframe>
里面,但是,我必须在我的内容脚本的iframe和源页面之间进行hella消息传递,因为我的iframe src的chrome://
URL和源页面的http://
URL将被视为跨源。
3条答案
按热度按时间eyh26e7m1#
我会选择第一种方法--完全指定所用元素的样式。但这比我想象的要复杂一些。
首先,你必须完整地指定容器元素;然后,对于它的后代,你必须声明它们也应该使用默认值或从它们的父元素继承(直到容器);最后,你必须指定每个其他元素的外观,以便它们不都是纯span。
相关的API是
getComputedStyle
和DOM Level 2 Style中的CSSStyleSheet
接口,除了width
和height
之外,您可以使用其中的所有值,默认值应为auto
。您还需要下载一个默认样式表。例如Webkit user agent stylesheet,然后可以调用以下函数来创建一个完整的样式表,并将其注入到文档中。请注意,当您将样式表插入目标文档时,您必须使容器选择器尽可能具体,因为可以想象,网页可能会给予比您的规则更具体的规则。例如,在
<html id=a><head id=b><style>#a #b * {weird overrides}</style></head>
中,#a #b *
比#yourId div
具有更高的具体性。但我认为这并不常见。注意:由于某种原因,Chrome在我加载CSS时会显示错误“加载资源失败”,除非它已经在当前文档的
<link>
中,所以你也应该在调用此函数的页面中包含html.css。flvtvl502#
更新:我最近不得不重新考虑这个问题,如果网页直接设置元素类型的样式,那将是一场噩梦。我的新方法如下:
1.有一个所有内容都是其子级的基本div。
1.使用通配符样式并执行以下所有操作:还原
1.排除SVG,因为“all:revert”将终止SVG
1.同时重置contenteditable。
scss示例:
更多文字:https://blog.mukunda.com/cat/2023/getting-around-existing-css-for-overlays.txt
uz75evzq3#
我最近创建了Boundary,一个CSS+JS库来解决类似的问题。Boundary创建的元素完全独立于现有网页的CSS。
以创建对话框为例,安装Boundary后,可以在内容脚本中执行此操作
yourDialogID中的元素不受现有网页的影响。
希望这对你有帮助。如果你有任何问题请告诉我。
https://github.com/liviavinci/Boundary