レスポンシブWebサイトの開発チュートリアルでは、Webブラウザの読み込みが速くなるように、CSSをdisplay:none
CSSプロパティを使用してコンテンツをモバイルブラウザに読み込まないようにすることをお勧めします。それは本当ですか? display:none
は画像をロードしませんか、それともまだモバイルブラウザのコンテンツをロードしますか?モバイルブラウザに不要なコンテンツを読み込まないようにする方法はありますか?
それらの画像が読み込まれます。ブラウザは、スクリプトがDOMの要素を動的にチェックする可能性があるため、要素(または要素の内容)を最適化しません。
あなたはそれをそこでチェックすることができます: http://jsfiddle.net/dk3TA/
画像はdisplay:none
スタイルですが、そのサイズはスクリプトによって読み取られます。ブラウザの開発者ツールの「ネットワーク」タブを見て確認することもできます。
ブラウザが小さなCPUコンピュータ上にある場合、イメージをレンダリングする(そしてページをレイアウトする)必要がない場合は、全体のレンダリング操作が速くなりますが、今日これが本当に意味のあることではないでしょうか。
画像が読み込まれないようにしたい場合は、IMG要素をドキュメントに追加しない(またはIMGのsrc
属性を"data:"
または"about:blank"
に設定する)ことはできません。
編集:
ブラウザは賢くなっています。今日のブラウザ(バージョンによって異なります)は、役に立ちませんと判断できる場合は画像の読み込みをスキップすることがあります。
CSSで画像をdivの背景画像にする場合、そのdivが "display:none"に設定されていると、画像は読み込まれません。 CSSが無効になっても、CSSは無効になっているため、ロードされません。
答えは単純なはいまたはいいえほど簡単ではありません。最近行ったテストの結果を確認してください。
そのため、さらに掘り下げた後、私は これ を見つけました。これは、各ブラウザがCSS表示に基づいてimgアセットの読み込みをどのように処理するかを説明します。
ブログ記事からの抜粋:
- ChromeとSafari(WebKit):
WebKitは、背景が一致しないメディアクエリを通じて適用される場合を除き、毎回ファイルをダウンロードします。- Firefox:
スタイルが非表示の場合、Firefoxはbackground imageで呼び出された画像をダウンロードしませんが、それでもimgタグからアセットをダウンロードします。- オペラ:
Firefoxのように、Operaは無用な背景画像をロードしません。- インターネットエクスプローラ:
WebKitのようなIEは、背景画像が表示されていても背景画像をダウンロードします。 IE6では何か変なことが起こります:背景画像と表示の要素:インラインで設定されたものはダウンロードされません...しかし、それらのスタイルがインラインで適用されていない場合はそうなるでしょう。
<picture>
タグは、画面の幅に応じて適切な画像ソースを解決するのに役立ちますブラウザーの動作は過去5年間あまり変化していないようで、多くの場合、display: none
プロパティが設定されていても、非表示の画像をダウンロードします。
メディアクエリ の回避策がありますが、画像がCSSの背景として設定されている場合にのみ有用です。
私は問題に対するJSソリューション( 遅延負荷 、 picturefill など)だけがあると考えていましたが、そこから出てくるニースの純粋なHTMLソリューションがあるように見えましたHTML5のあるボックス。
そして、それは<picture>
タグです。
MDN の説明は次のとおりです。
HTML
<picture>
elementは、それに含まれる特定の<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年には、モバイルファーストアプローチで考え、コーディングする必要があります。
そして、誰かがあまりにも終了する前に、currentブラウザの<picture>
のサポートがあります:
使用できます にあるブラウザサポートの詳細をご覧ください。
良いことは、 html5please の文がフォールバックで使用するであることです。そして、私は個人的に彼らの助言を受けるつもりです。
W3Cの仕様 で見つけることができるタグの詳細。そこには免責事項がありますが、それについて言及することが重要です。
picture
要素は、外観が似ているvideo
およびaudio
要素とは多少異なります。すべてに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>
タグがブラウザでサポートされていない場合、デスクトップ画面でも実際の画像wo n'tが表示されることに注意してください(したがって、ポリフィルバックアップが必要になります)そこ)。
はい、それはイメージをレンダリングする必要がなく、画面上でソートする要素が1つ少ないためだけに、少し速くレンダリングされます。
ロードしたくない場合は、後で<img>
タグを含むhtmlをロードできるDIVを空のままにします。
前に述べたようにfirebugまたはwiresharkを使ってみると、display:none
があってもファイルが転送されることがわかります。
Operaは、表示がnoneに設定されていると画像を読み込まない唯一のブラウザです。 Operaは現在WebKitに移行しており、表示がnoneに設定されていてもすべての画像をレンダリングします。
これを証明するテストページがあります。
Divが設定されている場合、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>
Imageが
display: none
を持つか、display:none
を持つ要素の中にある場合、ブラウザはdisplay
が別の値に設定されるまで画像をダウンロードしないことを選ぶかもしれません。
display
をblock
に切り替えると、Operaのみが画像をダウンロードします。他のすべてのブラウザはすぐにそれをダウンロードします。
もしそうなら、不要なコンテンツをモバイルブラウザにロードしない方法はありますか?
<img src="" srcset="">
を使う
http://www.webdesignerdepot.com/2015/08/the-state-of-responsive-images/
CSSで画像をdivの背景画像にした場合、そのdivが 'display:none'に設定されていると、画像はロードされません
Brentのソリューションを拡張するだけです。
純粋なCSSソリューションでは次のことができます。それはまた、レスポンシブデザイン設定でimgボックスが実際にはimgボックスのように振る舞うようにするものです。画像のサイズ変更.
<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はブラウザがあなたの<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">
また、初期ロード時にはデフォルトのメディアビューポートサイズのイメージのみがロードされます。その後、ビューポートによっては、イメージが動的にロードされます。
そしてジャバスクリプトなし!
**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
リソースの取得を防ぐには、Webコンポーネントの <template>
要素 を使用します。
いいえ。画像は通常どおりにロードされ、携帯電話のユーザー帯域幅の節約を検討している場合はユーザーの帯域幅が使用されます。メディアクエリを使用して画像をロードするデバイスをフィルタリングすることができます。 imageは、画面サイズやメディアクエリが設定されているかどうかにかかわらずimageをロードするので、imageはdivなどの背景画像として設定される必要があります。タグではありません。
@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を使ってdisplay/visibility/opacityで表示/非表示を切り替えることができますが、それでも画像はロードされていました。
もう1つの可能性は、<noscript>
タグを使用して、イメージを<noscript>
タグの内側に配置することです。次に、javascriptを使用して、画像が必要になったときにnoscript
タグを削除します。このようにして、プログレッシブエンハンスメントを使用してオンデマンドで画像を読み込むことができます。
私が書いたこのpolyfillを使ってIE8の<noscript>
タグの内容を読んでください。
こんにちはみんな私は同じ問題、携帯電話で画像をロードしない方法で苦労していました。
しかし、私は良い解決策を考え出しました。まず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は無視されるようになりました。したがって、ラッパーが表示ブロックを持つブレークポイントに達するまで、イメージはロードされません。
モバイルブレークポイントにimgをロードしない、本当に簡単な方法があります。
実用的な例として、このcodepenを調べてください。 http://codepen.io/fennefoss/pen/jmXjvo
携帯に画像が読み込まれないという話ですね。あなたが@media(min-width:400px){background-image:thing.jpg}をしたとしたらどうでしょう。
それでは、特定の画面幅を超えたところで画像を探すだけではないでしょうか。