Когда использовать IMG против CSS background-image?

777

В каких ситуациях более целесообразно использовать HTML- IMGтег для отображения изображения, а не CSS-код background-imageи наоборот?

Факторы могут включать в себя доступность, поддержку браузера, динамический контент или любые технические ограничения или принципы юзабилити.

системная ПАУЗА
источник
Вам нужно изображение, чтобы занять место, или вы хотите написать поверх него?
geowa4
9
В качестве обновления, поскольку в Google это занимает довольно высокое место, теперь возможно масштабирование в браузере и растяжение изображения для background-image, и оно довольно широко поддерживается (конечно, IE8 и ниже, исключение), рендеринг пунктов 4 и 7 в случаях это может позволить откат или игнорировать такой эффект для IE8 и ниже. caniuse.com/#search=background-image
Шона
отличный и полезный пост, я добавлю вопрос для сравнения, преимущество css также в эффектах наведения? это можно воспроизвести с помощью тегов img?
ericosg
Я обычно добавляю атрибут alt и атрибут title ко всем изображениям контента. Разве это не предпочтительно?
HartleySan
2
Также img может иметь карту с интерактивными областями и подсказками
Vitim.us

Ответы:

797

Правильное использование IMG

  1. Используйте, IMGесли вы хотите, чтобы люди печатали вашу страницу, и вы хотите, чтобы изображение было включено по умолчанию. - JayTee
  2. Используйте IMGaltтекстом), когда изображение имеет важное семантическое значение, например значок предупреждения . Это гарантирует, что значение изображения может быть передано во всех пользовательских агентах, включая программы чтения с экрана.

Прагматическое использование IMG

  1. Используйте IMGатрибут плюс alt, если изображение является частью содержимого, такого как логотип, диаграмма или человек (реальный человек, а не люди с фотографиями). - sanchothefat
  2. Используйте, IMGесли вы полагаетесь на масштабирование в браузере для рендеринга изображения пропорционально размеру текста.
  3. Используйте IMG для нескольких наложенных изображений в IE6 .
  4. Используйте IMGс z-index, чтобы растянуть фоновое изображение, чтобы заполнить все его окно.
    Обратите внимание, что это больше не относится к CSS3 background-size; см. № 6 ниже.
  5. Использование imgвместо background-imageможет значительно улучшить производительность анимации на фоне.

Когда использовать CSS background-image

  1. Используйте фоновые изображения CSS, если изображение не является частью содержимого . - sanchothefat
  2. Используйте CSS фоновые изображения при замене текста, например. пункты / заголовки. - sanchothefat
  3. Используйте, background-imageесли вы хотите, чтобы люди печатали вашу страницу, и вы не хотите, чтобы изображение было включено по умолчанию. - JayTee
  4. Используйте, background-imageесли вам нужно улучшить время загрузки, как со спрайтами CSS .
  5. Используйте, background-imageесли вам нужно, чтобы была видна только часть изображения, как со спрайтами CSS.
  6. Используйте background-imageс background-size:cover, чтобы растянуть фоновое изображение, чтобы заполнить все его окно.
системная пауза
источник
3
Я все еще сомневаюсь в фоновых изображениях для замены текста. Я вижу людей, использующих фоновые изображения, а затем текст-отступ: -9999px для текста. Однако я знаю, что подобные текстовые отступы были плохими для SEO, и я полагаю, что это должно быть для некоторых поисковых систем. Но самое главное, если вы выключаете изображения, но оставляете css на изображении, оно исчезает, но текст все еще остается за кадром. Насколько мне известно, альтернативный текст на изображении предназначен, если изображения не отображаются, поэтому теги img лучше.
Скотт Рид
53
Прагматичное использование изображения заднего фона : когда вы не хотите терять волосы из-за проблем с вертикальным центрированием (изображений разного размера по вертикали);)
Фрэнк Нок
12
Да, проблемы с вертикальным центрированием - принесите Flexbox!
Dean_Wilson
3
@BinaryFunt - таким <div class="my-css-page-styles" style="background-image:url(blah.png);"></div>образом вы можете стилизовать его в своей таблице стилей CSS, но если фоновое изображение - это больше вопрос содержания, чем стиля, то вы все равно редактируете его со стороны HTML.
Джимбо Джонни
2
Похоже, что в пятом пункте прагматического использования IMG есть приманка для кликов, указывающая на японский блог о косметике. ссылка: www.ajaxline.com/browsers-performance-in-dependence-of-html-coding [ЭТО НЕ
НАЖИМАЙТЕ
292

Это черно-белое решение для меня. Если изображение является частью содержимого, такого как логотип, диаграмма или человек (реальный человек, а не люди с фотографиями), используйте <img />атрибут tag плюс alt. Для всего остального есть CSS фоновые изображения.

Другой раз, чтобы использовать фоновые изображения CSS, когда вы делаете замену текста, например. пункты / заголовки.

roborourke
источник
Отличный случай! CON - использовать background-image при выполнении замены текста в изображении.
система PAUSE
2
Это справедливо, но, конечно, для замены текста текста (например, заголовка) потребуется добавить «alt», чтобы программы чтения с экрана могли его прочитать? Или, если изображения не отображаются, вы все равно получаете заголовок? Да, заголовок, а затем стиль будет лучше, но, конечно, вы хотите текст?
Тео Сколядис,
4
@TheoScholiadis использование замены изображения означает не использование изображения вместо текста, а скрытие текста каким-либо образом с использованием CSS и предоставление изображения в качестве фона с помощью CSS. Документ остается семантически нетронутым.
roborourke
57
Лично я ненавижу, когда не могу скопировать «текст», потому что на самом деле это изображение. Зовите меня ленивым, но эй ...
Shaz
1
Когда вам нужно изображение для SEO, используйте тег img с атрибутом alt. В противном случае используйте изображение в фоновом режиме, используя CSS.
Супер модель
107

Я удивлен, что никто еще не упомянул это: переходы CSS .

Вы можете изначально перенести divфоновое изображение:

#some_div {
    background-image:url(image_1.jpg);
    -webkit-transition:background-image 0.5s;
    /* Other vendor-prefixed transition properties */
    transition:background-image 0.5s;
}

#some_div:hover {
    background-image:url(image_2.jpg);
}

Это экономит любые JavaScript или JQuery анимации выцветает <img/>«S src.

Больше информации о переходах на MDN .

Robbie JW
источник
3
Это не веская причина. Вы могли бы DIV с 2 наложенными изображениями, и следующий CSS: #some_div { transition: opacity 0.5s; }, #some_div:hover #top_img { opacity: 0; }
warkentien2
5
Если вы прочтете эту связанную статью MDN (или спецификации w3c), вы обнаружите, что background-image НЕ является одним из свойств, которые можно анимировать, и любой браузер, который делает это (chrome), не соответствует веб-стандартам. Тем не менее, я думаю, что так и должно быть, и это приятный легкий эффект, поэтому я разочарован тем, что он не является частью стандарта.
Роберт Макки
73

Над ответами рассматривается только аспект дизайна. Я перечисляю это в аспектах SEO.

Когда использовать <img />

  1. Когда ваше изображение должно быть проиндексировано поисковой системой
  2. Если это имеет отношение к содержанию, а не к дизайну.
  3. Если ваше изображение не слишком маленькое (не знаковые изображения).
  4. Изображения, где вы можете добавить altи titleприписать.
  5. Изображения с веб-страницы, которую вы хотите распечатать, используя печатные СМИ CSS

Когда использовать CSS background-image

  1. Изображения, используемые исключительно для дизайна.
  2. Нет связи с контентом.
  3. Маленькие изображения, которые мы можем играть с CSS3.
  4. Повторяющиеся изображения (в значке автора блога значок даты будет повторяться для каждой статьи и т. Д.).

Как я буду использовать их на основании этих причин. Это хорошие практики поисковой оптимизации изображений.

subhash
источник
54

Браузеры не всегда настроены на печать фоновых изображений по умолчанию; если вы хотите, чтобы люди печатали вашу страницу :)

Джейти
источник
9
Звучит так: PRO - используйте IMG, если вы хотите, чтобы изображение печаталось по умолчанию. CON - Используйте background-image, если вы не хотите, чтобы изображение печаталось по умолчанию. Хороший!
система PAUSE
7
Я думаю, что идея состоит в том, чтобы иметь отдельные стили CSS только для печати, которые скрывают изображения или изменяют их на что-то более подходящее.
Blazemonger
52

Если у вас есть CSS во внешнем файле, то часто удобно отображать изображение, которое часто используется на сайте (например, изображение заголовка), в качестве фонового изображения, потому что тогда у вас есть возможность изменить изображение позже.

Например, скажем, у вас есть следующий HTML:

<div id="headerImage"></div>

... и CSS:

#headerImage {
    width: 200px;
    height: 100px;
    background: url(Images/headerImage.png) no-repeat;
}

Через несколько дней вы меняете расположение изображения. Все, что вам нужно сделать, это обновить CSS:

#headerImage {
    width: 200px;
    height: 100px;
    background: url(../resources/images/headerImage.png) no-repeat;
}

В противном случае вам придется обновлять srcатрибут соответствующего <img>тега в каждом файле HTML (при условии, что вы не используете серверный язык сценариев или CMS для автоматизации процесса).

Также фоновые изображения полезны, если вы не хотите, чтобы пользователь мог сохранить изображение (хотя мне никогда не требовалось это делать).

Стив Харрисон
источник
14
Фоновые изображения, безусловно, могут быть сохранены с минимальным наложением источника, но не так просто, как щелчок правой кнопкой мыши на изображении.
Майкл Хакнер
2
Fire Fox. Щелкните правой кнопкой мыши. Msgstr "Посмотреть фоновое изображение". Не так сложно
TRiG
1
@TRiG Если нет прозрачного наложения или специфичного для страницы изменения контекстного меню, чтобы помешать вам сделать это. Я видел это раньше, и, на мой взгляд, это довольно глупо, потому что вам даже не нужно разбираться в источнике, если страница полностью загружена, то, по крайней мере, в Firefox вы можете нажать Инструменты> Информация о странице / alt + t, i / щелкните правой кнопкой мыши и выберите «Просмотр информации о странице», перейдите в раздел «Медиа» и сохраните все нужные элементы из списка. Конечно, есть способы предотвратить даже это, такие как встраивание изображения в файл Flash или другие странные уловки, но даже они могут быть обойдены или учтены.
JAB
Я думаю, что фоновая техника не совсем хороша для того, чтобы
запретить
45

Примерно так же, как ответ Санчотефата , но с другой стороны. Я всегда спрашиваю себя: если бы я полностью удалил таблицы стилей с сайта, оставшиеся элементы относятся только к контенту? Если так, я хорошо выполнил свою работу.

viam0Zah
источник
42

Некоторые ответы усложняют сценарий здесь. Это очень простая ситуация.

Просто отвечайте на этот вопрос каждый раз, когда вы хотите разместить изображение:

Это часть контента или часть дизайна?

Если вы не можете ответить на этот вопрос, вы, вероятно, не знаете, что вы делаете или что вы хотите сделать!

Кроме того, НЕ рассматривайте эти две техники просто потому, что вы хотите быть «дружелюбными к принтеру» или нет. Также НЕ скрывайте контент с точки зрения SEO с помощью CSS. Если вы обнаружите, что управляете своим контентом в CSS-файлах, вы попали себе в ногу. Это просто тривиальное решение о том, что является контентом или нет. Любой другой аспект следует игнорировать.

Дын
источник
Мне нравится этот ответ. Это очень ясно. Остальные проблемы, такие как печать или SEO, должны рассматриваться индивидуально в каждом сценарии.
Хуан Эррера
28

Я бы добавил еще два аргумента:

  • IMG тег хорошо , если вам нужно изменить размер изображения. Например, если исходное изображение имеет размер 100 на 100 пикселей и вы хотите, чтобы оно было 80 на 80 пикселей, вы можете установить ширину CSS и высоту тега img. Я не знаю ни одного хорошего способа сделать это, используя background-image. РЕДАКТИРОВАТЬ: Теперь это также можно сделать с background-image, используя background-sizeатрибут CSS3.

  • Использование background-image хорошо, когда вам нужно динамически переключаться между спрайтами . Например, если у вас есть изображение кнопки и вы хотите, чтобы при наведении курсора на элемент отображалось отдельное изображение, вы можете использовать фоновое изображение, содержащее как нормальный, так и всплывающий спрайты, и динамически изменять положение фона.

Андерс Рабо Торбек
источник
2
Это действительно хороший ответ, особенно точка изменения размера. Люди будут утверждать, что вы можете использовать background-size, но если вы пытаетесь поддерживать старые браузеры, это не обязательно лучший путь.
dudewad
1
Вот как это делается в CSSbackground-size: 80px 80px;
Карим
2
Спасибо @ Карим. Я вижу, что это было введено с CSS3, который еще не существовал, когда я первоначально ответил. Я отредактировал свой ответ, чтобы отразить это.
Андерс Рабо Торбек
Я думаю, что важно отметить, что изменение размера фотографий может быть сложным с точки зрения пикселизации или интерполяции. Когда это возможно, я бы не изменил размер более чем на 40% (а это довольно много - стандартно 20%), не перенеся ваше изображение в программное обеспечение для обработки фотографий, чтобы оно было должным образом изменено без потери качества. Качество DPI может быть здесь важным, если недостаточно информации для растяжения и заполнения выделенного количества пикселей.
Дейл Лэндри
18

Еще одно преимущество использования тега <IMG> связано с SEO - то есть вы можете предоставить дополнительную информацию об изображении в атрибуте ALT тега изображения, в то время как нет возможности предоставить такую ​​информацию при указании изображения с помощью CSS и В этом случае поисковые системы могут индексировать только имя файла изображения. Атрибут ALT определенно дает SEO-тегу <IMG> преимущество перед подходом CSS. Вот почему, по моему мнению, лучше указывать изображения, которые вы хотите получить высокий рейтинг в результатах поиска изображений (например, Google Image Search), используя тег <IMG>.

Павел Владов
источник
Значения ALT background-images могут быть определены в карте сайта. google.com/schemas/sitemap-image/1.1
Карим
17

Передний план = img.

Фон = CSS фон.

Дальневосточные
источник
5
Конечно, но как насчет маленького индикатора со стрелкой вниз рядом с кнопкой «меню» или других подобных элементов. Как вы классифицируете это - передний план или фон?
dudewad
@dudewad Я бы сказал, передний план, потому что они (визуально) находятся в «верхнем» слое страницы, наложены на другие элементы.
jkdev
14

Используйте фоновые изображения только при необходимости, например, контейнеры с изображением, которое выложено плиткой.

Одним из основных ПРОФИ путем использования ИЗОБРАЖЕНИЙ , что это лучше для SEO .

Марк Уберштейн
источник
3
Возможно, потому что вы можете использовать атрибут alt.
Дэвид
4
Разве это не зависит от того, ХОТИТЕ ли вы SEO для этого конкретного изображения? Я не понимаю, почему вы выбрали SEO для изображения, которое является частью стиля страницы, а не для содержимого (например, значок электронной почты на странице контактов). Так что на самом деле, я бы лучше перевернул ваше заявление. Используйте ИЗОБРАЖЕНИЯ только при необходимости (связанные с контентом, печатью и / или SEO).
Волзи
12

Используя фоновое изображение, вам необходимо абсолютно точно указать размеры. Это может быть серьезной проблемой, если вы на самом деле не знаете их заранее или не можете их определить.

Большая проблема с <img />оверлеями. Что если я хочу использовать внутреннюю тень CSS на моем изображении ( box-shadow:inset 0 0 5px rgb(0,0,0,.5))? В этом случае, поскольку <img />не может иметь дочерних элементов, вам нужно использовать позиционирование и добавлять пустые элементы, что равносильно бесполезной разметке.

В заключение, это довольно ситуативный.

Mat
источник
11

Несколько других сценариев, где background-imageследует использовать:

  • Когда вы хотите, чтобы изображение изменилось, когда на него наведена мышь.
  • Когда вы хотите добавить закругленные углы к изображению. Если вы используете img, изображение вытекает из закругленных углов.
Бехранг
источник
Вы действительно можете сделать:img { border-radius: 10px; }
Раффф
@RafcioKowalsky вы правы. Не могу вспомнить точные условия, в которых border-radiusне работал.
Бехранг Саидзаде
10

Используйте CSS background-image в случае нескольких скинов или версий дизайна. Javascript может использоваться для динамического изменения класса элемента, что заставит его отображать другое изображение. С тэгом IMG это может быть сложнее.

MK_Dev
источник
Вы также можете динамически изменять атрибут src тега изображения, так же просто, как и изменение класса
roborourke
3
@sanchothefat, правда, однако, в этом случае источник изображения должен быть сохранен в JS вместо CSS. IMO файл CSS будет более подходящим для сохранения имени файла.
MK_Dev
7

Вот техническое соображение: будет ли изображение генерироваться динамически? Как правило, генерировать <img>тег в HTML гораздо проще, чем пытаться динамически редактировать свойство CSS.

Брайан М.
источник
1
А как насчет встроенных стилей? Этот вопрос действительно не должен решаться этой идеей.
viam0Zah
может быть, мне следует сформулировать это так: вы бы предпочли работать с элементом DOM или атрибутом элемента?
Брайан М.
вероятно стоит рассмотреть bacl в '09, но с jQuery это вряд ли проблема. Переключать CSS или классы на элементе даже проще и гибче, чем переключать элементы.
15:49
7

Как насчет размера изображения? Если я использую тег img, браузер масштабирует изображение. Если я использую CSS-фон, браузер просто вырезает кусок из большего изображения.


источник
7

Что касается анимации изображений с помощью CSS TranslateX / Y (правильный способ анимировать HTML) - если вы сделаете запись Chrome временной шкалы анимированных фоновых изображений CSS и анимированных тегов IMG, вы увидите, что время рисования для CSS значительно меньше. фон-изображения.

eivers88
источник
7

Есть еще одна причина! Если у вас адаптивный дизайн и вы хотите разделить использование изображений с низким, средним и высоким разрешением для устройств с помощью медиа-запросов, вам также следует использовать фоновые изображения.

Маартен
источник
1
Мартен, Терсхелинг - не труба, я слышал от Винсента Виллемса. Так как вы думаете, это может работать на PyMol
Мехди Неллен
1
Пожалуйста, ознакомьтесь с документацией о том, насколько пайплайт это pieterpeitshoeve.nl/rondleiding
Maarten
@ Maarteen, теперь я думаю, что это можно сделать с помощью HTML 5 рисунков и исходных тегов
Tick20
6

Кроме того, у меня есть раздел галереи с непоследовательными размерами изображений, поэтому, хотя эти изображения явно считаются содержимым, я использую фоновые изображения и центрирую их в элементах div с заданным размером. Это похоже на то, что делает Facebook в своих альбомах.

Крис
источник
6

img является html-тегом по причине, поэтому его следует использовать. Для ссылок или для иллюстрации вещей люди, например: в статьях.

Также, если изображение имеет смысл или должно быть кликабельно, img лучше, чем фон css . Для всех других ситуаций, я думаю, можно использовать фон CSS .

Хотя это тема, которую нужно обсуждать снова и снова.

Веб-студент из Парижа, Франция

user589956
источник
5

Просто добавьте небольшой тег, вы должны использовать тег img, если хотите, чтобы пользователи могли «щелкнуть правой кнопкой мыши» и «save-image» / «save-picture», поэтому если вы намереваетесь предоставить изображение в качестве ресурса для другие.

Использование фонового изображения (насколько я знаю в большинстве браузеров) отключит возможность сохранения изображения напрямую.

dougajmcdonald
источник
5

Небольшой ввод, у меня были проблемы с адаптивными изображениями, замедляющими рендеринг на iphone до минуты, даже с небольшими изображениями:

<!-- Was super slow -->
<div class="stuff">
    <img src=".." width="100%" />
</div>

Но при переходе на использование фоновых изображений проблема исчезла, это возможно только при использовании новых браузеров.

winthers
источник
Есть ли у вас поддержка или объяснение этого поведения?
Тодд
Извините, я понятия не имею, почему это приведет к замедлению страницы до ползания ... возможно, повторный поток в браузере на iphone имеет очень мало ресурсов.
winthers
4

IMGСначала загрузите, потому что он srcнаходится в самом html-файле, тогда как в случае background-imageисточника упоминается в таблице стилей, поэтому изображение загружается после загрузки таблицы стилей, что задерживает загрузку веб-страницы.

Sagi_Avinash_Varma
источник
Кроме того, некоторые браузеры (например, Firefox 35), кажется, background-imageчерез некоторое время обновляют CSS : если у вас открыто несколько вкладок, когда вы возвращаетесь на вкладку через некоторое время, фон CSS на некоторое время остается пустым.
Skippy le Grand Gourou
3

HTML для контента и CSS для дизайна. Нужно ли изображение, и должно ли оно быть снято программами чтения с экрана? Если ответ «да», поместите изображение в HTML. Если это чисто для стиля, то вы можете использовать свойство background-image в CSS для вставки изображения. Так же, как многие люди здесь уже упоминали, вы можете использовать псевдоэлемент на изображении, если хотите.

carltonstith
источник
3

Также обратите внимание, что большинство пауков поисковых систем не индексируют фоновые изображения CSS, поэтому фоновые изображения будут игнорироваться, и вы не сможете получать трафик от поисковых систем (короче говоря, никакой пользы для SEO).

Где, поскольку все изображения, определенные с помощью тегов, индексируются (если не исключены вручную) и могут приносить трафик от поисковых систем, если их атрибуты title / alt и имена файлов оптимизированы должным образом (по отношению к некоторым ключевым словам).

Надим Хан
источник
2

Вы можете использовать теги IMG, если хотите, чтобы изображения были плавными и масштабировались до разных размеров экрана. Для меня эти изображения в основном являются частью контента. Для большинства элементов, которые не являются частью содержимого, я использую спрайты CSS, чтобы сохранить минимальный размер загрузки, если я действительно не хочу анимировать значки и т. Д.

shingokko
источник
2

Я использую изображение вместо background-image, когда я хочу сделать их растягиваемыми на 100%, что поддерживается в большинстве браузеров.

Максимум
источник
2

Если вы хотите добавить изображение только для специального содержимого на странице или только для одной страницы, вам следует использовать тег IMG, а если вы хотите разместить изображение на нескольких страницах, вам следует использовать фоновое изображение CSS.

Вишал Гупта
источник
2

Другое background-image PRO: Фоновые изображения для <ul>/ <ol>списков.

Используйте фоновые изображения, если они являются частью общего дизайна и повторяются на нескольких страницах. Предпочтительно в фоновом виде спрайт для оптимизации.

Используйте теги для всех изображений, которые не являются частью общего дизайна и, скорее всего, размещены один раз, например, конкретные изображения для статей, людей и важные изображения, которые заслуживают добавления в изображения Google.

** Единственное повторяющееся изображение, которое я включаю в <img>тег, - это логотип сайта / компании. Поскольку люди, как правило, щелкают по нему, чтобы перейти на домашнюю страницу, таким образом, вы оборачиваете его <a>тегом.

Джилли
источник