使用CSS影响iframe中的div样式


Answers:


117

您需要JavaScript。除了必须在JavaScript命令前加上iframe名称之外,这与在父页面中执行此操作相同。

请记住,同样的原始政策适用,因此您只能对来自您自己的服务器的iframe元素执行此操作。

我使用原型框架使其变得更容易:

frame1.$('mydiv').style.border = '1px solid #000000'

要么

frame1.$('mydiv').addClassName('withborder')

2
看到我的这个问题,它类似于stackoverflow.com/questions/1962707/…,但是如果框架来自其他服务器,我们就不能更改样式吗?
Jitendra Vyas

16
那是正确的。Iframe内容受同域政策的约束。如果来自您的域,则可以对其进行控制;否则,您将被锁定。这样可以防止各种基于Iframe的网页劫持。
Diodeus-James MacFarlane

2
不完全是“仅CSS”解决方案,但对我来说已经足够了。+1
Nicu Surdu

2
这不是CSS。
stramin

103

简而言之,没有。

您不能将CSS应用于iframe中加载的HTML,除非由于跨域资源限制而可以控制iframe中加载的页面。


55
这是真的,但并不能真正帮助人们举例说明
SimonDragsbæk2013年

这只是在2018年出现吗?我记得我曾经从外部配置过iframe的样式。我尝试应用CSS来的iframe,提炼的脚本,但它不是还是老样子work.l
VO胡志明

46

是。看一下其他线程以了解详细信息: 如何将CSS应用于iframe?

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

4
frame1是iframe的ID吗?
托尼·米歇尔·考贝特

5
是的,frame1是iframe的ID。
尤金·罗森菲尔德

3
这不是CSS。
stramin

4
如果我们要在iframe中加载其他域,则无法执行此操作。
Sunith Saga

frame1是iframe名称,而不是ID
joseantgv,

14

您可以先检索内容,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)); });

祝好运!


11
不起作用:未捕获的DOMException:无法从“ HTMLIFrameElement”读取“ contentDocument”属性:阻止了起源为“ HOST ” 的框架访问跨域框架。
tubbo '17

@tubbo,就您而言,您不能嵌入未经XSS阻止的未授权站点。这仅适用于那些正在寻找自己的问题的人,而不是黑客:p
Riyaz Hameed

10

快速的答案是:不,对不起。

仅使用CSS是不可能的。基本上,您需要控制iframe内容才能设置其样式。有一些方法可以使用javascript或您选择的网络语言(我已经读过一些,但是对我不太熟悉)来动态插入一些所需的样式,但是听起来您需要直接控制iframe内容像你没有。


8

使用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);

1
为什么不使用iframe加载事件?
ProllyGeek 2015年

3

可能不是您的思维方式。iframe也必须<link>在css文件中。而且,即使它位于其他域中,也无法使用javascript来做到这一点。


您能否举一个例子说明如何做到这一点?你是说类似的东西<iframe src="/source" link=css-stylesheet:"/css.css">吗?
蚂蚁

3

显然可以通过jQuery完成:

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

https://stackoverflow.com/a/13959836/1625795


3
由于Chrome浏览器中的原始政策相同,您不能再使用此功能。错误消息:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna

@adamj,我们可以更改iframe元素的覆盖样式表吗?如果是,请添加脚本。
超级模特

2

尤金(Eugene)说过,这是一种有点破烂的做事方式。我最终遵循了他的代码,并链接到该页面的自定义Css。对我来说,问题在于,使用Twitter时间轴,您必须绕过Twitter的某些步骤才能覆盖其代码。现在,我们有了一个滚动的时间轴,其中包括CSS,IE较大的字体,适当的行高以及隐藏的滚动条,以使高度大于其限制。

var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary

1

只需添加它,一切都很好:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

不确定这是否是给定问题的正确答案,但这是将google窗体的大小调整为设备宽度的绝佳解决方案,非常感谢!
shiftyscales

0

是的,虽然很麻烦,但还是有可能的。您需要将页面的HTML打印/回显到页面的主体中,然后应用CSS规则更改功能。使用上面给出的相同示例,您实际上将使用一种解析方法来查找页面中的div,然后将CSS应用于该div,然后将其重新打印/回显给最终用户。我不需要这个,所以我不想为了另一个功能而将该功能编码到另一个网页的CSS中的每个项目中。

参考文献:


该问题专门询问“仅使用CSS”。考虑到这一点,您的答案是错误的。
Serj Sagan

这不是CSS。
stramin

0

结合不同的解决方案,这对我有用。

$(document).ready(function () {
    $('iframe').on('load', function() {
        $("iframe").contents().find("#back-link").css("display", "none");
    }); 
});

-1

从客户端不可能。由于Iframe不属于您的域,因此将引发JavaScript错误“错误:拒绝访问属性“文档”的权限”。唯一的解决方案是从服务器端代码获取页面并更改所需的CSS。


2
这个答案在内容上是正确的,但与JavaScript有关,而问题与CSS有关。答案可能是您需要使用JavaScript,但您不必这么说。答案还假设iFrame中的内容来自其他域,但情况并非总是如此。最后,确切的消息会因浏览器而异。
pwdst
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.