当html文档在iframe中时的css选择器?

bd1hkmkf  于 2023-03-20  发布在  其他
关注(0)|答案(5)|浏览(242)

我试着做一个css选择器,根据html是否在iframe中来分配不同的属性。

html:not(:root) body {
    background: black !important;
}

我希望这可以应用background: black;到一个iframe中的body,但是它没有,为什么?有css选项吗?我总是可以用javascript检查html是否是根目录。
不需要IE8支持。

y1aodyip

y1aodyip1#

CSS只在同一个文档中起作用,iframe本身就是一个完整的文档,因此应用于包含iframe的页面的CSS规则不能应用于包含iframe的页面。
这意味着就HTML和CSS而言,html总是:root(因此永远不可能是:not(:root))。
除非您能够将此CSS从包含页面传输到iframe中的页面(例如使用脚本),否则我不相信有一种方法可以只使用CSS。

xqnpmsa8

xqnpmsa82#

也许可以使用JavaScript在iframe中进行样式化。

document.querySelector('iframe').contentDocument.body.querySelector('#some-element').style.background-color = 'red';

**重要提示:**确保iframe在同一个域中,否则您无法访问其内部。这将是跨站点脚本。

使用JavaScript文档访问iframe内的元素,请参阅此处:Javascript - Get element from within an iFrame

tzdcorbm

tzdcorbm3#

张贴我的评论作为更好的显示答案,你应该:

  • 在JS中放置“is in iframe”检测代码,因为我没有看到任何其他的方法来这样做
  • 根据JS结果将CSS代码放入iframe

因此,如果所有代码都在iframe中,请执行以下操作:

if (window.parent !== window) {
    document.documentElement.classList.add('inside-iframe');
}
html.inside-iframe {
    bkacground-color: black;
}

如果你想让detection-JS-code在父框架内,那么可以:

document.querySelectorAll('iframe')
    .forEach(i => i.contentDocument.documentElement.classList.add('inside-iframe'));

假设在执行此JS时加载了iframe(否则contentDocument/documentElement将不存在)。在这种情况下,您可以依赖于iframe的load事件(但无论如何,将“is-in-iframe”检测放在iframe本身中似乎更好,因为相应的CSS也在iframe内部)

wvt8vs2t

wvt8vs2t4#

let iframe = document.querySelector('iframe[name="marco"]');
let ele = iframe.contentWindow.document.querySelector("#someElement")
piok6c0g

piok6c0g5#

html:not(root) body {
    background: black !important;
}

工程

相关问题