iframeのコンテンツをスケーリングするにはどうすればよいですか?


237

Webサイトのページでiframeのコンテンツ(私の例ではHTMLページであり、ポップアップではない)をスケーリングするにはどうすればよいですか?

たとえば、iframeに表示されるコンテンツを元のサイズの80%で表示したいとします。


14
質問のスクレイピング–良い実践ですか?そうは思いません。
Konrad Rudolph、

9
典型的な使用例:オンラインwysiwygエディターでのページ/サイトのプレビュー
frenchone

回答:


224

CSSを次のように変更した場合、KipのソリューションはOperaおよびSafariで機能するはずです。

<style>
    #wrap { width: 600px; height: 390px; padding: 0; overflow: hidden; }
    #frame { width: 800px; height: 520px; border: 1px solid black; }
    #frame {
        -ms-zoom: 0.75;
        -moz-transform: scale(0.75);
        -moz-transform-origin: 0 0;
        -o-transform: scale(0.75);
        -o-transform-origin: 0 0;
        -webkit-transform: scale(0.75);
        -webkit-transform-origin: 0 0;
    }
</style>

スクロールバーを防ぐために、#frameで非表示にするオーバーフローを指定することもできます。


@JonathanM-cfmeta.stackexchange.com/questions/75043/ 、ここで何か問題がありましたか?
lxs 2012年

@lxs、全然。私はそれを愛し、それに+1を与えました。よくやった。
Jonathan M

7
クロムでは、ズームとWebkit変換の両方が適用され、スケールが2回適用されることに気付きました。
dennisjtaylor 2013年

1
@dennisjtaylorが言うように、クロムはスケールを2回適用しているようです
Horse

3
最近のすべてのブラウザーはかなり前から変換をサポートしているので、(少なくとも代替手段として)接頭部なしのバージョンを使用することを検討します。
wortwart 2016年

55

IEとFirefoxで機能するソリューションを見つけました(少なくとも現在のバージョンでは)。Safari / Chromeでは、iframeは元のサイズの75%にサイズ変更されますが、iframe内のコンテンツはまったくスケーリングされません。Operaでは、これは機能していないようです。これは少し難解に感じられるので、もっと良い方法があれば提案を歓迎します。

<style>
#wrap { width: 600px; height: 390px; padding: 0; overflow: hidden; }
#frame { width: 800px; height: 520px; border: 1px solid black; }
#frame { zoom: 0.75; -moz-transform: scale(0.75); -moz-transform-origin: 0 0; }
</style>

...

<p>Some text before the frame</p>
<div id="wrap">
<iframe id="frame" src="test2.html"></iframe>
</div>
<p>Some text after the frame</p>
</body>

注:私はwrapFirefox の要素を使用する必要がありました。何らかの理由で、Firefoxでオブジェクトを75%縮小しても、レイアウト上の理由から画像の元のサイズが使用されます。(上記のサンプルコードからdivを削除してみてください。意味がわかります。)

私はこの質問からこれのいくつかを見つけました。


31

IE8、9、および10で動作させるために何時間もこれに苦労した後、これが私にとってうまくいきました。

この簡略化されたCSSは、2014年1月7日の時点で、FF 26、Chrome 32、Opera 18、およびIE9 -11で機能します。

.wrap
{
    width: 320px;
    height: 192px;
    padding: 0;
    overflow: hidden;
}

.frame
{
    width: 1280px;
    height: 786px;
    border: 0;

    -ms-transform: scale(0.25);
    -moz-transform: scale(0.25);
    -o-transform: scale(0.25);
    -webkit-transform: scale(0.25);
    transform: scale(0.25);

    -ms-transform-origin: 0 0;
    -moz-transform-origin: 0 0;
    -o-transform-origin: 0 0;
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0;
}

IE8の場合、iframeに一致するように幅/高さを設定し、-wrap-コンテナーdivに-ms-zoomを追加します。

.wrap
{
    width: 1280px; /* same size as frame */
    height: 768px;
    -ms-zoom: 0.25; /* for IE 8 ONLY */
}

適切なCSSを条件付きで含めるには、ブラウザーのスニッフィングにお気に入りの方法を使用してくださいいくつかのアイデア。

IE8まで-ms-zoomが存在しなかったため、IE7は失われた原因でした。

テストした実際のHTMLは次のとおりです。

<div class="wrap">
   <iframe class="frame" src="http://time.is"></iframe>
</div>
<div class="wrap">
    <iframe class="frame" src="http://apple.com"></iframe>
</div>

http://jsfiddle.net/esassaman/PnWFY/


17

私はテストしたばかりで、他のソリューションはどれも機能しませんでした。私はこれを試しただけで、FirefoxとChromeで完全に機能しました。

<div class='wrap'>
    <iframe ...></iframe>
</div>

そしてCSS:

.wrap {
    width: 640px;
    height: 480px;
    overflow: hidden;
}

iframe {
    width: 76.92% !important;
    height: 76.92% !important;
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0;
}

これにより、すべてのコンテンツが30%拡大されます。もちろん、幅/高さの割合はそれに応じて調整する必要があります(1 / scale_factor)。


2
またoverflow: hidden;.wrap要素に追加する必要があります。iframe { width: 200%; height: 200%; transform: scale(0.5); }iframe を使用すると、オーバーフローが発生します。
ozgrozer

これは最先端のアプローチです。ありがとう!
fuggi

10

フォローLXSの答え:私は両方持つ問題に気づいたzoom--webkit-transform同時にタグはダブルズームソート効果の操作を実行してクロム(バージョン15.0.874.15)を混乱させているようだが。(IEのみを対象とする)に置き換えることzoomで問題を回避し、-ms-zoomChromeに--webkit-transformタグのみを使用させることで問題を解決できました。


9

追加のタグでiframeをラップする必要はありません。iframeの幅と高さを、iframeを縮小するのと同じ量だけ増やしてください。

たとえば、iframeコンテンツを80%にスケーリングするには、次のようにします。

#frame { /* Example size! */
    height: 400px; /* original height */
    width: 100%; /* original width */
}
#frame {
    height: 500px; /* new height (400 * (1/0.8) ) */
    width: 125%; /* new width (100 * (1/0.8) )*/

    transform: scale(0.8); 
    transform-origin: 0 0;
}

基本的に、同じサイズのiframeを取得するには、寸法をスケーリングする必要があります。


7

html {zoom:0.4;}?-)


3
80%の場合は0.8になりますが、これは独自のMicrosoftismであるため、おそらく適切ではありません。また、フレームに読み込まれたドキュメントを編集できる場合にのみ機能します。
Quentin

7

上で与えられたものの多くを使って、私が思いついたものを共有したいと思いました。私はChromeをチェックしていませんが、私の知る限り、IE、Firefox、Safariで動作します。

この例の特定のオフセットとズーム係数は、Facebookタブのiframe(幅810px)で2つのWebサイトを縮小および中央揃えするために機能しました。

使用された2つのサイトは、ワードプレスサイトとningネットワークでした。私はhtmlがあまり得意ではないので、これはおそらくもっとうまくできたかもしれませんが、結果は良いようです。

<style>
    #wrap { width: 1620px; height: 3500px; padding: 0; position:relative; left:-100px; top:0px; overflow: hidden; }
    #frame { width: 1620px; height: 3500px; position:relative; left:-65px; top:0px; }
    #frame { -ms-zoom: 0.7; -moz-transform: scale(0.7); -moz-transform-origin: 0px 0; -o-transform: scale(0.7); -o-transform-origin: 0 0; -webkit-transform: scale(0.7); -webkit-transform-origin: 0 0; }
</style>
<div id="wrap">
    <iframe id="frame" src="http://www.example.com"></iframe>
</div>

5

ウィンドウのサイズが変更されたときにiframeとその内容をスケーリングする場合は、ウィンドウのサイズ変更イベントとiframes onloadイベントに以下を設定できます。

function()
{
    var _wrapWidth=$('#wrap').width();
    var _frameWidth=$($('#frame')[0].contentDocument).width();

    if(!this.contentLoaded)
      this.initialWidth=_frameWidth;
    this.contentLoaded=true;
    var frame=$('#frame')[0];

    var percent=_wrapWidth/this.initialWidth;

    frame.style.width=100.0/percent+"%";
    frame.style.height=100.0/percent+"%";

    frame.style.zoom=percent;
    frame.style.webkitTransform='scale('+percent+')';
    frame.style.webkitTransformOrigin='top left';
    frame.style.MozTransform='scale('+percent+')';
    frame.style.MozTransformOrigin='top left';
    frame.style.oTransform='scale('+percent+')';
    frame.style.oTransformOrigin='top left';
  };

これにより、iframeとそのコンテンツがラップdivの100%の幅(または任意のパーセント)にスケーリングされます。追加のボーナスとして、フレームのcssをハードコードされた値に設定する必要はありません。これらはすべて動的に設定されるため、wrap divをどのように表示するかを気にする必要があるだけです。

私はこれをテストしましたが、Chrome、IE11、Firefoxで動作します。


4

これは、JavaScriptで(document.body.clientWidthなどを使用して)必要な高さと幅を計算し、次のようにiframeをHTMLに挿入することで実行できると思います。

var element = document.getElementById( "myid");
element.innerHTML + = "<iframe src = 'http://www.google.com' height = '200' width = '" + document.body.clientWidth * 0.8 + "' />";

私はIE6でこれをテストしませんでしたが、良いもので動作するようです:)


私の無知を失礼しますが、ソースページ自体を縮小表示するのではなく、iframeをソースページの80%にしませんか?
Phill Healey、2014年

3

これをIEで-ms-zoom機能させるのに問題がある場合は、以下に示すように使用し#wrapiframeID ではなくdivでズーム機能を使用すると便利です。私の経験では、zoomiframe divのスケーリングを試みる関数#frameでは、iframeサイズをスケーリングし、その中のコンテンツはスケーリングしません(これが目的です)。

このように見えます。IE8、Chrome、FFで動作します。

#wrap {
  overflow: hidden;
  position: relative;
  width:800px;
  height:850px;
  -ms-zoom: 0.75;
}

使用zoomIE8標準モード、使用中の-ms-zoom癖モードインチ
Jonathon Hill

3

これは幅が890pxのページでの私の解決策でした

#frame { 
overflow: hidden;
position: relative;
width:1044px;
height:1600px;
-ms-zoom: 0.85;
-moz-transform: scale(0.85);
-moz-transform-origin: 0px 0;
-o-transform: scale(0.85);
-o-transform-origin: 0 0;
-webkit-transform: scale(0.85);
-webkit-transform-origin: 0 0; 

}

2

#wrap #frameソリューションは、#wrapの数値が#frameにスケールファクターを掛けた値である限り、正常に機能します。縮小されたフレームのその部分のみが表示されます。あなたはそれをここで見ることができますウェブサイトを縮小してそれをフォームのような面白いものに入れます(ウッドマークjQueryプラグインで):

http://www.genautica.com/sandbox/woodmark-index.html


2

したがって、おそらく最善の解決策ではありませんが、問題なく動作するようです。

<IFRAME ID=myframe SRC=.... ></IFRAME>

<SCRIPT>
    window.onload = function(){document.getElementById('myframe').contentWindow.document.body.style = 'zoom:50%;';};
</SCRIPT>

明らかに、親を修正しようとせず、ちょっとしたJavaScriptを使用して、子の本文に "zoom:50%"スタイルを追加するだけです。

「HTML」要素のスタイルを設定できたかもしれませんが、それは試みませんでした。


1
これを行わないでください。developer.mozilla.org/en-US/docs/Web/CSS/zoomから:「この機能は非標準であり、標準化されていません。Webに面している本番サイトでは使用しないでください。すべてのユーザー。実装間で大きな非互換性が存在する可能性があり、動作は将来変更される可能性があります。」
hackel

+1これ(iframe自体ではなく、iframeのコンテンツを変更すること)は、より良い考えのようです。ページを縮小してそのページのプレビューとして表示する方法が必要でしたが、このアプローチで問題が解決しました。
akinuri

@akinuriはい、それはまさに私がそれを使用したものです。私はいくつかの解決策を試しましたが、これが最も簡単に思えました。私はただiframeを繰り返し処理して縮小し、サムネイルのページを取得しました。子ページを変更する必要はありません。
グラハム

1

HTMLがCSSでスタイル設定されている場合は、さまざまなサイズのさまざまなスタイルシートをリンクできます。


0

HTMLにそのような機能があるとは思いません。トリックを実行すると私が想像できるのは、サーバー側の処理を実行することだけです。おそらく、提供したいWebページのイメージスナップショットを取得し、サーバーでスケーリングして、クライアントに提供することができます。ただし、これは非インタラクティブページになります。(おそらくイメージマップにリンクがあるかもしれませんが、まだです。)

別のアイデアは、HTMLを変更するサーバー側コンポーネントを持つことです。Firefox 2.0のズーム機能に似ています。もちろんこれは完璧なズームではありませんが、何もしないよりはましです。

それ以外はアイデアがありません。


0

言ったように、あなたがそれを行うことができるとは思えません。
たぶん、スタイルを設定することで、少なくともテキスト自体をスケーリングできますfont-size: 80%;
テストされていません。動作するかどうかは不明です。ボックスや画像のサイズは変更されません。

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