将 css 应用于 html 但不是 iframe html

Posted

技术标签:

【中文标题】将 css 应用于 html 但不是 iframe html【英文标题】:apply css to html but not iframe html 【发布时间】:2013-05-01 22:32:30 【问题描述】:

我正在为插件“时尚”制作用户样式表。

它在整个页面上应用了一个半透明的黑框以供夜间浏览。

我正在使用:

html:before 
    content:url()!important;
    position:fixed!important;
    width:100%!important;
    height:100%!important; 
    top:0!important; 
    left:0!important; 
    background:rgba(2,3,3,.35)!important; 
    z-index:99999999999999999!important;
    pointer-events:none!important;

创建固定的覆盖 div。

这很好用,但是,如果站点中有任何 iframe,它会将此代码应用到 iframe 的 HTML 中,您可以在此处看到:

因为这些社交网络小部件依赖于 IFRAME,它将代码重复到这些页面中,从而创建了我制作的半透明暗盒的双重叠加。

想要的外观应该是:

我已经尝试过 hack-ish 的东西,比如对 iframe 应用更高的 z-index 并将 iframe 中任何内容的背景颜色和背景指定为“白色”和“不透明”,以便它“浮动'在父 html 页面的顶部,但这并不完美。我也尝试过类似的东西:

html:not(iframe):before

但这也行不通。我想知道是否有办法以不依赖 'html:before' 来创建相同效果的方式来做我想做的事情,或者是否有办法做到这一点但没有在页面上的 iframe 的 html 中重复。

我已经竭尽全力试图让它发挥作用,所以任何帮助都将不胜感激。谢谢。

【问题讨论】:

第一次听说夜间浏览这个词 iframe html:before display: none; ? html:not(iframe) 总是很简单地匹配,因为 html 不是 iframe 不幸的是,这些都不起作用。这就是发生的事情,我认为:iframe 的 html 不知道它是 iframe,就“时尚”(附加组件)而言..因为它首先将更改应用于任何“html”,对html 在 iframe 中的事实。这就是为什么我认为我需要尝试“html:before”以外的其他方法来使内容出现在“父”html页面上。 考虑到您使用的是 Stylish,此 CSS 是否在用户样式表中? 【参考方案1】:

不幸的是,无法使用 CSS 仅定位 iframe 源中的 iframe 的内容,即包含 iframe 元素的页面。

由于您使用的是 Stylish,我假设您的 CSS 位于 Firefox 用户样式表中。如果是这样,您可能需要查看这些 iframes 的源 URL,创建针对这些 URL 在其域中的 @-moz-document 规则,并相应地删除 html:before 伪元素。

类似这样的东西,应该低于你已经拥有的东西:

@-moz-document domain(/* Facebook Like */), 
    domain(/* Tweet Button */), 
    domain(/* Google +1 */)

    html:before
    
        content: none !important;
    

content: none 声明禁用伪元素,阻止它被渲染。

必须以这种方式排除特定域意味着这种方法非常有限,而且根本不是很通用,但这是我能想到的最好的方法。

【讨论】:

我曾尝试过针对 twitter、fb 等进行特定领域的定位,但由于某种原因,它无法正常工作。但是,您的代码可以完美运行。我认为这是必须要做的。对此,我真的非常感激。 :) @user1975224:没问题,很高兴我能帮上忙!老实说,当我应该(并且即将)上床睡觉时,我很快就做出了反应——现在已经快到早上了!【参考方案2】:

您可能想尝试不同的路线:

html 
    box-shadow: inset 0 0 0 2000px rgba(2, 3, 3, .35) !important;

Demo

这样当用户的浏览器不支持pointer-events时网页仍然可以使用。

您可能还想查看这个问题:CSS - max z-index value

要将这些样式仅应用于父文档的 <html> 元素,而不应用于 iframe,只需使用 JS 将 box-shadow 应用于 document.documentElement

document.documentElement.style.boxShadow = "inset 0 0 0 2000px rgba(2, 3, 3, .35) !important";

【讨论】:

这很好。感谢您的建议.. 现在找到一种方法让它不适用于 iframe:[.【参考方案3】:

编辑:

我不知道插件的事情,但你可以给你的 HTML 标记一个 ID 并以这种方式定位它,尽管如果你希望它适用于所有页面,那么这是一个问题

或者也许使用 html:first-child ?我真的不知道会发生什么,不过你可以试一试

【讨论】:

不,当然不会 - html 是根元素,因此在任何一种情况下都不会匹配。 他的css如何影响iframe中的文件,我不明白 我猜这与他使用的插件有关,它是 Firefox 的用户样式表管理器。 哦,那就另当别论了 html:first-child 将不匹配,因为html 是根元素,而根元素没有父元素,因此它不是子元素。【参考方案4】:

CSS 不允许您在 iframe 中设置 HTML 样式。由于您使用的是附加组件,因此这是 CSS 的非标准实现。 iframe 不会继承样式,因为 iframe 基本上是一个新的浏览器窗口。该插件将样式添加到浏览器窗口中的每个 HTML 页面。浏览器无法知道页面是否在 iframe 中(至少不能通过 CSS 访问)。

【讨论】:

正确,尽管所讨论的插件只是 Firefox 用户样式表的 UI 前端,它是 cascade 不可或缺的一部分,并且绝对是标准的一部分。 对,但 Firefox 正在将样式应用于每个 html 元素。 CSS 不会从一个 html 元素级联到 iframe 中的一个 html 元素。它将用户样式表分别应用于两者。

以上是关于将 css 应用于 html 但不是 iframe html的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将编写在代码镜像中的 css 应用于 iframe 的 html 内容?

我可以将 CSS 应用于 iframe 中的元素吗?

利用CSS注入(无iFrames)窃取CSRF令牌

使用页面 .css 文件将 CSS 添加到 iframe 元素 [重复]

列表但不是文本的CSS 3不透明度[重复]

将悬停样式应用于任何孩子但不是父母