提问



我有一个简单的页面,有一些iframe部分(显示RSS链接)。如何将主页面中的相同CSS格式应用于iframe中显示的页面?

最佳参考


 除非设置了适当的CORS标头,否则这不适用于跨域。[61]


这里有两个不同的东西:iframe块的样式和嵌入在iframe中的页面样式。您可以通常的方式设置iframe块的样式:


<iframe name="iframe1" id="iframe1" src="empty.htm" 
        frameborder="0" border="0" cellspacing="0"
        style="border-style: none;width: 100%; height: 120px;"></iframe>


嵌入在iframe中的页面样式必须通过将其包含在子页面中来设置:


<link type="text/css" rel="Stylesheet" href="Style/simple.css" />


或者可以使用Javascript从父页面加载:


var cssLink = document.createElement("link");
cssLink.href = "style.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 
frames['iframe1'].document.head.appendChild(cssLink);

其它参考1


我用 Google日历遇到了这个问题。我想在较暗的背景上设计它并更改字体。


幸运的是,嵌入代码中的URL对直接访问没有限制,因此通过使用PHP函数file_get_contents可以获得
来自页面的整个内容。可以调用位于服务器上的php文件,而不是调用Google URL。 google.php,其中包含原始内容并进行修改:


$content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal');


添加样式表的路径:


$content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content);


(这会将样式表放在head结束标记之前。)


如果相对调用css和js,请指定原始URL的基本URL:


$content = str_replace('</title>','</title><base href="https://www.google.com/calendar/" />', $content);


最终的google.php文件应如下所示:


<?php
$content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal');
$content = str_replace('</title>','</title><base href="https://www.google.com/calendar/" />', $content);
$content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content);
echo $content;


然后将iframe嵌入代码更改为:


<iframe src="http://www.yourwebsiteurl.com/google.php" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>


祝你好运!

其它参考2


如果iframe的内容不完全在您的控制之下,或者您想要使用不同样式访问不同页面中的内容,则可以尝试使用JavaScript进行操作。


var frm = frames['frame'].document;
var otherhead = frm.getElementsByTagName("head")[0];
var link = frm.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.setAttribute("href", "style.css");
otherhead.appendChild(link);


请注意,根据您使用的浏览器,这可能仅适用于来自同一域的网页。

其它参考3


var $head = $("#eFormIFrame").contents().find("head");

$head.append($("<link/>", {
    rel: "stylesheet",
    href: url,
    type: "text/css"
}));

其它参考4


大多数浏览器都像一个不同的HTML页面一样处理iframe。如果要将相同的样式表应用于iframe的内容,只需从其中使用的页面引用它。

其它参考5


如果您控制iframe中的页面,就像hangy所说,最简单的方法是创建一个具有常见样式的共享CSS文件,然后从您的html页面链接到它。


否则,您不太可能从iframe中的外部页面动态更改页面样式。这是因为浏览器已经加强了跨框架dom脚本的安全性,因为可能会滥用欺骗和其他黑客攻击。


本教程可能会为您提供有关一般编写iframe脚本的更多信息。关于跨框架脚本从IE的角度解释了安全限制。[62] [63]

其它参考6


以下是如何直接应用CSS代码而不使用<link>来加载额外的样式表。


var head = jQuery("#iframe").contents().find("head");
var css = '<style type="text/css">' +
          '#banner{display:none}; ' +
          '</style>';
jQuery(head).append(css);


这会在iframe页面中隐藏横幅。谢谢你的建议!

其它参考7


以上稍作改动的工作原理:


var cssLink = document.createElement("link") 
cssLink.href = "pFstylesEditor.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 

//Instead of this
//frames['frame1'].document.body.appendChild(cssLink);
//Do this

var doc=document.getElementById("edit").contentWindow.document;

//If you are doing any dynamic writing do that first
doc.open();
doc.write(myData);
doc.close();

//Then append child
doc.body.appendChild(cssLink);


适用于ff3和ie8至少

其它参考8


如果你想从主页面重用CSS和JavaScript,你应该考虑用加载Ajax的内容替换<IFRAME>。现在,当搜索机器人能够执行JavaScript时,这更加SEO友好。


这是jQuery示例,其中包含另一个html页面到您的文档中。这比iframe更加SEO友好。为了确保机器人没有为包含的页面建立索引,只需在robots.txt [64]中将其添加到禁止中


<html>
  <header>
    <script src="/js/jquery.js" type="text/javascript"></script>
  </header>
  <body>
    <div id='include-from-outside'></div>
    <script type='text/javascript'>
      $('#include-from-outside').load('http://example.com/included.html');
    </script> 
  </body>
</html>


您还可以直接从Google中添加jQuery:http://code.google.com/apis/ajaxlibs/documentation/- 这意味着可选的自动包含更新的版本和一些显着的速度提升。此外,意味着你必须信任它们只为你提供jQuery;)[65]

其它参考9


以下对我有用。


var iframe = top.frames[name].document;
var css = '' +
          '<style type="text/css">' +
          'body{margin:0;padding:0;background:transparent}' +
          '</style>';
iframe.open();
iframe.write(css);
iframe.close();

其它参考10


我的精简版:


<script type="text/javascript">
$(window).load(function () {
    var frame = $('iframe').get(0);
    if (frame != null) {
        var frmHead = $(frame).contents().find('head');
        if (frmHead != null) {
            frmHead.append($('style, link[rel=stylesheet]').clone()); // clone existing css link
            //frmHead.append($("<link/>", { rel: "stylesheet", href: "/styles/style.css", type: "text/css" })); // or create css link yourself
        }
    }   
});
</script>


但是,有时iframe在窗口加载时没有准备就绪,因此需要使用计时器


即用型代码(带计时器):


<script type="text/javascript">
var frameListener;
$(window).load(function () {
    frameListener = setInterval("frameLoaded()", 50);
});
function frameLoaded() {
    var frame = $('iframe').get(0);
    if (frame != null) {
        var frmHead = $(frame).contents().find('head');
        if (frmHead != null) {
            clearInterval(frameListener); // stop the listener
            frmHead.append($('style, link[rel=stylesheet]').clone()); // clone existing css link
            //frmHead.append($("<link/>", { rel: "stylesheet", href: "/styles/style.css", type: "text/css" })); // or create css link yourself
        }
    }
}
</script>


...和jQuery链接:


<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"></script>

其它参考11


扩展上述jQuery解决方案,以应对加载帧内容的任何延迟。


$('iframe').each(function(){
    function injectCSS(){
        $iframe.contents().find('head').append(
            $('<link/>', { rel: 'stylesheet', href: 'iframe.css', type: 'text/css' })
        );
    }

    var $iframe = $(this);
    $iframe.on('load', injectCSS);
    injectCSS();
});

其它参考12


您将无法以这种方式设置iframe的内容样式。我的建议是使用服务器端脚本(PHP,ASP或Perl脚本)或找到将feed转换为JavaScript代码的在线服务。唯一的另一种方法是,如果你可以做一个服务器端包含。

其它参考13


当你说doc.open()时,这意味着你可以在iframe中编写任何HTML标签,所以你应该为HTML页面编写所有基本标签,如果你想在你的iframe头部有一个CSS链接,那就写一个iframe中有CSS链接。我举个例子:


doc.open();

doc.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><meta http-quiv="Content-Type" content="text/html; charset=utf-8"/><title>Print Frame</title><link rel="stylesheet" type="text/css" href="/css/print.css"/></head><body><table id="' + gridId + 'Printable' + '" class="print" >' + out + '</table></body></html>');

doc.close();

其它参考14


这里的其他答案似乎使用jQuery和CSS链接。


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


var iframe = document.getElementById('the-iframe');
var style = document.createElement('style');
style.textContent =
  '.some-class-name {' +
  '  some-style-name: some-value;' +
  '}' 
;
iframe.contentDocument.head.appendChild(style);

其它参考15


我们可以在iframe中插入样式标签。也发布在这里...


<style type="text/css" id="cssID">
.className
{
    background-color: red;
}
</style>

<iframe id="iFrameID"></iframe>

<script type="text/javascript">
    $(function () {
        $("#iFrameID").contents().find("head")[0].appendChild(cssID);
        //Or $("#iFrameID").contents().find("head")[0].appendChild($('#cssID')[0]);
    });
</script>

其它参考16


我找到了另一个解决方案,将样式放在主html中,就像这样


<style id="iframestyle">
    html {
        color: white;
        background: black;
    }
</style>
<style>
    html {
        color: initial;
        background: initial;
    }
    iframe {
        border: none;
    }
</style>


然后在iframe中执行此操作(请参阅js onload)


<iframe  onload="iframe.document.head.appendChild(ifstyle)" name="log" src="/upgrading.log"></iframe>


并在js


<script>
    ifstyle = document.getElementById('iframestyle')
    iframe = top.frames["log"];
</script>


它可能不是最好的解决方案,它肯定可以改进,但如果你想在父窗口中保留一个样式标签,这是另一种选择

其它参考17


使用可以试试这个:


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

其它参考18


我认为最简单的方法是在iframe的同一个地方添加另一个div


使其z-index大于iframe容器,因此您可以轻松地设置自己的div样式。如果你需要点击它,只需在你自己的div上使用pointer-events:none,所以如果你需要点击它就会运行iframe;)


我希望它会帮助某人;)

其它参考19


如果您有权访问iframe页面并且只有在您通过页面上的iframe加载时才想要使用其他CSS,这里我找到了解决这些问题的方法


即使iframe正在加载不同的域,这也适用


查看postMessage()


计划是,将css作为消息发送给iframe


iframenode.postMessage('h2{color:red;}','*');


*是发送此消息而不管iframe中的域名是什么


并在iframe中接收消息并将收到的消息(CSS)添加到该文档头。


要在iframe页面中添加的代码


window.addEventListener('message',function(e){

    if(e.data == 'send_user_details')
    document.head.appendChild('<style>'+e.data+'</style>');

});

其它参考20


有一个很棒的脚本用一个iframe版本替换一个节点。
CodePen 演示 [67] [68]


[69]


使用示例:


// Single node
var component = document.querySelector('.component');
var iframe = iframify(component);

// Collection of nodes
var components = document.querySelectorAll('.component');
var iframes = Array.prototype.map.call(components, function (component) {
  return iframify(component, {});
});

// With options
var component = document.querySelector('.component');
var iframe = iframify(component, {
  headExtra: '<style>.component { color: red; }</style>',
  metaViewport: '<meta name="viewport" content="width=device-width">'
});

其它参考21


最好的方法可能是以下(如果您控制目标站点):


1)使用style参数设置iframe链接,如:


http://your_site.com/target.php?style=a%7Bcolor%3Ared%7D


(最后一个短语是a{color:red}urlencode函数编码。


2)设置接收器页面target.php,如下所示:


<head>
..........
<style><? echo urldecode($_GET['style']);?> </style>
..........

其它参考22




var link1 = document.createElement('link');
    link1.type = 'text/css';
    link1.rel = 'stylesheet';
    link1.href = "../../assets/css/normalize.css";
window.frames['richTextField'].document.body.appendChild(link1);



这里,域内有两件事



  1. iFrame部分

  2. 页面加载在iFrame



所以你想要按如下方式设计这两个部分,


1。 iFrame部分的样式


它可以使用具有所谓的idclass名称的CSS来设置样式。您也可以在父样式表中设置样式。


<style>
#my_iFrame{
height: 300px;
width: 100%;
position:absolute;
top:0;
left:0;
border: 1px black solid;
}
</style>

<iframe name='iframe1' id="my_iFrame" src="#" cellspacing="0"></iframe>


2。设置iFrame内加载的页面样式


可以在Javascript的帮助下从父页面加载此样式


var cssFile  = document.createElement("link") 
cssLink.rel  = "stylesheet"; 
cssLink.type = "text/css"; 
cssLink.href = "iFramePage.css"; 


然后将该CSS文件设置为受尊重的iFrame部分


//to Load in the Body Part
frames['my_iFrame'].document.body.appendChild(cssFile); 
//to Load in the Head Part
frames['my_iFrame'].document.head.appendChild(cssFile);





在这里,您也可以使用这种方式在iFrame内编辑页面的头部


var $iFrameHead = $("#my_iFrame").contents().find("head");
$iFrameHead .append(
   $("<link/>",{ 
      rel: "stylesheet", 
      href: urlPath , 
      type: "text/css" }
     ));

其它参考23


作为替代方案,您可以使用CSS-in-JS技术,如下面的lib:


https://github.com/cssobj/cssobj[70]


它可以动态地将JS对象作为CSS注入iframe

其它参考24


好吧,我遵循了以下步骤:



  1. 分组持有iframe

  2. iframe添加到div

  3. 在CSS文件中,



divClass { width: 500px; height: 500px; }
divClass iframe { width: 100%; height: 100%; }


这适用于IE 6.应该在其他浏览器中工作,请检查!