すべてのレスポンシブなWebサイト開発チュートリアルでは、display:none
CSSプロパティを使用してコンテンツをモバイルブラウザーにロードしないようにして、Webサイトのロードを高速化することを推奨しています。本当ですか?ないdisplay:none
画像を読み込まないか、それはまだモバイルブラウザ上でコンテンツをロードしていますか?モバイルブラウザーに不要なコンテンツを読み込まないようにする方法はありますか?
すべてのレスポンシブなWebサイト開発チュートリアルでは、display:none
CSSプロパティを使用してコンテンツをモバイルブラウザーにロードしないようにして、Webサイトのロードを高速化することを推奨しています。本当ですか?ないdisplay:none
画像を読み込まないか、それはまだモバイルブラウザ上でコンテンツをロードしていますか?モバイルブラウザーに不要なコンテンツを読み込まないようにする方法はありますか?
回答:
ブラウザはよりスマートになっています。今日、ブラウザは(バージョンによっては)、画像が役に立たないと判断できる場合、画像の読み込みをスキップすることがあります。
画像にはdisplay:none
スタイルがありますが、そのサイズはスクリプトで読み取ることができます。親が非表示の場合、Chrome v68.0は画像をロードしません。
あなたはそれをそこでチェックするかもしれません:http : //jsfiddle.net/tnk3j08s/
また、ブラウザの開発者ツールの「ネットワーク」タブを見て確認することもできます。
ブラウザーが小さなCPUコンピューター上にある場合、画像をレンダリングする(およびページをレイアウトする)必要がないため、レンダリング操作全体が高速になりますが、これは今日本当に意味のあることではないことに注意してください。
画像が読み込まれないようにする場合は、IMG要素をドキュメントに追加しないでください(またはIMG src
属性を"data:"
またはに設定します"about:blank"
)。
CSSで画像をdivの背景画像にした場合、そのdivが「display:none」に設定されていると、画像は読み込まれません。CSSが無効になっている場合でも、CSSは無効になっているため、読み込まれません。
<div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>
。結果:Firefox 29およびOpera 12がロードされません。IE 11とChrome 34の読み込み。
background-image
できるnone
ためです。JSを使用しないこのユースケースのより良い代替案を見つけていません。
display: none;
。その幅以下のウィンドウでのネットワークテスト:Chrome 35、IE11、およびEdgeは画像をロードしませんでした
答えは単純な「はい」または「いいえ」ほど簡単ではありません。最近行ったテストの結果を確認してください。
それでさらに掘り下げた後、私はこれを見つけました。これは、各ブラウザがcssディスプレイに基づいてimgアセットのロードを処理する方法を説明します。
ブログ投稿からの抜粋:
- ChromeとSafari(WebKit):
WebKitは、一致しないメディアクエリを通じてバックグラウンドが適用される場合を除いて、毎回ファイルをダウンロードします。- Firefox:
Firefoxは、スタイルが非表示の場合、背景画像で呼び出される画像をダウンロードしませんが、imgタグからアセットをダウンロードします。- Opera:
Firefoxと同様に、Operaは不要な背景画像をロードしません。- Internet Explorer:
IEは、WebKitのように、表示されていても背景画像をダウンロードします。IE6で奇妙なことが表示されます:背景画像とディスプレイの要素:インラインが設定されていないものはダウンロードされません...しかし、これらのスタイルがインラインで適用されていない場合は、そうなります。
<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
要素は、同様の見通しから幾分異なる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>
ブラウザでタグがサポートされていない場合、デスクトップ画面でも実際の画像は表示されないことに注意してください(そのため、必ずポリフィルのバックアップが必要になります)。
はい、わずかに速くレンダリングされます。これは、画像をレンダリングする必要がなく、画面上で並べ替える要素が1つ少ないためです。
ロードしたくない場合は、DIVを空のままにして、後で<img>
タグを含むhtmlをロードできるようにします。
前に述べたように、firebugまたはWiresharkを使用してみてください。ファイルdisplay:none
が存在していても、ファイルが転送されることがわかります。
Operaは、ディスプレイがnoneに設定されている場合にイメージをロードしない唯一のブラウザーです。Operaはwebkitに移動し、ディスプレイがnoneに設定されている場合でもすべての画像をレンダリングします。
これを証明するテストページは次のとおりです。
** 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
画像が
display: none
の要素内にあるか要素内にあるdisplay:none
場合、ブラウザは、display
が別の値に設定されるまで画像をダウンロードしないことを選択できます。唯一のオペラは、スイッチ画像ダウンロード
display
にしますblock
。他のすべてのブラウザはそれをすぐにダウンロードします。
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>
もしそうなら、モバイルブラウザに不要なコンテンツを読み込まない方法はありますか?
使用する <img src="" srcset="">
http://www.webdesignerdepot.com/2015/08/the-state-of-responsive-images/
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なし!
こんにちは私は同じ問題、画像をモバイルに読み込まない方法で苦労していました。
しかし、私は良い解決策を見つけました。最初に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
content
。表示された画像を変更するために- プロパティを使用しています。これに関する互換性の統計を教えていただけますか?
別の可能性は、<noscript>
タグを使用して、タグ内に画像を配置すること<noscript>
です。次に、noscript
必要に応じて、javascriptを使用してタグを削除します。このように、プログレッシブエンハンスメントを使用してオンデマンドで画像をロードできます。
<noscript>
IE8 でタグの内容を読み取るために書いたこのポリフィルを使用する
@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を使用して、表示/可視性/不透明度で表示と非表示を切り替えることができますが、画像はまだ読み込まれていました。
モバイルで読み込まれない画像について話しているのですよね?@media(min-width:400px){background-image:thing.jpg}を実行した場合はどうなるでしょうか
それなら、特定の画面幅以上で画像を探すだけではないでしょうか?
画像で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%;
}
}
幸運を祈ります。それがどのように機能するかを教えてください。
display: none
、画像にどのように設定するかではありません。それは:「display:none」は画像の読み込みを妨げますか?