Apakah "display: none" mencegah gambar dimuat?


336

Setiap tutorial pengembangan situs web yang responsif merekomendasikan penggunaan display:noneproperti CSS untuk menyembunyikan konten agar tidak dimuat di browser seluler sehingga situs web memuat lebih cepat. Apakah itu benar Tidak display:nonememuat gambar atau masih memuat konten di peramban seluler? Apakah ada cara untuk mencegah pemuatan konten yang tidak perlu di browser seluler?


6
Tampaknya ada beberapa cara untuk mencegah pengunduhan dengan tampilan: tidak ada, hanya tidak dengan cara vanila: timkadlec.com/2012/04/media-query-asset-downloading-results
mrwweb

1
W3C secara aktif mengujinya: w3.org/2009/03/image-display-none/test.php
Pino

Jawaban:


191

Browser semakin pintar. Hari ini browser Anda (tergantung pada versinya) mungkin melewatkan pemuatan gambar jika itu dapat menentukan itu tidak berguna.

Gambar memiliki display:nonegaya tetapi ukurannya dapat dibaca oleh skrip. Chrome v68.0 tidak memuat gambar jika induknya disembunyikan.

Anda dapat memeriksanya di sana: http://jsfiddle.net/tnk3j08s/

Anda juga bisa memeriksanya dengan melihat tab "jaringan" dari alat pengembang browser Anda.

Perhatikan bahwa jika browser menggunakan komputer CPU kecil, tidak harus membuat gambar (dan tata letak halaman) akan membuat seluruh operasi rendering lebih cepat tapi saya ragu ini adalah sesuatu yang benar-benar masuk akal hari ini.

Jika Anda ingin mencegah gambar dimuat, Anda mungkin tidak menambahkan elemen IMG ke dokumen Anda (atau mengatur srcatribut IMG ke "data:"atau "about:blank").


50
src gambar kosong berbahaya. Ini mengirimkan permintaan tambahan ke server. sebuah bacaan yang bagus tentang topik ini nczonline.net/blog/2009/11/30/…
Srinivas

2
@SrinivasYedhuri Ya, Anda benar. Saya mengedit dengan solusi yang lebih baik.
Denys Séguret

8
Jawaban ini hanya sebagian benar. Saya baru saja mengujinya di Google Chrome (v35) dan saya dapat mengonfirmasi bahwa gambar dengan tampilan tidak disetel tidak diunduh. Ini mungkin untuk membuat desain responsif lebih mudah pada pengembang.
Shawn Whinnery

15
Jawaban ini tidak lagi benar. Lihat di bawah untuk hasil terbaru tentang bagaimana berbagai browser, termasuk versi terbaru FF, menangani situasi ini secara berbeda
DMTintner

2
Bahkan hari ini (Oktober 2017), browser paling umum Chrome akan mengunduh semua sumber elemen 'img', bahkan jika mereka disembunyikan. Itu tidak akan mengunduh gambar latar belakang tersembunyi.
TKoL

130

Jika Anda menjadikan gambar sebagai latar-gambar dari div di CSS, ketika div itu diatur ke "display: none", gambar tidak akan memuat. Ketika CSS dinonaktifkan, itu masih tidak akan memuat, karena, well, CSS dinonaktifkan.


17
Ini sebenarnya tip yang sangat berguna untuk desain responsif menurut saya.
ryandlf

3
Ini berfungsi di FF, Chrome, Safari, Opera, Maxthon. Saya belum mencoba IE.
Brent

13
Melanggar baru dari depan! <div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>. Hasil: Firefox 29 & Opera 12 tidak dimuat. IE 11 & Chrome 34 dimuat.
CoolCmd

3
@CoolCmd untuk desain responsif ini masih pilihan yang layak, yang Anda bisa dalam set media CSS Anda permintaan background-imageuntuk noneuntuk kasus-kasus di mana Anda tidak ingin gambar ke beban. Belum menemukan alternatif yang lebih baik untuk kasus penggunaan ini yang tidak menggunakan JS.
Qtax

1
Saya menguji slider gambar (yang menggunakan gambar latar belakang) yang memiliki kueri media min-width. Di bawah lebar itu, div induk memiliki CSS display: none;. Pengujian jaringan dengan jendela di bawah lebar itu: Chrome 35, IE11 dan Edge tidak memuat gambar
binaryfunt

57

Jawabannya tidak semudah ya atau tidak. Lihat hasil tes yang baru-baru ini saya lakukan:

  • Di Chrome: Semua 8 tangkapan layar- * gambar dimuat (gambar 1)
  • Di Firefox: Hanya gambar layar 1- * yang dimuat yang sedang ditampilkan (gambar 2)

Jadi setelah menggali lebih jauh saya menemukan ini , yang menjelaskan bagaimana setiap browser menangani pemuatan aset img berdasarkan tampilan css: tidak ada;

Kutipan dari posting blog:

  • Chrome dan Safari (WebKit):
    WebKit mengunduh file setiap kali kecuali ketika latar belakang diterapkan melalui kueri media yang tidak cocok.
  • Firefox:
    Firefox tidak akan mengunduh gambar yang disebut dengan gambar latar belakang jika gaya disembunyikan tetapi mereka masih akan mengunduh aset dari tag img.
  • Opera:
    Seperti halnya Firefox, Opera tidak akan memuat gambar latar belakang yang tidak berguna.
  • Internet Explorer:
    IE, seperti WebKit akan mengunduh gambar latar belakang meskipun mereka memiliki tampilan: tidak ada; Sesuatu yang aneh muncul dengan IE6: Elemen dengan gambar latar belakang dan tampilan: tidak ada set inline tidak akan diunduh ... Tapi itu akan terjadi jika gaya tersebut tidak diterapkan inline.

Chrome- Semua 8 tangkapan layar- * gambar dimuat

Firefox- Hanya 1 tangkapan layar- * gambar dimuat yang sedang ditampilkan


1
Selama hasil itu bukan bagian dari standar, mereka tidak ada gunanya. Chrome mengubah mesin rendering, perubahan opera juga, dan IE akan diganti dengan yang lain. Anda tidak bisa mengandalkan implementasi fitur pinggiran seperti ini agar tetap stabil dari waktu ke waktu. Solusinya akan menjadi cara untuk mengisyaratkan browser ketika suatu aset harus dimuat malas jika sama sekali.
Mark Kaplun

5
@ MarkKaplun Saya tidak menyarankan bahwa hasil tes ini harus menunjukkan dengan tepat apa yang Anda harapkan selalu terjadi dengan setiap browser setiap saat. Saya hanya bermaksud menunjukkan bahwa jawabannya "tidak sesederhana ya atau tidak". setiap browser saat ini menerapkan ini secara berbeda dan itu mungkin akan terus seperti ini untuk sementara waktu
DMTintner

@DMTintner tepat sekali. dan pada hari ini saya dapat mengkonfirmasi safari memuat gambar latar belakang div yang `display: none '. pendekatan terbaik adalah dengan tidak mengasumsikan apa pun dan jika Anda tidak ingin gambar dimuat, jangan referensi itu dalam tag html
bhu Boue vidya

34

HTML5 <picture>Tag akan membantu Anda untuk menyelesaikan sumber gambar yang tepat tergantung pada lebar layar

Tampaknya perilaku browser tidak banyak berubah selama 5 tahun terakhir dan banyak yang masih akan mengunduh gambar tersembunyi, bahkan jika ada display: noneproperti yang ditetapkan pada mereka.

Meskipun ada solusi media query , itu hanya bisa berguna ketika gambar ditetapkan sebagai latar belakang di CSS.

Sementara saya berpikir bahwa hanya ada solusi JS untuk masalah ini ( lazy load , picturefill , dll.), Ternyata ada solusi HTML murni yang bagus yang keluar dari kotak dengan HTML5.

Dan itu adalah <picture>tag.

Begini cara MDN menjelaskannya:

The HTML <picture>elemen adalah wadah yang digunakan untuk menentukan beberapa <source>elemen untuk spesifik<img> yang terkandung di dalamnya. Browser akan memilih sumber yang paling sesuai dengan tata letak halaman saat ini (batasan kotak gambar akan muncul) dan perangkat itu akan ditampilkan (misalnya perangkat normal atau hiDPI.)

Dan inilah cara menggunakannya:

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

Logika di belakang

Browser akan memuat sumber imgtag, hanya jika tidak ada aturan media yang berlaku. Ketika <picture>elemen tidak didukung oleh browser, itu lagi akan mundur untuk menunjukkanimg tag.

Biasanya Anda akan menempatkan gambar terkecil sebagai sumber <img>dan karenanya tidak memuat gambar berat untuk layar yang lebih besar. Begitu juga sebaliknya, jika aturan media berlaku, sumbernya <img>tidak akan diunduh, melainkan akan mengunduh konten url yang sesuai.<source> tag yang .

Satu-satunya kekurangan di sini adalah bahwa jika elemen tidak didukung oleh browser, itu hanya akan memuat gambar kecil. Di sisi lain pada 2017 kita harus berpikir dan kode di ponsel terlebih dahulu pendekatan .

Dan sebelum seseorang terlalu keluar, inilah dukungan browser saat ini untuk <picture>:

Browser desktop

Dukungan browser desktop

Browser seluler

Dukungan browser seluler

Lebih lanjut tentang dukungan browser yang dapat Anda temukan di Dapatkah saya menggunakan .

Yang menyenangkan adalah kalimat html5please adalah menggunakannya dengan fallback . Dan saya pribadi berniat untuk mengambil saran mereka.

Lebih lanjut tentang tag Anda dapat menemukan dalam spesifikasi W3C . Ada penafian di sana, yang menurut saya penting untuk disebutkan:

The pictureelemen agak berbeda dari yang tampak serupa videodan audioelemen. Sementara semuanya mengandung sourceelemen, srcatribut elemen sumber tidak memiliki arti ketika elemen bersarang di dalam pictureelemen, dan algoritma pemilihan sumber daya berbeda. Selain itu, pictureelemen itu sendiri tidak menampilkan apa pun; itu hanya menyediakan konteks untuk imgelemen yang terkandung yang memungkinkannya memilih dari beberapa URL.

Jadi yang dikatakannya adalah itu hanya membantu Anda meningkatkan kinerja saat memuat gambar, dengan memberikan konteks tertentu.

Dan Anda masih dapat menggunakan beberapa sihir CSS untuk menyembunyikan gambar di perangkat kecil:

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

Dengan demikian browser tidak akan menampilkan gambar aktual dan hanya akan mengunduh 1x1gambar piksel (yang dapat di-cache jika Anda menggunakannya lebih dari sekali). Perlu diketahui, bahwa jika <picture>tag tidak didukung oleh browser, bahkan pada layar descktop gambar yang sebenarnya tidak akan ditampilkan (jadi Anda pasti akan memerlukan cadangan polyfill di sana).


4
Saya mengambil rute yang sama seperti Anda, tetapi menggunakan data-img sebagai gantinya :) Inilah posting yang saya tulis di atasnya swimburger.net/blog/web/…
Swimburger

10

Ya itu akan membuat lebih cepat, sedikit, hanya karena itu tidak harus membuat gambar dan elemen yang kurang untuk diurutkan di layar.

Jika Anda tidak ingin itu dimuat, biarkan DIV kosong di mana Anda dapat memuat html ke dalamnya nanti yang berisi <img> tag.

Coba gunakan pembakar atau wireshark seperti yang saya sebutkan sebelumnya dan Anda akan melihat bahwa file DO ditransfer bahkan jika display:none ada.

Opera adalah satu-satunya browser yang tidak akan memuat gambar jika tampilan tidak diatur.Opera sekarang telah pindah ke webkit dan akan membuat semua gambar bahkan jika tampilan mereka tidak diatur.

Berikut ini adalah halaman pengujian yang akan membuktikannya:

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


9

** 2019 Jawab **

Dalam situasi normal display:nonetidak menghalangi gambar untuk diunduh

/*will be downloaded*/

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

Tetapi jika elemen leluhur memiliki gambar display:nonemaka keturunan tidak akan diunduh


/* 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');
}

Situasi lain yang mencegah gambar diunduh:

1- Elemen target tidak ada

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

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

2- Dua kelas yang sama memuat gambar yang berbeda

/* 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');
}

Anda dapat menyaksikan sendiri di sini: https://codepen.io/juanmamenendez15/pen/dLQPmX


8

Mode quirks: gambar dan tampilan: tidak ada

Ketika gambar memiliki display: noneatau berada di dalam suatu elemen dengan display:none, browser dapat memilih untuk tidak mengunduh gambar sampai display diatur ke nilai lain.

Hanya Opera yang mengunduh gambar saat Anda beralih displayke block. Semua browser lain segera mengunduhnya.


8

Gambar latar belakang elemen div akan dimuat jika div diatur ke 'display: none'.

Bagaimanapun, jika div yang sama memiliki orangtua dan orangtua itu diatur ke 'display: none', gambar latar belakang elemen anak tidak akan memuat . :)

Contoh menggunakan bootstrap:

<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

Jika Anda menjadikan gambar sebagai latar-gambar dari div di CSS, ketika div itu diatur ke 'display: none', gambar tidak akan memuat.

Hanya memperluas solusi Brent.

Anda dapat melakukan hal berikut untuk solusi CSS murni, itu juga membuat kotak img benar-benar berperilaku seperti kotak img dalam pengaturan desain responsif (itulah gunanya png transparan), yang sangat berguna jika desain Anda menggunakan responsif-dinamis - mengubah ukuran gambar.

<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">

Gambar hanya akan dimuat ketika kueri media yang dikaitkan dengan blok-lg dipicu dan ditampilkan: tidak ada yang berubah untuk menampilkan: blok. Png transparan digunakan untuk memungkinkan browser mengatur tinggi yang sesuai: rasio lebar untuk blok <img> Anda (dan dengan demikian gambar latar belakang) dalam desain yang cair (tinggi: otomatis; lebar: 100%).

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

Jadi Anda berakhir dengan sesuatu seperti berikut, untuk 3 viewports berbeda:

<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">

Dan hanya gambar ukuran viewport media default Anda yang dimuat selama pemuatan awal, kemudian setelah itu, tergantung pada viewport Anda, gambar akan dimuat secara dinamis.

Dan tidak ada javascript!



2

Hai teman-teman saya berjuang dengan masalah yang sama, bagaimana tidak memuat gambar di ponsel.

Tapi saya menemukan solusi yang bagus. Pertama-tama buatlah tag img dan kemudian muatkan svg kosong pada atribut src. Sekarang Anda dapat mengatur URL Anda ke gambar sebagai gaya inline dengan konten: url ('tautan ke gambar Anda') ;. Sekarang bungkus tag img Anda dalam bungkus pilihan Anda.

<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;
      }
    }

Atur pembungkus untuk menampilkan tidak ada pada breakpoint di mana Anda tidak ingin memuat gambar. Css inline dari tag img sekarang diabaikan karena gaya elemen yang dibungkus pembungkus dengan tampilan tidak akan diabaikan, oleh karena itu gambar tidak dimuat, sampai Anda mencapai breakpoint di mana pembungkus memiliki blok tampilan.

Ini dia, cara yang sangat mudah untuk tidak memuat img di breakpoint seluler :)

Lihat codepen ini, untuk contoh yang berfungsi: http://codepen.io/fennefoss/pen/jmXjvo


Saya suka bagaimana web terus berkembang, belum pernah melihat trik ini sebelumnya, menggunakan content-properti untuk mengubah gambar yang ditampilkan, yaitu. Bisakah Anda memberikan beberapa statistik kompatibilitas ini?
Windgazer

Memburuk tentang Edge: /, setidaknya itu berfungsi di versi terbaru dari Firefox, Chome dan Safari.
Mikkel Fennefoss

2

Tidak. Gambar akan dimuat seperti biasa dan masih akan menggunakan bandwidth pengguna jika Anda mempertimbangkan penghematan bandwidth pengguna ponsel. Yang dapat Anda lakukan adalah menggunakan kueri media dan memfilter perangkat yang Anda inginkan untuk memuat gambar Anda. gambar harus ditetapkan sebagai gambar latar belakang div, dll dan BUKAN tag karena tag gambar akan memuat gambar terlepas dari apakah ukuran layar dan kueri media diatur.


1

Kemungkinan lain adalah menggunakan <noscript>tag dan menempatkan gambar di dalam <noscript>tag. Kemudian gunakan javascript untuk menghapusnoscript tag saat Anda membutuhkan gambar. Dengan cara ini Anda dapat memuat gambar sesuai permintaan menggunakan peningkatan progresif.

Gunakan polyfill ini yang saya tulis untuk membaca isi <noscript> tag di IE8

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


1

Gunakan @media query CSS, pada dasarnya kami hanya merilis sebuah proyek di mana kami memiliki gambar pohon yang sangat besar di desktop di samping tetapi tidak ditampilkan di layar tabel / seluler. Jadi mencegah gambar dari memuatnya cukup mudah

Berikut ini cuplikan kecil:

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

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

Anda dapat menggunakan CSS yang sama untuk ditampilkan dan disembunyikan dengan tampilan / visibilitas / opacity tetapi gambar masih dimuat, ini adalah kode aman yang paling gagal kami buat.


0

kita berbicara tentang gambar yang tidak dimuat di ponsel, kan? jadi bagaimana jika Anda baru saja melakukan @ media (lebar minimum: 400px) {background-image: thing.jpg}

bukankah itu hanya mencari gambar di atas lebar layar tertentu?


-2

Trik untuk menggunakan tampilan: tidak ada dengan gambar adalah untuk menetapkannya id. Ini tidak ada banyak kode yang diperlukan untuk membuatnya berfungsi. Berikut adalah contoh menggunakan kueri media dan 3 lembar gaya. Satu untuk ponsel, satu untuk tablet, dan satu untuk desktop. Saya memiliki 3 gambar, gambar ponsel, tablet, dan desktop. Pada layar ponsel hanya gambar telepon yang akan ditampilkan, tablet hanya akan menampilkan gambar tablet, desktop menampilkan gambar komputer desktop. Berikut adalah contoh kode untuk membuatnya berfungsi:

Kode sumber:

<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 telepon yang tidak memerlukan kueri media. Ini ponsel # img yang membuatnya bekerja:

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

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

Tablet css:

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

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

Dan css desktop:

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

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

Semoga beruntung dan beri tahu saya cara kerjanya untuk Anda.


4
Pertanyaannya bukan bagaimana mengatur display: nonepada gambar. Itu: Apakah "display: none" mencegah gambar dimuat?
Evgenia Manolova
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.