【问题标题】:Css–selector for when a html-document is inside an iframe?当 html 文档位于 iframe 中时的 CSS 选择器?
【发布时间】:2014-03-17 12:48:30
【问题描述】:

我正在尝试创建一个 css 选择器,它根据 html 是否在 iframe 内的天气来分配不同的属性。我试过这个:

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

如果它在 iframe 内,我希望这会将 background: black; 应用于正文,但它没有,为什么?是否有任何 CSS 选项?如果 html 是 root,我总是可以使用 javascript 检查。

不需要IE8支持。

【问题讨论】:

  • 正文有时会在 iframe 中显示为第三方网站上的小部件,有时会单独显示。
  • 您不能从 iframe 外部应用 CSS。
  • 回复了,然后看到您的让步,即您始终可以使用 javascript,这正是我的建议。根据我对 CSS 在框架内的运作方式的了解,我认为这不是一个选项 :(
  • 这会让您的问题有所了解,请review this answer
  • @Sunil Kumar:不过,这个问题的性质非常不同。

标签: css


【解决方案1】:

发布我的评论作为更好显示的答案,您应该:

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

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

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

如果您希望检测JS代码位于父框架内,请选择:

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

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

【讨论】:

    【解决方案2】:
    html:not(root) body {
        background: black !important;
    }
    

    作品

    【讨论】:

    • 这在 Chrome 39 上不起作用,我认为它不会在任何其他浏览器上运行。
    【解决方案3】:

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

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

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

    在此处使用 JavaScript 文档访问 iframe 中的元素:Javascript - Get element from within an iFrame

    【讨论】:

    • 用JS做检测好,但是不要在JS里做样式:在JS中做分框检测,根据检测结果放一个类(或数据属性),然后应用使用这个新的类/数据属性选择器的常用 CSS 文件(这分离了职责,并允许使用严格的 CSP)
    • @Xenos 你所说的“新类/数据属性选择器”是什么意思?
    • 对 iframed-html 页面中的两个代码执行 if (window.parent !== window) { document.documentElement.classList.add('inside-iframe'); } + html.inside-iframe { /* properties */ }(如果愿意,父框架中的 JS 检测代码将类似于 document.querySelectorAll('iframe').forEach(i => i.contentDocument.documentElement.classList.add('inside-iframe'));
    【解决方案4】:

    CSS 仅适用于同一个文档。 iframe 本身就是一个完整的文档,因此适用于 包含该 iframe 的页面的 CSS 规则不能适用于 in 该 iframe 的页面。

    这意味着就 HTML 和 CSS 而言,html始终:root(因此永远不会:not(:root))。 p>

    除非您能够将此 CSS 从包含页面传输到 iframe 内的页面(例如使用脚本),否则我不相信有办法只使用 CSS。

    【讨论】:

    • 它们的工作方式非常不同。就像我说的,CSS 严格来说是每个文档的。
    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2019-12-03
    • 2019-06-20
    • 2018-01-16
    • 2019-11-20
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多