Nasıl görüntü kırık Simge sadece CSS / HTML kullanarak gizlemek için?


194

Kırık görüntü simgesini nasıl gizleyebilirim? Örnek : Misal

Hata src ile bir görüntü var:

<img src="Error.src"/>

Çözüm tüm tarayıcılarda çalışmalıdır.


1
Alt = "" ayarlamayı denedim ve img teg arka plan atma CSS canlı olarak ayarladım: {background: url (src), width: ...; height: ..} ama bu doğru değil. İmg etiketim gizlenmeli, sonra src bozulur.
Geray Suinov

Olası bir çözüme buradan bakın - stackoverflow.com/questions/18484753/… ama yine de JS gerekiyor. Bunu sadece CSS ile yapamazsınız.
JohanVdR

Bkz. W3schools.com/jsref/event_onerror.asp "onerror" özelliği
Amy.js

Yanıtlar:


274

CSS / HTML'nin görüntünün bozuk olup olmadığını bilmesinin bir yolu yoktur, bu nedenle ne olursa olsun JavaScript kullanmanız gerekecek

Ancak, görüntüyü gizlemek veya kaynağı bir yedekle değiştirmek için minimal bir yöntem.

<img src="Error.src" onerror="this.style.display='none'"/>

veya

<img src="Error.src" onerror="this.src='fallback-img.jpg'"/>

Güncelleme

Aşağıdaki gibi bir şey yaparak bu mantığı aynı anda birden fazla görüntüye uygulayabilirsiniz:

document.addEventListener("DOMContentLoaded", function(event) {
   document.querySelectorAll('img').forEach(function(img){
  	img.onerror = function(){this.style.display='none';};
   })
});
<img src="error.src">
<img src="error.src">
<img src="error.src">
<img src="error.src">

Güncelleme 2

Bir CSS seçeneği için michalzuber'ın cevabına bakınız. Görüntünün tamamını gizleyemezsiniz, ancak bozuk simgenin görünümünü değiştirirsiniz.


3
HTML ile sadece nesne etiketini kullanarak yapabilirsiniz, çünkü img etiketi gibi görüntüleri görüntülemek için kullanılabilir ve görüntü yoksa bozuk bir bağlantı göstermez, tüm tarayıcılarda ve geri IE8 olarak tek başına, bu yöntemle varsayılan görüntüleri bile kullanabilirsiniz, aşağıdaki ayrıntılarla bir cevap gönderdim.
Nick Steele

1
Bu benim için <object> yaklaşımı yerine benim için çalıştı çünkü beyan edilen bir kenar boşluğu olması için görüntüye ihtiyacım vardı, ancak sadece geçerli bir görüntü bulunduğunda, aksi takdirde sıfır yer kaplaması gerekiyordu. <object> üzerinde bir olay yok, bu yüzden bu bir seçenek değildi. Boş bir sözde sınıf kullanarak kenar boşluğunu kaldırmak için bir stil kuralı hiçbir zaman nesnede tetiklenmedi.
John Hatton

Bir sorum var. her resim etiketinde bu belirli kod satırını vermek yerine, komut dosyasına sayfadaki her resim etiketi için uygulanacak ortak bir yol vermenin mümkün bir yolu var mı? Kevin jantzer
Lemdor

1
@Lemdor - evet, yükte görüntü bulmanız ve ortak işlevi her birine eklemeniz gerekir. Bunu yapmak için jQuery veya vanilya JS kullanabilirsiniz (Cevabımı bir örnekle güncelledim)
Kevin Jantzer

Reaksiyonlarda bunu yapmak çok kolaydır, orada aynı prensip geçerlidir. Bu eğitimi burada bulabilirsiniz - youtu.be/90P1_xCaim4 . Ayrıca görüntü için bir ön yükleyici ( youtu.be/GBHBjv6xfY4 ) eklemek geçişi gizler ve iyi bir UX sağlamaya yardımcı olur.
Prem

143

İnsanların burada söylediklerine rağmen, JavaScript'e hiç ihtiyacınız yok, CSS'ye bile ihtiyacınız yok !!

Aslında sadece HTML ile çok yapılabilir ve basit. Bir görüntü yüklenmezse varsayılan bir görüntü bile gösterebilirsiniz . İşte böyle ...

Bu aynı zamanda tüm tarayıcılarda da çalışır (IE8'e kadar bile olsa (Eylül 2015'te ev sahipliği yaptığım sitelere 250.000'den fazla ziyaretçiden, SIFIR insanlar IE8'den daha kötü bir şey kullandı, yani bu çözüm kelimenin tam anlamıyla her şey için çalışıyor ).

Adım 1: Görüntüyü img yerine bir nesne olarak referans alın . Nesneler başarısız olduğunda, kırık simgeler göstermezler; sadece hiçbir şey yapmıyorlar. IE8 ile başlayarak, Object ve Img etiketlerini birbirinin yerine kullanabilirsiniz. Düzenli görüntülerle de tüm görkemli şeyleri yeniden boyutlandırabilir ve yapabilirsiniz. Nesne etiketinden korkmayın; sadece bir etiket, büyük ve hantal hiçbir şey yüklenmiyor ve hiçbir şeyi yavaşlatmıyor. İmg etiketini başka bir adla kullanacaksınız. Bir hız testi bunların aynı şekilde kullanıldığını gösterir.

Adım 2: (İsteğe bağlı, ancak harika) Bu nesnenin içine varsayılan bir resim yapıştırın. İstediğiniz görüntü nesneye gerçekten yüklenirse , varsayılan görüntü gösterilmez. Örneğin, kullanıcı avatarlarının bir listesini gösterebilir ve birisinin sunucuda henüz bir resmi yoksa, yer tutucu görüntüsünü gösterebilir ... hiçbir javascript veya CSS gerekmez, ancak bunun özelliklerini alırsınız. çoğu kişiyi JavaScript alır.

İşte kod ...

<object data="avatar.jpg" type="image/jpg">
    <img src="default.jpg" />
</object>

... Evet, bu kadar basit.

Varsayılan görüntüleri CSS ile uygulamak istiyorsanız, HTML'nizde bunu daha da basitleştirebilirsiniz ...

<object class="avatar" data="user21.jpg" type="image/jpg"></object>

... ve CSS'yi bu yanıttan ekleyin -> https://stackoverflow.com/a/32928240/3196360


6
Bir şekilde bu fikri tamamen kaçırdım, geriye dönük olarak çok açık olduğunda! Ne yazık ki, nesne etiketinin img.srcset özelliğinde görmeye başladığımız gibi duyarlı görüntüleri nazikçe işleyebileceğini düşünmüyorum :(
Windgazer

2
Harika fikir, bunun için teşekkürler! Bir yan notta, nesne etiketi kaydırma tekerleğini engelliyor (en azından benim uygulamamda) ... bu size olursa, sadece object { pointer-events: none; }CSS'nizde kullanın (Kaynak: stackoverflow.com/a/16534300 )
DHainzl

4
Bu, resim etiketlerinin anlambilimini bozar. Arama motorlarının <object>etiket yerine etiket kullanımınızı beğenip beğenmeyeceğini bilmiyorum <img>. Bu yaklaşım HTML5 uyumlu mu ve tüm büyük tarayıcılar tarafından doğru bir şekilde oluşturuluyor mu?
Pieter

6
Bu HTML4 uyumludur (1997'den beri uyumludur) ve IE8 / 2009'dan bu yana tüm büyük tarayıcılar tarafından doğru bir şekilde oluşturulmaktadır (diğer tarayıcılar bunu çok daha önce yapmıştır). Bir arama motoru, görüntü türüne sahip bir nesneyi bir görüntü olarak anlamadıysa, spesifikasyona yetişmek için 19 yıl vardı, bu yüzden muhtemelen çok iyi bir motor değil ... bu çözüm teknik özellikleri karşıladığında bile düşünülmüş ... Ne kadar geriye gitmek istiyorsun? :) Bu kaya gibi sağlam bir çözüm.
Nick Steele

6
@MonsterMMORPG çünkü JavaScript kullanmıyor ve her zaman izin verilmiyor (örneğin, bir e-posta iletisinin gövdesinde).
ForNeVeR

63

Https://bitsofco.de/styling-broken-images/ adresinde harika bir çözüm buldum

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);
}
<img src="error">
<br>
<img src="broken" alt="A broken image">
<br>
<img src="https://images-na.ssl-images-amazon.com/images/I/218eLEn0fuL.png" alt="A bird" style="width: 120px">


1
Tamamen kabul edilen cevap olmalı CSS kullanarak harika bir çözüm. Tarayıcı desteği artık% 97,87 olduğu için bağlantı verilen makale eski: caniuse.com/#feat=css-gencontent .
holm50

1
Bağlantılı makale tarayıcılar görüntüler ele fakat bu çözüm sağlam bir altyapıya sahip durumunda çalışır unutmayın nasıl mükemmel bir açıklama vardır ve istediğiniz başka bir kutu ile kapak her şey aynı katı renkteki veya başka görüntü ile. Bu çözüm, kırık görüntü simgesini gerçekten kaldırmıyor veya gizlemiyor, sadece kaplıyor.
Claudio Floreani

3
Chrome 70'te, kuş + kırık bir görüntü simgesi gösterir :(
Simon Arnold

2
^ Aynı Firefox 63
dsturbid

1
@dailysleaze - Firefox 64 ve sonraki sürümlerinde bu işlem taşındı img[alt]::before. İsterseniz display:inline-blockorijinaline daha yakın olduğu için kullanabilirsiniz.
Adam Katz

41

Alt = "abc" metniyle alt ekleyecekseniz bozuk küçük resmi göster ve alt ilet abc

<img src="pic_trulli.jpg" alt="abc"/>

1 inci

Alt eklemezseniz, bozuk küçük resmi göster

<img src="pic_trulli.jpg"/>

2

Bozuk olanı gizlemek istiyorsanız, alt = "" ekleyin , bozuk küçük resim ve herhangi bir alt mesaj göstermez (js kullanmadan)

<img src="pic_trulli.jpg" alt=""/>

Bozuk olanı gizlemek istiyorsanız, alt = "" & onerror = "this.style.display = 'none'" ekleyin , bozuk küçük resim ve herhangi bir alt mesaj göstermez (js ile)

<img src="pic_trulli.jpg" alt="abc" onerror="this.style.display='none'"/>

Dördüncüsü biraz tehlikelidir (tam olarak değil), eğer hata olayına herhangi bir görüntü eklemek istiyorsanız, Görüntü stil olarak mevcut olsa bile görüntülenmez. Ekran ekleme gibidir. Bu nedenle, görüntülemek için alternatif bir görüntüye ihtiyacınız olmadığında kullanın.

display: 'none'; // in css

CSS'de verirsek, öğe görüntülenmez (resim, iframe, div gibi).

Resmi görüntülemek istiyorsanız ve hata durumunda tamamen boş alan görüntülemek istiyorsanız, kullanabilirsiniz, ancak bunun herhangi bir yer kaplamayacağına da dikkat edin. Yani, bir div içinde tutmak gerekir olabilir

Bağlantı https://jsfiddle.net/02d9yshw/


2
EVET! Sadece ekleyin alt=""! Kelimenin tam anlamıyla bu! Teşekkür ederim. Çok memnunum sayfanın altına kaydırdım. Tembel yükleme kullanıyorum ve henüz yüklenmemiş çerçeve içi görüntüler kullanıyorum (tarayıcı yanlışlıkla görünümün henüz onlara kaydırılmadığını düşünüyor) kırık görüntüler olarak gösterdi. Küçük bir kaydırma ve yeniden ortaya çıkıyorlar. Yerinde kırık görüntüler çok çirkin
velkoon

25

Bence en kolay yol, metin girintisi özelliğiyle kırık görüntü simgesini gizlemektir.

img {
    text-indent: -10000px
}

Açıkçası "alt" niteliğini görmek istiyorsanız işe yaramaz.


1
En kolay yol.
theerasan tonthongkam

17

görüntüyü yer tutucu olarak tutmak / buna ihtiyaç duymanız durumunda, görüntü boyutunu ayarlamak için bir hata ve bazı CSS ile opaklığı 0 olarak değiştirebilirsiniz. Bu şekilde bozuk bağlantıyı göremezsiniz, ancak sayfa normal şekilde yüklenir.

<img src="<your-image-link->" onerror="this.style.opacity='0'" />

img {
    width: 75px;
    height: 100px;
}

16

Ben sevdim cevabını tarafından Nick ve bu çözüm ile takılıyordum. Daha temiz bir yöntem buldum. :: before / :: after pseudos img ve object gibi değiştirilen öğeler üzerinde çalışmadığından, yalnızca nesne verileri (src) yüklenmemişse çalışırlar. HTML'yi daha temiz tutar ve yalnızca nesne yüklenemezse sözde ekler.

object {
  position: relative;
  float: left;
  display: block;
  width: 200px;
  height: 200px;
  margin-right: 20px;
  border: 1px solid black;
}
object::after {
  position: absolute;
  top: 0;
  left: 0;
  display: block;
  width: 100%;
  height: 100%;
  content: '';
  background: red url("http://placehold.it/200x200");
}
<object data="http://lorempixel.com/200/200/people/1" type="image/png"></object>

<object data="http://broken.img/url" type="image/png"></object>


9

Daha sonra doldurulması nedeniyle görüntü kabının görünür olması gerekiyorsa ve gösterme ve gizleme ile uğraşmak istemiyorsanız, src'nin içine 1x1 şeffaf bir görüntü yapıştırabilirsiniz:

<img id="active-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>

Bunu tam olarak bu amaçla kullandım. Ajax aracılığıyla içine bir resim yüklenecek bir resim kapsayıcı vardı. Görüntü büyük olduğundan ve yüklenmesi biraz zaman aldığından, bir Gif yükleme çubuğunun CSS'sinde bir arka plan resmi ayarlanması gerekiyordu.

Ancak, src öğesi boş olduğundan, bozuk resim simgesi onu kullanan tarayıcılarda görünmeye devam eder.

Şeffaf 1x1 Gif'in ayarlanması, CSS veya JavaScript aracılığıyla kod eklemeden bu sorunu basit ve etkili bir şekilde giderir.


diğerleri çalıştı sadece cevap beyaz bir anahat bıraktı
futurelucas4502

8

Yalnızca CSS kullanmak zordur, ancak etiketler background-imageyerine CSS'leri kullanabilirsiniz <img>...

Bunun gibi bir şey:

HTML

<div id="image"></div>

CSS

#image {
    background-image: url(Error.src);
    width: //width of image;
    height: //height of image;

}

İşte çalışan bir keman .

Not: Görüntünün nerede olacağını göstermek için kemanın üzerindeki CSS kenarlığını ekledim.


İyi, ama bu çözüm benim için değil :) img etiketi gizledi sonra src bozuldu, div - no :(
Geray Suinov

@GeraySuinov O zaman Javascript
Dryden Long


3

2005'ten bu yana , Firefox gibi Mozilla tarayıcıları, :-moz-brokentam olarak bu isteği yerine getirebilecek standart olmayan CSS sözde sınıfını destekledi :

td {
  min-width:64px; /* for display purposes so you can see the empty cell */
}

img[alt]:-moz-broken {
  display:none;
}
<table border="1"><tr><td>
  <img src="error">
</td><td>
  <img src="broken" alt="A broken image">
</td><td>
  <img src="https://images-na.ssl-images-amazon.com/images/I/218eLEn0fuL.png"
       alt="A bird" style="width: 120px">
</td></tr></table>

img[alt]::beforeAyrıca Firefox 64'te de çalışır (bir zamanlar bu img[alt]::aftergüvenilir değildi). Bunlardan ikisini Chrome 71'de çalıştıramadım.


İlginç ... Chrome'un benzer bir sözde sınıfına sahip olup olmadığını biliyor musunuz?
1000Gbps

1
@ 1000Gbps - Bu yanıtı aldığımda bir tane bulamadım ve şimdi bulamıyorum, en azından hızlı web sorguları ve mozilla bug 11011'e bakarak . İsterseniz Chromium'da (Chrome için yukarı akış) böyle bir şey isteyebilirsiniz, ancak standart dışı olduğu için bunu yapacaklarına dair bir güvence yoktur.
Adam Katz

Şimdiye kadar bildirdiğim bazı kötü hatalarla uğraşmakta zorlandıklarını göz önünde bulundurarak kısa sürede yapacaklarından şüpheliyim ... Bunun gibi yerleşik sözde sınıfların kaldırılacağı gerçeği ne olursa olsun aynı sebeple yazılmış JS kodu bir sürü çerçeveler
1000Gbps

2

Bu yolu bir css çözümü olarak takip edebilirsiniz

img {
        width:200px;
        height:200px;
        position:relative
   }
img:after {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        width: inherit;
        height: inherit;
        background: #ebebeb url('http://via.placeholder.com/300?text=PlaceHolder') no-repeat center;
        color: transparent;
    }
<img src="gdfgd.jpg">


İlk olarak bunun güzel bir çözüm olduğunu düşünüyordum ama bu IE üzerinde çalışmıyor. Ayrıca css sonrası ekran bloğu eklerken değil
Glenn Franquet

1

Eksik görüntüler ya hiçbir şey göstermez ya da bir [? ] stil kutusu kaynak bulunamadı. Bunun yerine, bir şeyin yanlış olduğuna dair daha iyi görsel geri bildirim olması gerektiğinden emin olduğunuz bir "eksik görüntü" grafiğiyle değiştirmek isteyebilirsiniz. Veya tamamen gizlemek isteyebilirsiniz. Bu mümkündür, çünkü bir tarayıcının görüntüleyemediği görüntüler, izleyebileceğimiz bir "hata" JavaScript etkinliğinde ateş bulamaz.

    //Replace source
    $('img').error(function(){
            $(this).attr('src', 'missing.png');
    });

   //Or, hide them
   $("img").error(function(){
           $(this).hide();
   });

Ayrıca, bu gerçekleştiğinde site yöneticisine e-posta göndermek için bir çeşit Ajax eylemini tetiklemek isteyebilirsiniz.


1

Hile img::afteriyi bir şey, ama en az 2 olumsuz tarafı vardır:

  1. tüm tarayıcılar tarafından desteklenmez (ör. Edge'de çalışmaz https://codepen.io/dsheiko/pen/VgYErm )
  2. görüntüyü gizleyemezsiniz, örtersiniz - bu durumda durumda varsayılan bir görüntüyü göstereceğinizde o kadar yararlı olmaz

JavaScript olmadan evrensel bir çözüm bilmiyorum, ancak Firefox için sadece güzel bir çözüm var:

img:-moz-broken{
  opacity: 0;
}

0

Başkaları tarafından tarif edilenle aynı fikir React'ta aşağıdaki gibi çalışır:

<img src='YOUR-URL' onError={(e) => e.target.style.display='none' }/>

-3

Herhangi bir kod gerektirmeden bunu yapmanın temel ve çok basit bir yolu, sadece boş bir alt deyimi sağlamaktır. Tarayıcı daha sonra resmi boş olarak döndürür. Görüntü orada değilse sanki.

Misal:

<img class="img_gal" alt="" src="awesome.jpg">

Görmek için deneyin! ;)


10
Bu tarayıcıya bağlıdır. Chrome'da (burada boş) alternatif metne ek olarak resim kenarlığı ve bozuk resim simgesi de olacaktır.
panzi

Görüntü dekoratifse ve içerik için zorunlu değilse, boş bir alt iyidir. Aslında hiç alt üzerinde tavsiye edilir. Aksi takdirde, bu son derece tavsiye edilemez. Bozuk görüntü görülemeyen bir görüntüdür, ancak alt etiketi varsa en azından hala duyulabilir. Alt etiketi kaldırırsanız, VEYA duyulamaz.
JP DeVries

2
@panzi Çözümü test ettim ve Chrome'un davranışını değiştirdiği anlaşılıyor. Eğer kırık görüntü simgesini oluşturmaz alt="". Aynı şey Firefox için de geçerli.
Philipp Mitterer

-4

Gelecekteki Google çalışanları için, 2016'da özellik seçiciyi kullanarak boş resimleri gizlemenin tarayıcı açısından güvenli bir saf CSS yolu vardır:

img[src="Error.src"] {
    display: none;
}

Düzenleme: Geri döndüm - gelecekteki googlers için, 2019'da Shadow Dom'da gerçek alt metin ve alt metin görüntüsünü stilize etmenin bir yolu var, ancak sadece geliştirici araçlarında çalışıyor. Yani kullanamazsın. Afedersiniz. Çok güzel olurdu.

#alttext-container {
    opacity: 0;
}
#alttext-image {
    opacity: 0;
}
#alttext {
    opacity: 0;
}

1
img[src=''] { display: none; } Bu sadece eBay html sadece şablonları ile alakalı oldu
imos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.