CSSを使用してiframe内のdivスタイルに影響を与える


回答:


117

JavaScriptが必要です。親ページで行う場合と同じですが、JavaScriptコマンドの前にiframeの名前を付ける必要があります。

同じ起点ポリシーが適用されるので、自分のサーバーからのiframe要素に対してのみこれを実行できることに注意してください。

Prototypeフレームワークを使用して簡単にしています。

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 2013年

2
これはCSSではありません。
ストラミン

103

つまり、いいえ。

クロスドメインリソースの制限によりiframeに読み込まれたページを制御できない限り、iframeに読み込まれたHTMLにCSSを適用することはできません。


55
これは本当ですが、方法の例を示すのに実際には役立ちません
SimonDragsbæk'27

これは2018年に登場するのですか?iframeのスタイルを外部から設定するのに使用したことを覚えています。私は、スクリプトによってレンダリングことはiframeにCSSを適用しようとしましたが、それはwork.lないSTIL
Võミン

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ですか?
Toni Michel Caubet

5
はい、frame1はiframeのIDです。
Eugene Rosenfeld

3
これはCSSではありません。
ストラミン

4
iframeに別のドメインを読み込んでいる場合、これはできません。
Sunith Saga

frame1IDではなくiframe名です
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、あなたの場合、XSSからブロックされた未承認のサイトを埋め込むことはできません。P:これは自分の問題ではなく、ハッカーをお探しの方のためだけである
Riyazハミード

10

簡単な答えは次のとおりです。いいえ、申し訳ありません。

CSSだけでは不可能です。スタイルを設定するには、基本的にiframeコンテンツを制御する必要があります。いくつかの必要なスタイルを動的に挿入するために、JavaScriptまたは選択したWeb言語(私は少し読みましたが、自分には慣れていません)を使用する方法がありますが、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">ですか?
2010年

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

一種のハックっぽいやり方はユージーンが言ったようなものです。私は彼のコードを追跡し、ページのカスタムCssにリンクしました。私にとっての問題は、Twitterのタイムラインでは、コードをsmidgenにオーバーライドするために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を適用し、それをエンドユーザーに再印刷/エコーする解析メソッドを使用します。私はこれを必要としないので、別のWebページのCSSのすべての項目にその機能をコード化して、単純にしたくありません。

参照:


質問は特に「CSSのみを使用する」ことを尋ねます。それを念頭に置いて、あなたの答えは間違っています。
Serj Sagan

これはCSSではありません。
ストラミン

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 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.