Я попытался установить alt = "" и установить фоновое изображение, чтобы бросить CSS вживую: {background: url (src), width: ...; высота: ..} но это не так. Мой тег img должен скрыться, тогда src не работает.
У CSS / HTML нет возможности узнать, не является ли изображение неработающей ссылкой, поэтому вам придется использовать JavaScript независимо от того, что
Но вот минимальный способ либо скрыть образ, либо заменить источник резервной копией.
Вы можете сделать это с помощью HTML только с помощью тега объекта, так как он может использоваться для отображения изображений так же, как тег img, и не отображает неработающую ссылку, если изображение не существует, он работает во всех браузерах и даже в далеком прошлом. Поскольку IE8 сам по себе, вы даже можете использовать изображения по умолчанию с этим методом, я опубликовал ответ с деталями ниже.
Ник Стил
1
Это сработало для меня вместо подхода <object>, потому что мне нужно, чтобы изображение имело объявленное поле, но только если было найдено правильное изображение, в противном случае мне нужно, чтобы оно занимало нулевое пространство. У <object> нет события onerror, так что это было невозможно. Правило стиля для удаления поля с использованием псевдокласса: empty никогда не срабатывало на объекте.
Джон Хаттон,
У меня есть вопрос. есть ли способ дать сценарию общее правило для применения к каждому тегу изображения на странице вместо указания этой конкретной строки сценария в каждом теге изображения. спасибо @Kevin jantzer
Лемдор
1
@Lemdor - да, вам нужно будет найти изображения под нагрузкой и прикрепить общую функцию к каждому. Вы можете использовать jQuery или vanilla JS для этого (я обновил свой ответ примером)
Кевин Джанцер
В реакции это очень легко сделать, там применяется тот же принцип. Нашел этот урок здесь - youtu.be/90P1_xCaim4 . Также добавление preloader ( youtu.be/GBHBjv6xfY4 ) для изображения скрывает переход и помогает обеспечить хороший UX.
Прем
143
Несмотря на то, что люди говорят здесь, вам вообще не нужен JavaScript, вам даже не нужен CSS !!
Это на самом деле очень выполнимо и просто только с HTML. Вы даже можете показать изображение по умолчанию, если изображение не загружается . Вот как...
Это также работает во всех браузерах, даже начиная с IE8 (из 250 000+ посетителей сайтов, которые я принимал в сентябре 2015 года, пользователи ZERO использовали что-то хуже, чем IE8, что означает, что это решение работает буквально для всего ).
Шаг 1: Ссылка на изображение как объект, а не img . Когда объекты терпят неудачу, они не показывают сломанные значки; они просто ничего не делают. Начиная с IE8, вы можете использовать теги Object и Img взаимозаменяемо. Вы можете изменить размер и сделать все великолепные вещи, которые вы можете с обычными изображениями тоже. Не бойтесь тега объекта; это просто тег, ничего большого и громоздкого не загружается и ничего не тормозит. Вы просто будете использовать тег img под другим именем. Тест скорости показывает, что они используются одинаково.
Шаг 2: (Необязательно, но потрясающе) Вставьте изображение по умолчанию внутри этого объекта. Если нужное изображение действительно загружается в объект , изображение по умолчанию отображаться не будет. Так, например, вы могли бы показать список пользовательских аватаров, и если у кого-то еще нет изображения на сервере, он мог бы показать изображение заполнителя ... никакой JavaScript или CSS не требуется вообще, но вы получаете возможности того, что принимает большинство людей JavaScript.
Каким-то образом я полностью упустил эту идею, когда она так очевидна в ретроспективе! К сожалению, я не думаю, что тег объекта может изящно обрабатывать адаптивные изображения, как мы начинаем видеть в свойстве img.srcset :(
Windgazer
2
Отличная идея, спасибо за это! С другой стороны, тег объекта блокирует колесо прокрутки (по крайней мере, в моей реализации) ... если это происходит с вами, просто используйте object { pointer-events: none; }в своем CSS (Источник: stackoverflow.com/a/16534300 )
DHainzl
4
Однако это нарушает семантику тегов изображений. Я не знаю, понравится ли поисковым системам использование <object>тегов вместо <img>тегов. Является ли этот подход HTML5-совместимым и корректно отображается во всех основных браузерах?
Питер
6
Он совместим с HTML4 (совместим с 1997 года) и корректно отображается во всех основных браузерах начиная с IE8 / 2009 (другие браузеры делали это намного раньше). Если поисковая система не понимает, что объект с типом изображения - это изображение, у него было 19 лет, чтобы наверстать упущенное, так что это, вероятно, не очень хороший двигатель ... Подростки, которые ездят на автомобилях, теперь не были даже задумано, когда это решение соответствует спецификациям ... Как далеко вы хотите вернуться? :) Это надежное решение.
Ник Стил
6
@MonsterMMORPG, потому что он не использует JavaScript, и вам не всегда разрешено (например, в теле сообщения электронной почты).
img {position: relative;}/* style this to fit your needs *//* and remove [alt] to apply to all images*/
img[alt]:after {display: block;position: absolute;top:0;left:0;width:100%;height:100%;background-color:#fff;font-family:'Helvetica';font-weight:300;line-height:2;text-align: center;content: attr(alt);}
Отличное решение, использующее CSS, которое должно быть принятым ответом. Ссылка на статью устарела, поскольку поддержка браузеров теперь составляет 97,87%: caniuse.com/#feat=css-gencontent .
holm50
1
В связанной статье содержится отличное объяснение того, как браузеры обрабатывают изображения, но имейте в виду, что это решение работает только в том случае, если у вас сплошной фон и вы хотите покрыть все другим блоком того же сплошного цвета или другим изображением. Это решение на самом деле не удаляет и не скрывает значок разбитого изображения, оно просто закрывает его.
Клаудио Флореани
3
На Chrome 70 он показывает птицу + значок с разбитым изображением :(
Саймон Арнольд,
2
^ То же самое на Firefox 63
беспокойный
1
@dailysleaze - в Firefox 64+ это перемещено в img[alt]::before. Вы можете использовать, display:inline-blockесли хотите, так как он ближе к оригиналу.
Адам Кац
41
Если вы добавите alt с текстом alt = "abc", он покажет миниатюру показа поврежденных файлов и alt сообщение abc.
<imgsrc="pic_trulli.jpg"alt="abc"/>
Если вы не добавите Alt, то покажет миниатюру шоу.
<imgsrc="pic_trulli.jpg"/>
Если вы хотите скрыть поврежденный файл, просто добавьте alt = "", он не будет отображать поврежденный эскиз и любое сообщение alt (без использования js)
<imgsrc="pic_trulli.jpg"alt=""/>
Если вы хотите скрыть сломанный, просто добавьте alt = "" & onerror = "this.style.display = 'none'", он не будет отображать поврежденный эскиз и какое-либо сообщение alt (с js)
В-четвертых, это немного опасно (не совсем), если вы хотите добавить какое-либо изображение в событие onerror, оно не будет отображаться, даже если Image существует в виде style.display, как при добавлении. Таким образом, используйте его, когда вам не нужно альтернативное изображение для отображения.
display:'none';// in css
Если мы дадим его в CSS, то элемент не будет отображаться (например, image, iframe, div и т. Д.).
Если вы хотите отобразить изображение и вы хотите отобразить полностью пустое пространство в случае ошибки, вы можете использовать, но также будьте осторожны, это не займет никакого места. Таким образом, вы должны держать его в div
ДА! Просто добавь alt=""! Это буквально это! Спасибо. Так рада, что прокрутила до конца страницы. Я использую ленивую загрузку, и изображения в кадре, которые еще не загружены (потому что браузер ошибочно считает, что область просмотра еще не прокрутила их), отображаются как поврежденные изображения. Немного свитка, и они появляются снова. Разбитые изображения на их месте были такими уродливыми
velkoon
25
Я думаю, что самый простой способ - скрыть значок разбитого изображения с помощью свойства text-indent.
img {
text-indent:-10000px}
Очевидно, это не сработает, если вы хотите увидеть атрибут «alt».
в случае, если вы хотите сохранить / использовать изображение в качестве заполнителя, вы можете изменить непрозрачность до 0 с помощью ошибки onerror и некоторого CSS, чтобы установить размер изображения. Таким образом, вы не увидите неработающую ссылку, но страница загрузится как обычно.
Мне понравился ответ на Ника и играл вокруг с этим решением. Нашел более чистый метод. Поскольку псевдо: :: before / :: after не работают с заменяемыми элементами, такими как img и object, они будут работать только в том случае, если данные объекта (src) не загружены. Он сохраняет HTML-код более чистым и добавляет псевдо, только если объект не загружается.
Если вам все еще нужно видеть контейнер с изображениями из-за того, что он будет заполнен позже, и вы не хотите показывать и скрывать его, вы можете вставить прозрачное изображение 1x1 внутри src:
Я использовал это для этой конкретной цели. У меня был контейнер изображений, который собирался загрузить изображение через Ajax. Поскольку изображение было большим и потребовало немного времени для загрузки, требовалось установить background-image в CSS панели загрузки Gif.
Однако из-за того, что src был пуст, значок неработающего изображения все еще появлялся в браузерах, которые его используют.
Установка прозрачного GIF 1x1 решает эту проблему просто и эффективно без добавления кода через CSS или JavaScript.
img[alt]::beforeтакже работает в Firefox 64 (хотя когда-то это было img[alt]::afterтак, что это не надежно). Я не могу заставить кого-то из них работать в Chrome 71.
Интересно ... знаете ли вы, если Chrome имеет подобный псевдокласс?
1000 Гбит / с
1
@ 1000 Гбит / с - я не смог найти его, когда сделал этот ответ, и не могу найти его сейчас, по крайней мере, с помощью быстрых веб-запросов и просмотра ошибки 11011 в mozilla . На самом деле вы могли бы запросить такую вещь в Chromium (апстрим для Chrome), если хотите, но, поскольку это нестандартно, нет уверенности, что они это сделают.
Адам Кац
Я очень сомневаюсь, что они сделают это за короткое время, учитывая, что им было трудно справиться с некоторыми неприятными ошибками, о которых я там сообщал ... Независимо от того, что встроенные псевдоклассы, подобные этому, будут удалены из в фреймворках много JS-кода, написанного по той же причине
1000Gbps
2
Вы можете следовать по этому пути в качестве решения CSS
Сначала я думал, что это хорошее решение, но это не работает в IE. Также не при добавлении отображения блока в после CSS
Гленн Франке
1
Отсутствующие изображения либо просто ничего не отобразят, либо отобразят [? ] поле стиля, когда их источник не может быть найден. Вместо этого вы можете заменить это графическим изображением «отсутствующего изображения», которое, как вы уверены, существует, поэтому существует лучшая визуальная обратная связь, если что-то не так. Или вы можете скрыть это целиком. Это возможно, потому что изображения, которые браузер не может найти, запускают событие JavaScript «ошибка», которое мы можем наблюдать.
//Replace source
$('img').error(function(){
$(this).attr('src','missing.png');});//Or, hide them
$("img").error(function(){
$(this).hide();});
Кроме того, вы можете захотеть инициировать какое-либо действие Ajax, чтобы отправить электронное письмо администратору сайта, когда это произойдет.
Основной и очень простой способ сделать это без какого-либо требуемого кода - просто предоставить пустой оператор alt. Браузер вернет изображение как пустое. Это выглядело бы так, как если бы изображения там не было.
Это зависит от браузера. В Chrome у вас все еще будут рамка с изображением и значок разорванного изображения в дополнение к (здесь пустому) альтернативному тексту.
Panzi
Если изображение носит декоративный характер и не является обязательным для содержимого, пустое значение alt вполне подойдет. На самом деле это рекомендовано более чем вообще. В противном случае это крайне нежелательно. Разбитое изображение - это изображение, которое невозможно увидеть, но если у него есть alt-тег, его все равно можно услышать. Если вы уберете тег alt, он не будет виден или услышан.
JP DeVries
2
@panzi Я протестировал решение, и похоже, что Chrome изменил свое поведение. Он не будет отображать значок сломанного изображения, если alt="". То же самое касается Firefox.
Филипп Миттерер
-4
Для будущих гуглеров, в 2016 году в браузере есть безопасный чистый CSS способ скрытия пустых изображений с помощью селектора атрибутов:
img[src="Error.src"]{
display: none;}
Изменить: я вернулся - для будущих Google, в 2019 году есть способ стилизации фактического текста alt и изображения текста alt в Shadow Dom, но он работает только в инструментах разработчика. Таким образом, вы не можете использовать это. Сожалею. Это было бы так мило.
Ответы:
У CSS / HTML нет возможности узнать, не является ли изображение неработающей ссылкой, поэтому вам придется использовать JavaScript независимо от того, что
Но вот минимальный способ либо скрыть образ, либо заменить источник резервной копией.
или
Обновить
Вы можете применить эту логику к нескольким изображениям одновременно, выполнив что-то вроде этого:
Обновление 2
Для варианта CSS см . Ответ michalzuber ниже. Вы не можете скрыть все изображение, но вы изменяете, как выглядит сломанный значок.
источник
Несмотря на то, что люди говорят здесь, вам вообще не нужен JavaScript, вам даже не нужен CSS !!
Это на самом деле очень выполнимо и просто только с HTML. Вы даже можете показать изображение по умолчанию, если изображение не загружается . Вот как...
Это также работает во всех браузерах, даже начиная с IE8 (из 250 000+ посетителей сайтов, которые я принимал в сентябре 2015 года, пользователи ZERO использовали что-то хуже, чем IE8, что означает, что это решение работает буквально для всего ).
Шаг 1: Ссылка на изображение как объект, а не img . Когда объекты терпят неудачу, они не показывают сломанные значки; они просто ничего не делают. Начиная с IE8, вы можете использовать теги Object и Img взаимозаменяемо. Вы можете изменить размер и сделать все великолепные вещи, которые вы можете с обычными изображениями тоже. Не бойтесь тега объекта; это просто тег, ничего большого и громоздкого не загружается и ничего не тормозит. Вы просто будете использовать тег img под другим именем. Тест скорости показывает, что они используются одинаково.
Шаг 2: (Необязательно, но потрясающе) Вставьте изображение по умолчанию внутри этого объекта. Если нужное изображение действительно загружается в объект , изображение по умолчанию отображаться не будет. Так, например, вы могли бы показать список пользовательских аватаров, и если у кого-то еще нет изображения на сервере, он мог бы показать изображение заполнителя ... никакой JavaScript или CSS не требуется вообще, но вы получаете возможности того, что принимает большинство людей JavaScript.
Вот код ...
... Да, это так просто.
Если вы хотите реализовать изображения по умолчанию с помощью CSS, вы можете сделать это еще проще в своем HTML, как это ...
... и просто добавьте CSS из этого ответа -> https://stackoverflow.com/a/32928240/3196360
источник
object { pointer-events: none; }
в своем CSS (Источник: stackoverflow.com/a/16534300 )<object>
тегов вместо<img>
тегов. Является ли этот подход HTML5-совместимым и корректно отображается во всех основных браузерах?Нашел отличное решение на https://bitsofco.de/styling-broken-images/
источник
img[alt]::before
. Вы можете использовать,display:inline-block
если хотите, так как он ближе к оригиналу.Если вы добавите alt с текстом alt = "abc", он покажет миниатюру показа поврежденных файлов и alt сообщение abc.
Если вы не добавите Alt, то покажет миниатюру шоу.
Если вы хотите скрыть поврежденный файл, просто добавьте alt = "", он не будет отображать поврежденный эскиз и любое сообщение alt (без использования js)
Если вы хотите скрыть сломанный, просто добавьте alt = "" & onerror = "this.style.display = 'none'", он не будет отображать поврежденный эскиз и какое-либо сообщение alt (с js)
В-четвертых, это немного опасно (не совсем), если вы хотите добавить какое-либо изображение в событие onerror, оно не будет отображаться, даже если Image существует в виде style.display, как при добавлении. Таким образом, используйте его, когда вам не нужно альтернативное изображение для отображения.
Если мы дадим его в CSS, то элемент не будет отображаться (например, image, iframe, div и т. Д.).
Если вы хотите отобразить изображение и вы хотите отобразить полностью пустое пространство в случае ошибки, вы можете использовать, но также будьте осторожны, это не займет никакого места. Таким образом, вы должны держать его в div
Ссылка https://jsfiddle.net/02d9yshw/
источник
alt=""
! Это буквально это! Спасибо. Так рада, что прокрутила до конца страницы. Я использую ленивую загрузку, и изображения в кадре, которые еще не загружены (потому что браузер ошибочно считает, что область просмотра еще не прокрутила их), отображаются как поврежденные изображения. Немного свитка, и они появляются снова. Разбитые изображения на их месте были такими уродливымиЯ думаю, что самый простой способ - скрыть значок разбитого изображения с помощью свойства text-indent.
Очевидно, это не сработает, если вы хотите увидеть атрибут «alt».
источник
в случае, если вы хотите сохранить / использовать изображение в качестве заполнителя, вы можете изменить непрозрачность до 0 с помощью ошибки onerror и некоторого CSS, чтобы установить размер изображения. Таким образом, вы не увидите неработающую ссылку, но страница загрузится как обычно.
источник
Мне понравился ответ на Ника и играл вокруг с этим решением. Нашел более чистый метод. Поскольку псевдо: :: before / :: after не работают с заменяемыми элементами, такими как img и object, они будут работать только в том случае, если данные объекта (src) не загружены. Он сохраняет HTML-код более чистым и добавляет псевдо, только если объект не загружается.
источник
Если вам все еще нужно видеть контейнер с изображениями из-за того, что он будет заполнен позже, и вы не хотите показывать и скрывать его, вы можете вставить прозрачное изображение 1x1 внутри src:
<img id="active-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
Я использовал это для этой конкретной цели. У меня был контейнер изображений, который собирался загрузить изображение через Ajax. Поскольку изображение было большим и потребовало немного времени для загрузки, требовалось установить background-image в CSS панели загрузки Gif.
Однако из-за того, что src был пуст, значок неработающего изображения все еще появлялся в браузерах, которые его используют.
Установка прозрачного GIF 1x1 решает эту проблему просто и эффективно без добавления кода через CSS или JavaScript.
источник
Использовать только CSS сложно, но вы можете использовать CSS
background-image
вместо<img>
тегов ...Что-то вроде этого:
HTML
CSS
Вот рабочая скрипка .
Примечание: я добавил границу в CSS на скрипке, чтобы продемонстрировать, где будет изображение.
источник
Используйте тег объекта. Добавьте альтернативный текст между тегами следующим образом:
http://www.w3schools.com/tags/tag_object.asp
источник
С 2005 года браузеры Mozilla, такие как Firefox, поддерживают нестандартный
:-moz-broken
псевдокласс CSS, который может выполнить именно этот запрос:img[alt]::before
также работает в Firefox 64 (хотя когда-то это былоimg[alt]::after
так, что это не надежно). Я не могу заставить кого-то из них работать в Chrome 71.источник
Вы можете следовать по этому пути в качестве решения CSS
источник
Отсутствующие изображения либо просто ничего не отобразят, либо отобразят [? ] поле стиля, когда их источник не может быть найден. Вместо этого вы можете заменить это графическим изображением «отсутствующего изображения», которое, как вы уверены, существует, поэтому существует лучшая визуальная обратная связь, если что-то не так. Или вы можете скрыть это целиком. Это возможно, потому что изображения, которые браузер не может найти, запускают событие JavaScript «ошибка», которое мы можем наблюдать.
Кроме того, вы можете захотеть инициировать какое-либо действие Ajax, чтобы отправить электронное письмо администратору сайта, когда это произойдет.
источник
Трюк с
img::after
хороша, но имеет как минимум 2 недостатка:Я не знаю универсального решения без JavaScript, но для Firefox есть только одно:
источник
В React работает та же идея, что и у других:
источник
Основной и очень простой способ сделать это без какого-либо требуемого кода - просто предоставить пустой оператор alt. Браузер вернет изображение как пустое. Это выглядело бы так, как если бы изображения там не было.
Пример:
Попробуйте, чтобы увидеть!
;)
источник
alt=""
. То же самое касается Firefox.Для будущих гуглеров, в 2016 году в браузере есть безопасный чистый CSS способ скрытия пустых изображений с помощью селектора атрибутов:
Изменить: я вернулся - для будущих Google, в 2019 году есть способ стилизации фактического текста alt и изображения текста alt в Shadow Dom, но он работает только в инструментах разработчика. Таким образом, вы не можете использовать это. Сожалею. Это было бы так мило.
источник
img[src=''] { display: none; }
Это снова стало актуальным для шаблонов eBay html only