覆盖iframe中内容的正文样式

jd6*_*699 148 css iframe styles overriding

如何控制一个体内元素的背景图像和颜色iframe?注意,嵌入的body元素有一个类,而且iframe是一个页面,它是我站点的一部分.

我需要这个的原因是我的网站有一个黑色背景分配给身体,然后白色背景分配给包含文本的div.WYSIWYG编辑器iframe在编辑时使用嵌入内容,但它不包含div,因此文本很难阅读.

iframe编辑器中的when 的主体有一个在其他任何地方都没有使用的类,所以我假设这个被放在那里,所以这样的问题可以解决.但是,当我应用样式时,class.body它们不会覆盖应用于body的样式.奇怪的是,样式确实出现在Firebug中,所以我不知道发生了什么!

谢谢

更新 - 我已经尝试了@ mikeq的解决方案,即将类型添加到正文类的类中.这在添加到主页的样式表时不起作用,但在使用Firebug添加时它确实有效.我假设这是因为Firebug应用于页面上的所有元素,而CSS不应用于iframe中.这是否意味着在使用JavaScript加载窗口后添加css会起作用?

Sim*_*am5 244

以下仅适用于iframe内容来自同一父域的情况.

以下jquery脚本适合我.在Chrome和IE8上测试过.内部iframe引用与父页面位于同一域中的页面.

在这种特殊情况下,我在内部iframe中隐藏了一个具有特定类的元素.

基本上,您只需将"style"元素附加到内部iframe的"head".

$('iframe').load( function() {
    $('iframe').contents().find("head")
      .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
});
Run Code Online (Sandbox Code Playgroud)

  • @ SimpleSam5你能提供Javascript替代方案(不使用Jquery)吗? (4认同)
  • @sincerekamal 这是不需要 jQuery 的代码:https://jsfiddle.net/9g9wkpon/ 您只需要知道带连字符的 CSS 属性是在 JavaScript 中以驼峰命名写的,就像我的例子一样。:) (2认同)
  • jquery.js?ver = 1.12.4:2未捕获DOMException:无法从'HTMLIFrameElement'读取'contentDocument'属性:阻止来自访问跨源帧的源"https://xxxxxxxxx.com"的帧. (2认同)
  • @AlexStanese作为jeremy陈述,这只适用于iframe页面来自与父页面相同的服务器...这通常意味着你不需要打扰javascript ...只需将CSS添加到其他页面在第一个地方. (2认同)

DA.*_*DA. 101

iframe是页面中的"洞",显示其中的另一个网页.iframe的内容不是任何形状或父页面的一部分.

正如其他人所说,您的选择是:

  • 给iframe中加载的文件提供必要的CSS
  • 如果iframe中的文件来自与父级相同的域,则可以从父级访问iframe中的文档的DOM.

  • ‘假’。别被骗了! (2认同)

Myl*_*ray 25

您无法更改iframe中显示的页面样式,除非您具有直接访问权限,因此您拥有源html和/或css文件的所有权.

这是为了阻止XSS(跨站点脚本)

  • 那么你需要更改你网站上的源文件(你不能修改iframe中的任何内容) - 所以如果iframe指向mysite.com/test.html那么你需要直接修改test.html .. . (2认同)

Ale*_*olo 8

一个iframe有另一个范围,所以你不能访问的样式或改变其使用JavaScript的内容.

它基本上是"另一页".

你唯一能做的就是编辑自己的CSS,因为使用全局CSS你无法做任何事情.


CPH*_*hon 7

覆盖另一个域 iframe CSS

通过使用SimpleSam5的部分答案,我通过一些Tawk的聊天iframe实现了这一点(他们的定制界面很好,但我需要进一步的自定义).

在显示在移动设备上的这个特定iframe中,我需要隐藏默认图标并放置我的一个背景图像.我做了以下事情:

Tawk_API.onLoad = function() {
// without a specific API, you may try a similar load function
// perhaps with a setTimeout to ensure the iframe's content is fully loaded
  $('#mtawkchat-minified-iframe-element').
    contents().find("head").append(
     $("<style type='text/css'>"+
       "#tawkchat-status-text-container {"+
         "background: url(https://example.net/img/my_mobile_bg.png) no-repeat center center blue;"+
         "background-size: 100%;"+
       "} "+
       "#tawkchat-status-icon {display:none} </style>")
   );
};
Run Code Online (Sandbox Code Playgroud)

我没有任何Tawk的域名,这对我有用,因此你可以这样做,即使它不是来自同一个父域名(尽管Jeremy Becker对Sam的答案的评论).

  • 我怀疑这只有效,因为Tawk的人已明确允许它. (13认同)
  • 尝试覆盖谷歌翻译栏CSS,它工作了! (2认同)

jth*_*ter 5

此代码使用原始JavaScript。它创建一个新<style>元素。它将该元素的文本内容设置为包含新CSS的字符串。并将该元素直接附加到iframe文档的头部。

var iframe = document.getElementById('the-iframe');
var style = document.createElement('style');
style.textContent =
  'body {' +
  '  background-color: some-color;' +
  '  background-image: some-image;' +
  '}' 
;
iframe.contentDocument.head.appendChild(style);
Run Code Online (Sandbox Code Playgroud)

  • “阻止了原点为xxxxxxxxx的框架访问跨原点框架。”恐怕它不起作用 (5认同)
  • 嘿@JustineM。你能帮我实现这个目标吗 (2认同)