How to apply CSS to iframe?
我有一个简单的页面,其中有一些iframe部分(显示RSS链接)。如何将相同的CSS格式从主页应用到iframe中显示的页面?
编辑:除非设置了适当的CORS头,否则这不会跨域工作。
这里有两种不同的东西:iframe块的样式和iframe中嵌入的页面的样式。可以按常规方式设置iframe块的样式:
1 2 3 | <iframe name="iframe1" id="iframe1" src="empty.htm" frameborder="0" border="0" cellspacing="0" style="border-style: none;width: 100%; height: 120px;"></iframe> |
嵌入在iframe中的页面样式必须通过将其包含在子页面中进行设置:
1 | <link type="text/css" rel="Stylesheet" href="Style/simple.css" /> |
或者可以使用javascript从父页面加载:
1 2 3 4 5 | var cssLink = document.createElement("link"); cssLink.href="style.css"; cssLink.rel ="stylesheet"; cssLink.type ="text/css"; frames['iframe1'].document.head.appendChild(cssLink); |
我在谷歌日历上遇到了这个问题。我想在较暗的背景上设置它的样式并更改字体。
幸运的是,嵌入代码中的URL对直接访问没有限制,因此通过使用php函数
1 | $content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal'); |
将路径添加到样式表中:
1 | $content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content); |
(这将使样式表最后放置在
如果CSS和JS被相对调用,请指定原始URL的基URL形式:
1 | $content = str_replace('','<base href="https://www.google.com/calendar/" />', $content); |
最终的
1 2 3 4 5 | <?php $content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal'); $content = str_replace('','<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; |
然后将
1 | <iframe src="http://www.yourwebsiteurl.com/google.php" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe> |
祝你好运!
如果iframe的内容不完全在您的控制之下,或者您想要从不同风格的不同页面访问内容,您可以尝试使用javascript来操作它。
1 2 3 4 5 6 7 | 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); |
请注意,根据您使用的浏览器,这可能只适用于从同一域提供服务的页面。
1 2 3 4 5 6 7 | var $head = $("#eFormIFrame").contents().find("head"); $head.append($("<link/>", { rel:"stylesheet", href: url, type:"text/css" })); |
大多数浏览器都将iframe当作不同的HTML页面来处理。如果要将相同的样式表应用于iframe的内容,只需从其中使用的页面引用它。
如果您控制iframe中的页面,如hangy所说,最简单的方法是创建一个具有通用样式的共享CSS文件,然后从HTML页面链接到它。
否则,您将无法在iframe中动态地从外部页面更改页面样式。这是因为浏览器已经加强了跨帧DOM脚本的安全性,因为可能会误用欺骗和其他黑客。
本教程将为您提供有关编写iframes脚本的更多信息。关于跨框架脚本从IE的角度解释了安全限制。
下面介绍如何在不使用
1 2 3 4 5 | var head = jQuery("#iframe").contents().find("head"); var css = '<style type="text/css">' + '#banner{display:none}; ' + '</style>'; jQuery(head).append(css); |
这将隐藏iframe页面中的横幅。谢谢你的建议!
上面稍作改动就行了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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时工作正常
如果您希望重用主页上的CSS和JavaScript,那么您应该考虑用Ajax加载的内容替换
这是jquery示例,在文档中包含另一个HTML页面。这比
1 2 3 4 5 6 7 8 9 10 11 | <html> <header> <script src="/js/jquery.js" type="text/javascript"> </header> <body> <script type='text/javascript'> $('#include-from-outside').load('http://example.com/included.html'); </body> </html> |
您还可以直接从Google中包含jquery:http://code.google.com/apis/ajaxlibs/documentation/-这意味着可以选择自动包含较新的版本,并显著提高速度。另外,这意味着您必须相信他们只为您提供jquery;)
以下内容对我很有用。
1 2 3 4 5 6 7 8 | 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(); |
在上面的jquery解决方案上进行扩展,以处理加载帧内容的任何延迟。
1 2 3 4 5 6 7 8 9 10 11 | $('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(); }); |
我的精简版:
1 2 3 4 5 6 7 8 9 10 11 | <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 } } }); |
但是,有时
准备好使用代码(带计时器):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <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 } } } |
…和jquery链接:
1 | <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"> |
当你说"doc.open()"时,这意味着你可以在iframe中写任何HTML标记,所以你应该为HTML页面写所有的基本标记,如果你想在iframe头部有一个css链接,只需写一个iframe,其中包含css链接。我举个例子:
1 2 3 4 5 | doc.open(); doc.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><meta http-quiv="Content-Type" content="text/html; charset=utf-8"/>Print Frame<link rel="stylesheet" type="text/css" href="/css/print.css"/></head><body><table id="' + gridId + 'Printable' + '" class="print">' + out + '</table></body></html>'); doc.close(); |
试试这个:使用CAN
1 2 3 4 | $('iframe').load( function() { $('iframe').contents().find("head") .append($("<style type='text/css'> .my-class{display:none;} </style>")); }); |
您将无法以这种方式设置iframe内容的样式。我的建议是使用服务器端脚本(PHP、ASP或Perl脚本),或者找到一个将提要转换为JavaScript代码的在线服务。唯一的另一种方法是,如果您可以执行服务器端的include。
这里的其他答案似乎使用jquery和css链接。
此代码使用普通的javascript。它创建了一个新的