乐闻世界logo
搜索文章和话题

如何将 css 应用于 iframe

7 个月前提问
3 个月前修改
浏览次数182

6个答案

1
2
3
4
5
6

如何将CSS应用于iframe?,在HTML中,iframe 元素可以用来嵌入另一个HTML页面。一般来说,由于安全和隔离的原因,直接对iframe中的内容应用CSS样式是有一定限制的。不过,仍有几种方法可以应用CSS到iframe中:

1. 同源策略

如果iframe加载的页面与父页面属于同一源(即协议、域名和端口都相同),则可以通过JavaScript访问iframe的内容并动态添加样式。以下是一个例子:

javascript
// 获取iframe的contentDocument var iframeDocument = document.getElementById('my-iframe').contentDocument; // 向iframe的head中添加样式 var styleElement = iframeDocument.createElement('style'); styleElement.type = 'text/css'; styleElement.innerHTML = 'body { background-color: #f0f0f0; }'; // 你的CSS样式 iframeDocument.head.appendChild(styleElement);

2. 通过iframe的src属性引用的页面

如果你可以控制iframe中显示内容的HTML,你可以直接在该HTML文件中引入CSS样式或者<style>标签。例如,iframe的HTML内容可能是这样的:

html
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="iframe-style.css"> <!-- 或者直接在这里写入样式 --> <style> body { background-color: #f0f0f0; } </style> </head> <body> <!-- iframe的内容 --> </body> </html>

这个HTML文件会作为iframesrc属性的值来加载显示。

3. 通过查询参数或其他方法传递样式信息

如果你不能直接修改iframe内容,但是仍然可以控制其加载的URL,可以考虑通过URL的查询参数传递样式信息,并在iframe内部的页面中通过JavaScript来动态应用这些样式。这种方法需要iframe内容页面的支持来解析URL参数并应用样式。

4. 使用CSS隔离属性(如all: initial;

在某些情况下,你可能想让iframe元素自身的样式与外部页面隔离。使用CSS的all属性可以重置iframe元素内的所有属性到初始值,从而避免外部样式的影响:

css
#my-iframe { all: initial; }

需要注意的是,这并不会影响到iframe里面页面的样式,只是重置了iframe元素自身的样式。

注意事项

由于浏览器的同源策略,你可能无法通过JavaScript访问或修改不同源的iframe内容。这是一种安全措施,以防止跨站点脚本攻击(XSS)。

如果仍然需要向不同源的iframe应用样式,通常需要iframe内容的提供者合作,比如通过接收URL参数、提供API接口或者支持某种约定好的通信机制(如window.postMessage)来实现样式的应用。

2024年6月29日 12:07 回复

**编辑:**除非设置了适当的CORS 标头,否则这不适用于跨域。

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

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

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

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

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

shell
var cssLink = document.createElement("link"); cssLink.href = "style.css"; cssLink.rel = "stylesheet"; cssLink.type = "text/css"; frames['iframe1'].document.head.appendChild(cssLink);
2024年6月29日 12:07 回复

我在使用Google 日历时遇到了这个问题。我想将其设计为深色背景并更改字体。

幸运的是,嵌入代码中的 URL 对直接访问没有限制,因此通过使用 PHP 函数file_get_contents可以从页面获取全部内容。可以调用位于您服务器上的 php 文件,例如,而不是调用 Google URL。google.php,其中将包含经过修改的原始内容:

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

将路径添加到样式表:

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

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

指定原url的基础url,以防css和js相对调用:

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

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

shell
<?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嵌入代码更改为:

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

祝你好运!

2024年6月29日 12:07 回复

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

shell
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);

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

2024年6月29日 12:07 回复

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

shell
$head.append($("<link/>", { rel: "stylesheet", href: url, type: "text/css" }));
2024年6月29日 12:07 回复

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

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

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

2024年6月29日 12:07 回复

你的答案