「display:none」は画像の読み込みを妨げますか?


336

すべてのレスポンシブなWebサイト開発チュートリアルでは、display:noneCSSプロパティを使用してコンテンツをモバイルブラウザーにロードしないようにして、Webサイトのロードを高速化することを推奨しています。本当ですか?ないdisplay:none画像を読み込まないか、それはまだモバイルブラウザ上でコンテンツをロードしていますか?モバイルブラウザーに不要なコンテンツを読み込まないようにする方法はありますか?


6
display:noneでダウンロードを防ぐいくつかの方法があるようですが、バニラの方法ではありません:timkadlec.com/2012/04/media-query-asset-downloading-results
mrwweb

1
W3Cは積極的にテストしています:w3.org/2009/03/image-display-none/test.php
Pino

回答:


191

ブラウザはよりスマートになっています。今日、ブラウザは(バージョンによっては)、画像が役に立たないと判断できる場合、画像の読み込みをスキップすることがあります。

画像にはdisplay:noneスタイルがありますが、そのサイズはスクリプトで読み取ることができます。親が非表示の場合、Chrome v68.0は画像をロードしません。

あなたはそれをそこでチェックするかもしれません:http : //jsfiddle.net/tnk3j08s/

また、ブラウザの開発者ツールの「ネットワーク」タブを見て確認することもできます。

ブラウザーが小さなCPUコンピューター上にある場合、画像をレンダリングする(およびページをレイアウトする)必要がないため、レンダリング操作全体が高速になりますが、これは今日本当に意味のあることではないことに注意してください。

画像が読み込まれないようにする場合は、IMG要素をドキュメントに追加しないでください(またはIMG src属性を"data:"またはに設定します"about:blank")。


50
空の画像srcは危険です。サーバーに追加のリクエストを送信します。このトピックについての良い読み物nczonline.net/blog/2009/11/30/…–
Srinivas

2
@SrinivasYedhuriはい、そうです。より良いソリューションで編集しました。
DenysSéguret2013

8
この答えは部分的に正しいだけです。これをGoogle Chrome(v35)でテストしたところ、displayがnoneに設定されている画像がダウンロードされないことが確認できました。これはおそらく、開発者にとってレスポンシブデザインを容易にするためです。
Shawn Whinnery 2014年

15
この答えは正しくありません。FFの最新バージョンを含むさまざまなブラウザーがこの状況を異なる方法で処理する方法の更新された結果については、以下を参照してください
DMTintner

2
今日(2017年10月)でも、最も一般的なブラウザChromeは、すべての「img」要素のソースを非表示にしてもダウンロードします。非表示の背景画像はダウンロードされません。
TKoL 2017年

130

CSSで画像をdivの背景画像にした場合、そのdivが「display:none」に設定されていると、画像は読み込まれません。CSSが無効になっている場合でも、CSSは無効になっているため、読み込まれません。


17
これは、私の意見では、実際にレスポンシブデザインに非常に役立つヒントです。
ryandlf 2013

3
これはFF、Chrome、Safari、Opera、Maxthonで動作します。IEを試したことはありません。
ブレント

13
正面から新しい!<div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>。結果:Firefox 29およびOpera 12がロードされません。IE 11とChrome 34の読み込み。
CoolCmd 2014年

3
@CoolCmdレスポンシブデザインの場合、これは実行可能なオプションです。これは、CSSメディアクエリで、画像をロードしたくない場合に設定background-imageできるnoneためです。JSを使用しないこのユースケースのより良い代替案を見つけていません。
Qtax 2015年

1
最小幅のメディアクエリを持つ画像スライダー(背景画像を使用)をテストしました。その幅より下では、親divにCSSがありましたdisplay: none;。その幅以下のウィンドウでのネットワークテスト:Chrome 35、IE11、およびEdgeは画像をロードしませんでした
binaryfunt

57

答えは単純な「はい」または「いいえ」ほど簡単ではありません。最近行ったテストの結果を確認してください。

  • Chromeの場合:すべての8つのscreenshot- *画像がロードされました(img 1)
  • Firefoxの場合:現在表示されている、読み込まれた1つのscreenshot- *画像のみ(img 2)

それでさらに掘り下げた後、私はこれを見つけまし。これは、各ブラウザがcssディスプレイに基づいてimgアセットのロードを処理する方法を説明します。

ブログ投稿からの抜粋:

  • ChromeとSafari(WebKit):
    WebKitは、一致しないメディアクエリを通じてバックグラウンドが適用される場合を除いて、毎回ファイルをダウンロードします。
  • Firefox:
    Firefoxは、スタイルが非表示の場合、背景画像で呼び出される画像をダウンロードしませんが、imgタグからアセットをダウンロードします。
  • Opera:
    Firefoxと同様に、Operaは不要な背景画像をロードしません。
  • Internet Explorer:
    IEは、WebKitのように、表示されていても背景画像をダウンロードします。IE6で奇妙なことが表示されます:背景画像とディスプレイの要素:インラインが設定されていないものはダウンロードされません...しかし、これらのスタイルがインラインで適用されていない場合は、そうなります。

Chrome-すべて8のスクリーンショット-*画像が読み込まれました

Firefox-現在表示されている1つのscreenshot- *画像のみが読み込まれました


1
それらの結果が標準の一部でない限り、それらは全く無意味です。Chromeはレンダリングエンジンを変更し、オペラも変更し、IEは他のものに置き換えられます。このようなフリンジ機能の実装を信頼して、長期間にわたって安定させることはできません。ソリューションは、アセットをレイジーにロードする必要がある場合にブラウザーにヒントを与える方法になります。
Mark Kaplun、2015年

5
@MarkKaplun私はこれらのテスト結果が常にすべてのブラウザーで常に発生すると予想できることを正確に示すことを示唆していませんでした。私は、答えが「はいまたはいいえほど単純ではない」ことを示すことだけを意図しました。各ブラウザーは現在、これを異なる方法で実装しており、おそらくしばらくはこの方法が続くでしょう
DMTintner '30

@DMTintner正確です。そして今日の時点で、私はiOSのサファリが「display:none」であったdivの背景画像をロードしたことを確認できます。最善の方法は、何も想定しないことです。イメージをロードしたくない場合は、htmlタグで参照しないでください
bhu Boue vidya '17

34

HTML5 <picture>タグは、画面の幅に応じて適切な画像ソースを解決するのに役立ちます

どうやら、ブラウザの動作は過去5年間あまり変化しておらず、display: noneプロパティが設定されていても、多くの場合、非表示の画像をダウンロードするでしょう。

ありますにもかかわらず、メディアクエリの回避策画像をCSSで背景としたとき、それが唯一の役に立つかもしれません。

問題に対するJSソリューション(レイジーロードピクチャフィルなど)があると思っていましたが、HTML5の箱から出してすぐに使える純粋なHTMLソリューションがあるようです。

そしてそれが<picture>タグです。

ここではどのようだMDNはそれを説明します。

HTMLの<picture>要素は複数指定するために使用される容器である<source>特定するための要素<img>、それに含まれているが。ブラウザは、ページの現在のレイアウト(画像が表示されるボックスの制約)とそれが表示されるデバイス(通常またはhiDPIデバイスなど)に応じて、最適なソースを選択します。

そして、それを使用する方法は次のとおりです。

<picture>
 <source srcset="mdn-logo-wide.png" media="(min-width: 600px)">
 <img src="mdn-logo-narrow.png" alt="MDN">
</picture>

背後にあるロジック

ブラウザは、どのimgメディアルールも適用されない場合にのみ、タグのソースをロードします。<picture>要素がブラウザでサポートされていない場合、imgタグの表示に再びフォールバックします。

通常、最小の画像をのソースとして配置する<img>ため、大きな画面では重い画像をロードしません。逆に、メディアルールが適用される場合、のソースは<img>ダウンロードされず、代わりに対応する<source>タグのURLのコンテンツがダウンロードされます。

ここでの唯一の落とし穴は、要素がブラウザでサポートされていない場合、小さな画像しか読み込まないことです。一方、2017年には、モバイルファーストのアプローチで考え、コーディングする必要があります。

そして、誰かがあまりにも終了する前に、現在サポートされているブラウザは<picture>次のとおりです。

デスクトップブラウザ

デスクトップブラウザーのサポート

モバイルブラウザ

モバイルブラウザーのサポート

「使用できますか」で確認できるブラウザーサポートの詳細。

良い点は、html5pleaseの文はフォールバックで使用することです。そして私は個人的に彼らの助言を受けるつもりです。

タグの詳細については、W3Cの仕様をご覧ください。免責事項があります。これは重要なことです。

picture要素は、同様の見通しから幾分異なるvideoaudio要素。それらのすべてにsource要素が含まれsrcていますが、要素がpicture要素内にネストされている場合、ソース要素の属性は意味がなく、リソース選択アルゴリズムが異なります。また、picture要素自体には何も表示されません。img複数のURLから選択できるようにする、含まれている要素のコンテキストを提供するだけです。

つまり、画像にコンテキストを提供することで、画像の読み込み時のパフォーマンスを向上させるだけであるということです。

また、小さなデバイスで画像を非表示にするために、CSSマジックを使用することもできます。

<style>
  picture { display: none; }

  @media (min-width: 600px) {
    picture {
      display: block;
    }
  }
</style>

<picture>
 <source srcset="the-real-image-source" media="(min-width: 600px)">
 <img src="a-1x1-pixel-image-that-will-be-hidden-in-the-css" alt="MDN">
</picture>

したがって、ブラウザは実際の画像を表示1x1ピクセル画像のみをダウンロードします(複数回使用する場合はキャッシュできます)。ただし、<picture>ブラウザでタグがサポートされていない場合、デスクトップ画面でも実際の画像表示されないことに注意してください(そのため、必ずポリフィルのバックアップが必要になります)。


4
私はあなたと同様のルートを取ったが、代わりにデータ-IMGを使用:)ここで私はそれを書いたポストだswimburger.net/blog/web/...
Swimburger

10

はい、わずかに速くレンダリングされます。これは、画像をレンダリングする必要がなく、画面上で並べ替える要素が1つ少ないためです。

ロードしたくない場合は、DIVを空のままにして、後で<img>タグを含むhtmlをロードできるようにします。

前に述べたように、firebugまたはWiresharkを使用してみてください。ファイルdisplay:noneが存在していても、ファイルが転送されることがわかります。

Operaは、ディスプレイがnoneに設定されている場合にイメージをロードしない唯一のブラウザーです。Operaはwebkitに移動し、ディスプレイがnoneに設定されている場合でもすべての画像をレンダリングします。

これを証明するテストページは次のとおりです。

http://www.quirksmode.org/css/displayimg.html


9

** 2019回答 **

通常の状況でdisplay:noneは、イメージのダウンロードは妨げられません

/*will be downloaded*/

#element1 {
    display: none;
    background-image: url('https://picsum.photos/id/237/100');
}

しかし、祖先要素が持っているdisplay:none場合、子孫の画像はダウンロードされません


/* Markup */

<div id="father">
    <div id="son"></div>
</div>


/* Styles */

#father {
    display: none;
}

/* #son will not be downloaded because the #father div has display:none; */

#son {
    background-image: url('https://picsum.photos/id/234/500');
}

イメージのダウンロードを妨げるその他の状況:

1-ターゲット要素は存在しません

/* never will be downloaded because the target element doesn't exist */

#element-dont-exist {
    background-image: url('https://picsum.photos/id/240/400');
}

2-異なる画像をロードする2つの同等のクラス

/* The first image of #element2 will never be downloaded because the other #element2 class */

#element2 {
    background-image: url('https://picsum.photos/id/238/200');
}

/* The second image of #element2 will be downloaded */

#element2 {
    background-image: url('https://picsum.photos/id/239/300');
}

あなたはここであなた自身のために見ることができます:https : //codepen.io/juanmamenendez15/pen/dLQPmX


8

互換モード:画像と表示:なし

画像がdisplay: noneの要素内にあるか要素内にある display:none場合、ブラウザは、display が別の値に設定されるまで画像をダウンロードしないことを選択できます。

唯一のオペラは、スイッチ画像ダウンロードdisplayにしますblock。他のすべてのブラウザはそれをすぐにダウンロードします。


8

divが「display:none」に設定されている場合、div 要素のbackground-image が読み込まれます。

とにかく、同じdivに親があり、その親が「display:none」に設定されている場合、子要素のbackground-imageは読み込まれません。:)

ブートストラップを使用した例:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


<div class="col-xs-12 visible-lg">
	<div style="background-image: url('http://via.placeholder.com/300x300'); background-repeat:no-repeat; height: 300px;">lg</div>
</div>
<div class="col-xs-12 visible-md">
	<div style="background-image: url('http://via.placeholder.com/200x200'); background-repeat:no-repeat; height: 200px;">md</div>
</div>
<div class="col-xs-12 visible-sm">
	<div style="background-image: url('http://via.placeholder.com/100x100'); background-repeat:no-repeat; height: 100px">sm</div>
</div>
<div class="col-xs-12 visible-xs">
	<div style="background-image: url('http://via.placeholder.com/50x50'); background-repeat:no-repeat; height: 50px">xs</div>
</div>



4

CSSで画像をdivの背景画像にした場合、そのdivが「display:none」に設定されていると、画像は読み込まれません。

ブレントのソリューションを拡張するだけです。

純粋なCSSソリューションに対して次のことを行うことができます。これにより、imgボックスがレスポンシブデザイン設定のimgボックスのように実際に動作するようになります(これが透明なpngの目的です)。これは、デザインでレスポンシブ動的に使用する場合に特に役立ちます画像のサイズ変更。

<img style="display: none; height: auto; width:100%; background-image: 
url('img/1078x501_1.jpg'); background-size: cover;" class="center-block 
visible-lg-block" src="img/400x186_trans.png" alt="pic 1 mofo">

画像は、visible-lg-blockに関連付けられたメディアクエリがトリガーされ、display:noneがdisplay:blockに変更された場合にのみ読み込まれます。透明なpngを使用して、ブラウザが流体設計(高さ:自動、幅:100%)の<img>ブロック(および背景画像)に適切な高さ:幅の比率を設定できるようにします。

1078/501 = ~2.15  (large screen)
400/186  = ~2.15  (small screen)

したがって、3つの異なるビューポートに対して、次のような結果になります。

<img style="display: none; height: auto; width:100%; background-image: url('img/1078x501_1.jpg'); background-size: cover;" class="center-block visible-lg-block" src="img/400x186_trans.png" alt="pic 1">
<img style="display: none; height: auto; width:100%; background-image: url('img/517x240_1.jpg'); background-size: cover;" class="center-block visible-md-block" src="img/400x186_trans.png" alt="pic 1">
<img style="display: none; height: auto; width:100%; background-image: url('img/400x186_1.jpg'); background-size: cover;" class="center-block visible-sm-block" src="img/400x186_trans.png" alt="pic 1">

また、初期ロード中にはデフォルトのメディアビューポートサイズの画像のみが読み込まれ、その後、ビューポートに応じて、画像が動的に読み込まれます。

そしてjavascriptなし!



2

こんにちは私は同じ問題、画像をモバイルに読み込まない方法で苦労していました。

しかし、私は良い解決策を見つけました。最初にimgタグを作成し、次にsrc属性に空のsvgをロードします。これで、コンテンツへのインラインスタイルとして画像へのURLを設定できます:url( 'link to your image');。次に、選択したラッパーでimgタグをラップします。

<div class="test">
  <img src="data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/‌​svg%22/%3E" style="content:url('https://blog.prepscholar.com/hubfs/body_testinprogress.gif?t=1495225010554')">
</div>

  @media only screen and (max-width: 800px) {
      .test{
       display: none;
      }
    }

画像をロードしたくないブレークポイントで何も表示しないようにラッパーを設定します。imgタグのインラインcssは無視されるようになりました。displaynoneでラッパーにラップされた要素のスタイルは無視されるため、ラッパーに表示ブロックがあるブレークポイントに到達するまで、画像は読み込まれません。

モバイルブレークポイントにimgを読み込まないようにするための本当に簡単な方法です:)

実際の例については、このコードペンを確認してください:http ://codepen.io/fennefoss/pen/jmXjvo


Webが進化し続ける方法が大好きです。これまでこのトリックを見たことがありませんでしたcontent。表示された画像を変更するために- プロパティを使用しています。これに関する互換性の統計を教えていただけますか?
Windgazer

Edgeについては残念ですが、少なくとも、Firefox、Chome、Safariの最新バージョンで動作します。
Mikkel Fennefoss

2

いいえ、画像は通常どおり読み込まれ、携帯電話のユーザー帯域幅の節約を検討している場合は、ユーザーの帯域幅を使用します。メディアクエリを使用して、画像を読み込むデバイスをフィルター処理することができます。画像タグは画面サイズとメディアクエリが設定されているかどうかに関係なく画像を読み込むため、画像はdivなどの背景画像として設定する必要があり、タグではありません。


1

別の可能性は、<noscript>タグを使用して、タグ内に画像を配置すること<noscript>です。次に、noscript必要に応じて、javascriptを使用してタグを削除します。このように、プログレッシブエンハンスメントを使用してオンデマンドで画像をロードできます。

<noscript>IE8 でタグの内容を読み取るために書いたこのポリフィルを使用する

https://github.com/jameswestgate/noscript-textcontent


1

@media query CSSを使用します。基本的に、デスクトップの横にツリーの巨大な画像があり、テーブル/モバイル画面には表示されていないプロジェクトをリリースします。したがって、画像が非常に簡単に読み込まれないようにします

ここに小さなスニペットがあります:

.tree {
    background: none top left no-repeat; 
}

@media only screen and (min-width: 1200px) {
    .tree {
        background: url(enormous-tree.png) top left no-repeat;
    }
}

同じCSSを使用して、表示/可視性/不透明度で表示と非表示を切り替えることができますが、画像はまだ読み込まれていました。


0

モバイルで読み込まれない画像について話しているのですよね?@media(min-width:400px){background-image:thing.jpg}を実行した場合はどうなるでしょうか

それなら、特定の画面幅以上で画像を探すだけではないでしょうか?


-2

画像でdisplay:noneを使用するコツは、それらにIDを割り当てることです。これが機能するために必要なコードはそれほど多くありませんでした。メディアクエリと3つのスタイルシートを使用した例を次に示します。1つは電話用、もう1つはタブレット用、もう1つはデスクトップ用です。3つの画像、携帯電話、タブレット、デスクトップの画像があります。電話画面では、電話の画像のみが表示され、タブレットではタブレット画像のみが表示され、デスクトップではデスクトップコンピューター画像が表示されます。これを機能させるためのコード例を次に示します。

ソースコード:

<div id="content">
<img id="phone" src="images/phone.png" />
<img id="tablet" src="images/tablet.png" />
<img id="desktop" src="images/desktop.png" />
</div>

メディアクエリを必要としない電話CSS。動作させるimg#phone:

img#phone {
    display: block;
    margin: 6em auto 0 auto;
    width: 70%;
    }

img#tablet {display: none;}
img#desktop {display: none;}

タブレットcss:

@media only screen and (min-width: 641px) {
img#phone {display: none;}

img#tablet {
    display: block;
    margin: 6em auto 0 auto;
    width: 70%;
    }
}

そしてデスクトップのCSS:

@media only screen and (min-width: 1141px) {
img#tablet {display: none;}

img#desktop {
    display: block;
    margin: 6em auto 0 auto;
    width: 80%;
    }
}

幸運を祈ります。それがどのように機能するかを教えてください。


4
問題はdisplay: none、画像にどのように設定するかではありません。それは:「display:none」は画像の読み込みを妨げますか?
Evgenia Manolova 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.