Чи перешкоджає завантаженню зображення "display: none"?


336

Кожен підручник з розробки чуйних веб-сайтів рекомендує використовувати display:noneвластивість CSS для приховування вмісту від завантаження в мобільних браузерах, щоб веб-сайт завантажувався швидше. Це правда? Чи має display:noneне завантажувати зображення або ж вона до сих пір завантаження контенту на мобільному браузері? Чи є спосіб запобігти завантаженню непотрібного вмісту в мобільних браузерах?


6
Здається, є кілька способів запобігти завантаженню з дисплеєм: жоден, тільки не ванільний шлях: timkadlec.com/2012/04/media-query-asset-downloading-results
mrwweb

1
W3C активно тестує це: w3.org/2009/03/image-display-none/test.php
Піно

Відповіді:


191

Браузери стають розумнішими. Сьогодні ваш браузер (залежно від версії) може пропустити завантаження зображення, якщо він визначить, що це не корисно.

Зображення має display:noneстиль, але його розмір може бути прочитаний сценарієм. Chrome v68.0 не завантажує зображення, якщо батьківський прихований.

Ви можете перевірити його там: http://jsfiddle.net/tnk3j08s/

Ви також могли перевірити це, переглянувши вкладку "мережа" інструментів для розробників вашого браузера.

Зауважте, що якщо браузер перебуває на невеликому комп'ютері з процесором, відсутня необхідність відображати зображення (та розміщувати сторінку) зробить всю операцію візуалізації швидшою, але я сумніваюся, що це справді має сенс сьогодні.

Якщо ви хочете не допустити завантаження зображення, ви можете просто не додати елемент IMG до свого документа (або встановити srcатрибут IMG до "data:"або "about:blank").


50
пусте зображення src небезпечно. Він надсилає додатковий запит на сервер. добре читайте на цю тему nczonline.net/blog/2009/11/30/…
Шрінівас

2
@SrinivasYedhuri Так, ти маєш рацію. Я відредагував краще рішення.
Denys Séguret

8
Ця відповідь лише частково правильна. Я щойно перевірив це на Google Chrome (v35) і можу підтвердити, що зображення із встановленим жодним дисплеєм не завантажуються. Це, мабуть, полегшить гнучку конструкцію для розробника.
Шон Віннірі

15
Ця відповідь більше не є правильною. Дивіться нижче для оновлених результатів того, як різні браузери, включаючи останню версію FF, вирішують цю ситуацію по-різному
DMTintner

2
Навіть сьогодні (жовтень 2017 року) найпоширеніший браузер Chrome завантажить усі джерела елементів img, навіть якщо вони приховані. Він не завантажує приховані фонові зображення.
TKoL

130

Якщо ви зробите зображення фоновим зображенням div у CSS, коли цей div встановлено на "display: none", зображення не завантажується. Коли CSS відключений, він все ще не завантажиться, оскільки, ну, CSS відключений.


17
Насправді це дуже корисна порада для чуйного дизайну.
ryandlf

3
Це працює у FF, Chrome, Safari, Opera, Maxthon. Я не пробував жодного IE.
Brent

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

3
@CoolCmd для адаптивного дизайну це все ще є життєздатним варіантом, як ви можете в CSS ЗМІ У запиті , background-imageщоб noneу випадку , коли ви не хочете зображення для завантаження. Не знайдено кращої альтернативи для цього випадку використання, який не використовує JS.
Qtax

1
Я протестував повзунок зображень (на якому використовували фонові зображення), що містив медіа-запит мінімальної ширини. Нижче цієї ширини у батьківського діва був CSS display: none;. Тестування мережі з вікном нижче цієї ширини: Chrome 35, IE11 і Edge не завантажували зображення
binaryfunt

57

Відповідь не така проста, як простий так чи ні. Ознайомтесь з результатами тесту, який я нещодавно робив:

  • У Chrome: завантажено всі 8 знімків екрана - * (img 1)
  • У Firefox: завантажується лише 1 знімок екрана - *, який наразі відображається (img 2)

Отже, після подальшого копання я виявив це , що пояснює, як кожен браузер обробляє завантаження активів img на основі відображення css: none;

Уривок із публікації щоденника:

  • Chrome і Safari (WebKit):
    WebKit завантажує файл кожен раз, за ​​винятком випадків, коли фон застосовується через невідповідний медіа-запит.
  • Firefox:
    Firefox не завантажує зображення, яке називається фоновим зображенням, якщо стилі приховані, але вони все одно завантажуватимуть активи з тегів img.
  • Опера:
    Як і Firefox, Opera не завантажує марні фонові зображення.
  • Internet Explorer:
    IE, як WebKit, завантажує фонові зображення, навіть якщо вони мають відображення: жодне; Щось дивне з'являється з IE6: Елементи з фоновим зображенням та дисплеєм: жоден встановлений вбудований рядок не буде завантажений ... Але вони будуть, якщо ці стилі не будуть застосовані в рядку.

Chrome - Усі 8 знімків екрана - * завантажені зображення

Firefox - завантажується лише 1 знімок екрана - *, який наразі відображається


1
Поки ці результати не входять до стандартів, вони є абсолютно безглуздими. Chrome змінює механізм візуалізації, змінюється також опера, і IE буде замінено чимось іншим. Ви просто не можете розраховувати на реалізацію подібних функцій бахроми, щоб вони залишалися стабільними з часом. Рішення буде способом натякнути веб-переглядачу, коли об’єкт слід ліниво завантажувати.
Марк Каплун

5
@MarkKaplun Я не припускав, що ці результати тестування повинні показувати вам саме те, що ви можете очікувати, що завжди буде з кожним браузером. Я хотів лише продемонструвати, що відповідь "не такий простий, як" так "чи" ні ". кожен браузер в даний час реалізує це по-різному, і це, мабуть, буде продовжуватися таким чином деякий час
DMTintner

@DMTintner точно так. і на сьогоднішній день я можу підтвердити завантаження в сафарі iOS фоновими зображеннями дивів, які були `display: none '. найкращий підхід - нічого не припускати, і якщо ви не хочете завантажувати зображення, не
посилайтеся на

34

<picture>Тег HTML5 допоможе вирішити правильне джерело зображення залежно від ширини екрана

Мабуть, поведінка браузерів не сильно змінилася протягом останніх 5 років, і багато хто все одно завантажуватиме приховані зображення, навіть якщо display: noneна них встановлено властивість.

Незважаючи на те, що існує спосіб вирішення медіа-запитів , він може бути корисним лише тоді, коли зображення було встановлено як фон у CSS.

Поки я думав, що існує просто JS-рішення проблеми ( ледаче завантаження , заповнення зображень тощо), виявилося, що є гарне чисте рішення HTML, яке виходить із коробки з HTML5.

І це <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>заповіту не завантажуватиметься, натомість він завантажить вміст URL-адреси відповідного <source>тегу.

Єдиний підводний камінь тут полягає в тому, що якщо елемент не підтримується браузером, він завантажить лише невелике зображення. З іншого боку, у 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>тег не підтримується веб-переглядачем, навіть на екранах стільниці фактичне зображення не відображатиметься (тому вам обов'язково потрібна резервна копія поліфауніту).


4
Я взяв подібний маршрут, як і ви, але замість цього використовуйте data-img :) Ось повідомлення, яке я написав на ньому swimburger.net/blog/web/…
Swimburger

10

Так, візуалізація буде швидшою, трохи, лише тому, що не потрібно рендерувати зображення і є одним менш елементом для сортування на екрані.

Якщо ви не хочете, щоб його завантажили, залиште DIV порожнім, куди ви можете завантажити в нього пізніше HTML, що містить <img>тег.

Спробуйте використовувати firebug або wireshark, як я вже згадував раніше, і ви побачите, що файли НЕ передаються, навіть якщо вони display:noneє.

Opera - це єдиний браузер, який не завантажує зображення, якщо для дисплея встановлено жодне. Зараз Opera перейшла на веб-код і буде рендерувати всі зображення, навіть якщо для їх відображення встановлено жодне.

Ось тестова сторінка, яка підтвердить це:

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- Два рівні класи, що завантажують різні зображення

/* 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 буде встановлено на інше значення.

Тільки Opera завантажує зображення при переключенні displayна block. Усі інші браузери завантажують його негайно.


8

Фонове зображення сну елемента завантажить якщо div встановлений, зробить 'display: none'.

У будь-якому випадку, якщо цей самий div має батьківський і цей батьківський параметр встановлений на "display: none", фонове зображення дочірнього елемента не завантажується . :)

Приклад використання завантажувальної програми:

<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

Якщо ви зробите зображення фоновим зображенням div у CSS, коли для цього div встановлено значення "display: none", зображення не завантажується.

Просто розширюється рішення Brent.

Ви можете зробити наступне для чистого 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">

Зображення завантажуватиметься лише тоді, коли спрацьовує медіа-запит, прив’язаний до видимого lg-блоку, і на дисплеї: жодне не змінено на показ: блок. Прозорий png використовується для того, щоб браузер міг встановити відповідні співвідношення висоти: ширини для вашого блоку <img> (і, отже, фонового зображення) у флюїдному дизайні (висота: авто; ширина: 100%).

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

Отже, ви отримуєте щось подібне до трьох різних оглядів:

<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, а потім завантажте порожній svg в атрибут src. Тепер ви можете встановити свою URL-адресу для зображення як стиль вбудованого вмісту: url ("посилання на ваше зображення"). Тепер загортайте свій тег 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;
      }
    }

Встановіть обгортку, щоб вона не відображалася на точці розриву, куди ви не хочете завантажувати зображення. Вбудований css тег img тепер ігнорується, оскільки стиль елемента, загорнутого в обгортку з дисплеєм, ніхто не буде ігноруватися, тому зображення не завантажується, поки ви не досягнете точки розриву, де в обгортці є блок відображення.

Там ви дійсно простий спосіб не завантажувати зображення на мобільну точку розриву :)

Ознайомтеся з цим кодовим кодом для прикладу роботи: http://codepen.io/fennefoss/pen/jmXjvo


Мені подобається, як Інтернет постійно розвивається, раніше цього фокусу не бачив, використовуючи content-провідність для зміни зображеного зображення, тобто. Чи можете ви дати кілька статистичних даних щодо сумісності щодо цього?
Windgazer

До поганого про Edge: /, принаймні, він працює в останніх версіях Firefox, Chome та Safari.
Міккель Феннефосс

2

Ні. Зображення буде завантажено, як зазвичай, і все ще використовуватиме пропускну здатність користувача, якщо ви розглядаєте можливість збереження пропускної здатності користувача мобільного телефону. Що ви можете зробити, це використовувати медіа-запит і фільтрувати пристрої, на які ви хочете завантажувати ваше зображення. зображення має бути встановлене як фонове зображення div та ін., а НЕ тег, оскільки тег зображення завантажить зображення незалежно від розміру екрана та медіа-запиту.


1

Інша можливість - використання <noscript>тегу та розміщення зображення всередині <noscript>тегу. Потім використовуйте javascript для видаленняnoscript тегу в міру необхідності зображення. Таким чином ви можете завантажувати зображення на вимогу, використовуючи прогресивне вдосконалення.

Скористайтеся цим поліфілом, про який я писав, щоб прочитати вміст <noscript> тегів у IE8

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


1

Використовуйте @media запит 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 (мінімальна ширина: 400 пікселів) {background-image: thing.jpg}

Чи не було б воно тоді лише шукати зображення вище певної ширини екрана?


-2

Хитрість використання дисплея: жоден із зображеннями - присвоїти їм ідентифікатор. Це було не так багато коду, необхідного для його роботи. Ось приклад використання медіа-запитів та 3 таблиць стилів. Один для телефону, один для планшета та один для робочого столу. У мене є 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 #, завдяки якому він працює:

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на зображення. Це: чи "дисплей: ні" не дозволяє завантажувати зображення?
Євгенія Манолова
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.