【发布时间】:2010-10-09 16:25:48
【问题描述】:
是否可以仅使用 CSS 更改位于页面 iframe 内的 div 的样式?
【问题讨论】:
是否可以仅使用 CSS 更改位于页面 iframe 内的 div 的样式?
【问题讨论】:
你需要 JavaScript。这与在父页面中执行此操作相同,只是您必须在 JavaScript 命令前加上 iframe 的名称。
请记住,同源策略适用,因此您只能对来自您自己的服务器的 iframe 元素执行此操作。
我使用Prototype 框架使其更容易:
frame1.$('mydiv').style.border = '1px solid #000000'
或
frame1.$('mydiv').addClassName('withborder')
【讨论】:
总之没有。
您不能将 CSS 应用于加载到 iframe 中的 HTML,除非由于跨域资源限制,您可以控制加载到 iframe 中的页面。
【讨论】:
是的。看看这个其他线程的详细信息: How to apply CSS to iframe?
var cssLink = document.createElement("link");
cssLink.href = "style.css";
cssLink.rel = "stylesheet";
cssLink.type = "text/css";
frames['frame1'].document.body.appendChild(cssLink);
【讨论】:
frame1 是 iframe 名称,而不是 ID
您可以先检索iframe 的内容,然后照常使用jQuery 选择器。
$("#iframe-id").contents().find("img").attr("style","width:100%;height:100%")
$("#iframe-id").contents().find("img").addClass("fancy-zoom")
$("#iframe-id").contents().find("img").onclick(function(){ zoomit($(this)); });
祝你好运!
【讨论】:
快速回答是:不,抱歉。
仅使用 CSS 是不可能的。您基本上需要控制 iframe 内容才能对其进行样式设置。有一些方法使用 javascript 或您选择的网络语言(我已经读过一点,但我自己不熟悉)来动态插入一些需要的样式,但是您需要直接控制 iframe 内容,这听起来就像你没有一样。
【讨论】:
使用 Jquery 并等待源代码加载完毕, 这就是我实现的方式(使用角度间隔,您可以使用javascript setInterval 方法):
var addCssToIframe = function() {
if ($('#myIframe').contents().find("head") != undefined) {
$('#myIframe')
.contents()
.find("head")
.append(
'<link rel="stylesheet" href="app/css/iframe.css" type="text/css" />');
$interval.cancel(addCssInterval);
}
};
var addCssInterval = $interval(addCssToIframe, 500, 0, false);
【讨论】:
显然可以通过 jQuery 来完成:
$('iframe').load( function() {
$('iframe').contents().find("head")
.append($("<style type='text/css'> .my-class{display:none;} </style>"));
});
【讨论】:
Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
结合不同的解决方案,这对我有用。
$(document).ready(function () {
$('iframe').on('load', function() {
$("iframe").contents().find("#back-link").css("display", "none");
});
});
【讨论】:
可能不是你想的那样。 iframe 也必须在 css 文件中 <link> 。如果它位于不同的域中,即使使用 javascript 也无法做到这一点。
【讨论】:
<iframe src="/source" link=css-stylesheet:"/css.css">这样的东西吗?
<link> 标记。如果框架的源位于同一个父域中,那么您可以使用 JavaScript 注入样式标记(或内联样式)。
一种 hack-ish 的做事方式就像 Eugene 所说的那样。我最终遵循他的代码并链接到我的页面的自定义 Css。对我来说,问题是,有了 twitter 时间线,你必须避开 twitter 来稍微覆盖他们的代码。现在我们有了一个滚动的时间线,其中包含我们的 CSS,即 I.E。更大的字体,适当的行高,并在超出其限制的高度隐藏滚动条。
var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary
【讨论】:
从客户端不可能。由于 iframe 不是您的域的一部分,因此将引发 javascript 错误“错误:访问属性“文档”的权限被拒绝”。 唯一的解决方案是从服务器端代码中获取页面并更改所需的 CSS。
【讨论】:
只需添加这个,一切正常:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
【讨论】:
是的,虽然很麻烦,但这是可能的。您需要将页面的 HTML 打印/回显到页面的正文中,然后应用 CSS 规则更改功能。使用上面给出的相同示例,您实际上将使用一种解析方法来查找页面中的 div,然后对其应用 CSS,然后将其重新打印/回显给最终用户。我不需要这个,所以我不想将该函数编码到另一个网页的 CSS 中的每个项目中,只是为了 aphtply。
参考资料:
【讨论】: