Próbowałem ustawić alt = "" i ustawić img teg rzut CSS live: {background: url (src), width: ...; wzrost: ..} ale to nieprawda. Mój tag img musi się ukryć, a następnie src jest uszkodzony.
Możesz to zrobić za pomocą HTML tylko przy użyciu znacznika object, ponieważ może on być używany do wyświetlania obrazów takich jak tag img, i nie wyświetla uszkodzonego łącza, jeśli obraz nie istnieje, działa we wszystkich przeglądarkach i tak daleko jako sam IE8, możesz nawet użyć domyślnych obrazów za pomocą tej metody, zamieściłem odpowiedź ze szczegółami poniżej.
Nick Steele,
1
To działało dla mnie zamiast podejścia <object>, ponieważ potrzebowałem, aby obraz miał zadeklarowany margines, ale tylko wtedy, gdy znaleziono prawidłowy obraz, w przeciwnym razie potrzebowałem go, aby zajął zero miejsca. <object> nie ma zdarzenia onerror, więc nie było takiej opcji. Reguła stylu usuwania marginesu przy użyciu pseudo-klasy: pusta nigdy nie została uruchomiona na obiekcie.
John Hatton,
Mam pytanie. czy istnieje możliwość wspólnego skryptu, który ma być stosowany do każdego znacznika obrazu na stronie, zamiast podawania tego wiersza skryptu w każdym znaczniku obrazu. dziękuję @Kevin Jantzer
Lemdor
1
@Lemdor - tak, musisz znaleźć obrazy przy załadowaniu i dołączyć do nich wspólną funkcję. Aby to osiągnąć, możesz użyć jQuery lub waniliowej JS (zaktualizowałem odpowiedź o przykład)
Kevin Jantzer,
W reakJs jest to bardzo łatwe, obowiązuje tam ta sama zasada. Znajdziesz ten samouczek tutaj - youtu.be/90P1_xCaim4 . Również dodanie preloadera ( youtu.be/GBHBjv6xfY4 ) do obrazu ukrywa przejście i pomaga zapewnić dobry UX.
Prem
143
Pomimo tego, co ludzie tutaj mówią, wcale nie potrzebujesz JavaScript, nawet CSS !!
Jest to w rzeczywistości bardzo wykonalne i proste tylko z HTML. Możesz nawet wyświetlić obraz domyślny, jeśli obraz się nie ładuje . Oto jak...
Działa to również we wszystkich przeglądarkach, nawet już w IE8 (z ponad 250 000 odwiedzających witryny, które hostowałem we wrześniu 2015 r., Ludzie ZERO używali czegoś gorszego niż IE8, co oznacza, że to rozwiązanie działa dosłownie na wszystko ).
Krok 1: Odwołaj się do obrazu jako obiektu zamiast img . Kiedy obiekty zawodzą, nie pokazują uszkodzonych ikon; po prostu nic nie robią. Począwszy od IE8, można używać zamiennie znaczników Object i Img. Możesz również zmieniać rozmiar i robić wszystkie chwalebne rzeczy, które możesz zrobić, używając zwykłych zdjęć. Nie bój się znacznika obiektu; to tylko metka, nic dużego i nieporęczne jest ładowane i niczego nie spowalnia. Będziesz używać tagu img pod inną nazwą. Test prędkości pokazuje, że są one używane identycznie.
Krok 2: (Opcjonalnie, ale świetnie) Umieść domyślny obraz wewnątrz tego obiektu. Jeśli żądany obraz faktycznie ładuje się do obiektu , domyślny obraz nie zostanie wyświetlony. Na przykład możesz wyświetlić listę awatarów użytkowników, a jeśli ktoś nie ma jeszcze obrazu na serwerze, może wyświetlić obraz zastępczy ... javascript lub CSS wcale nie są wymagane, ale masz funkcje tego, co bierze większość ludzi JavaScript.
Jakoś całkowicie tęskniłem za tym pomysłem, gdy jest to tak oczywiste z perspektywy czasu! Niestety nie sądzę, że tag obiektu może z wdziękiem obsługiwać responsywne obrazy, tak jak zaczynamy widzieć we właściwości img.srcset :(
Windgazer
2
Świetny pomysł, dziękuję za to! Na marginesie, tag obiektu blokuje kółko przewijania (przynajmniej w mojej implementacji) ... jeśli tak się stanie, po prostu użyj object { pointer-events: none; }w swoim CSS (źródło: stackoverflow.com/a/16534300 )
DHainzl
4
To jednak łamie semantykę znaczników obrazu. Nie wiem, czy wyszukiwarki polubią używanie <object>tagów zamiast <img>tagów. Czy to podejście jest zgodne z HTML5 i poprawnie renderowane przez wszystkie główne przeglądarki?
Pieter
6
Jest to zgodne z HTML4 (zgodne od 1997 r.) I poprawnie renderowane przez wszystkie główne przeglądarki od IE8 / 2009 (inne przeglądarki zrobiły to znacznie, znacznie wcześniej). Jeśli wyszukiwarka nie rozumie, że obiekt z typem obrazu jest obrazem, miał 19 lat na nadrobienie specyfikacji, więc prawdopodobnie nie jest to bardzo dobry silnik ... Nastolatki, które jeżdżą samochodami, nie były teraz nawet wymyślone, gdy to rozwiązanie spełnia specyfikacje ... Jak daleko chcesz się posunąć? :) To solidne rozwiązanie.
Nick Steele,
6
@MonsterMMORPG, ponieważ nie używa JavaScript i nie zawsze jest to dozwolone (na przykład w treści wiadomości e-mail).
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);}
Niesamowite rozwiązanie wykorzystujące wyłącznie CSS, który powinien być akceptowaną odpowiedzią. Artykuł, do którego prowadzi link, jest nieaktualny, ponieważ obsługa przeglądarki wynosi teraz 97,87%: caniuse.com/#feat=css-gencontent .
holm50,
1
W połączonym artykule znajduje się doskonałe wyjaśnienie, w jaki sposób przeglądarki obsługują obrazy, ale należy pamiętać, że to rozwiązanie działa tylko wtedy, gdy masz solidne tło i chcesz pokryć wszystko innym polem o tym samym jednolitym kolorze lub innym obrazem. To rozwiązanie tak naprawdę nie usuwa ani nie ukrywa ikony uszkodzonego obrazu, tylko ją zasłania.
Claudio Floreani,
3
W Chrome 70 pokazuje ptaka + ikonę zepsutego obrazu :(
Simon Arnold
2
^ To samo w przeglądarce Firefox 63
dsturbid
1
@dailysleaze - w przeglądarce Firefox 64+ przeniesiono to do img[alt]::before. Możesz użyć, display:inline-blockjeśli chcesz, ponieważ jest bliżej oryginału.
Adam Katz,
41
Jeśli dodasz alt z tekstem alt = "abc" , pokaże to uszkodzoną miniaturę i alt wiadomość abc
<imgsrc="pic_trulli.jpg"alt="abc"/>
Jeśli nie dodasz alt, pokaże to uszkodzoną miniaturę
<imgsrc="pic_trulli.jpg"/>
Jeśli chcesz ukryć uszkodzony, po prostu dodaj alt = "" nie wyświetli uszkodzonej miniatury i żadnej wiadomości alt (bez użycia js)
<imgsrc="pic_trulli.jpg"alt=""/>
Jeśli chcesz ukryć uszkodzony, po prostu dodaj alt = "" & onerror = "this.style.display = 'none'" nie wyświetli uszkodzonej miniatury i żadnej wiadomości alt (z js)
Czwarty jest trochę niebezpieczny (nie do końca), jeśli chcesz dodać dowolny obraz w zdarzeniu onerror, nie wyświetli się, nawet jeśli obraz istnieje jako styl. Wyświetlanie przypomina dodawanie. Dlatego używaj go, gdy nie potrzebujesz żadnego alternatywnego obrazu do wyświetlenia.
display:'none';// in css
Jeśli podamy go w CSS, to element nie będzie wyświetlany (jak image, iframe, div w ten sposób).
Jeśli chcesz wyświetlić obraz i chcesz wyświetlić całkowicie puste miejsce w przypadku błędu, możesz użyć, ale także uważaj, to nie zajmie miejsca. Więc musisz trzymać to w div
TAK! Po prostu dodaj alt=""! To dosłownie to! Dziękuję Ci. Cieszę się, że przewinąłem na dół strony. Używam leniwego ładowania, a obrazy w ramce, które nie zostały jeszcze załadowane (ponieważ przeglądarka błędnie uważa, że rzutnia jeszcze do nich nie przewinęła) pokazały się jako uszkodzone obrazy. Mały zwój i znów się pojawiają.
Zepsute
25
Myślę, że najprostszym sposobem jest ukrycie ikony uszkodzonego obrazu za pomocą właściwości wcięcia tekstu.
img {
text-indent:-10000px}
Oczywiście nie działa, jeśli chcesz zobaczyć atrybut „alt”.
jeśli chcesz zachować / potrzebować obraz jako symbol zastępczy, możesz zmienić krycie na 0 za pomocą onerroru i trochę CSS, aby ustawić rozmiar obrazu. W ten sposób nie zobaczysz uszkodzonego linku, ale strona ładuje się normalnie.
Podobało mi się odpowiedź przez Nicka i grał wokół tego rozwiązania. Znaleziono czystszą metodę. Ponieważ pseudo :: before / :: after nie działają na zastąpionych elementach, takich jak img i object, będą działać tylko wtedy, gdy dane obiektu (src) nie zostaną załadowane. Utrzymuje HTML w czystości i doda pseudo tylko wtedy, gdy obiekt się nie załaduje.
Jeśli nadal chcesz, aby pojemnik z obrazem był widoczny z powodu jego późniejszego wypełnienia i nie chcesz zawracać sobie głowy jego pokazywaniem i ukrywaniem, możesz umieścić przezroczysty obraz 1x1 wewnątrz src:
Użyłem tego właśnie do tego celu. Miałem kontener obrazu, który miał zostać załadowany do niego przez Ajax. Ponieważ obraz był duży i wymagał trochę załadowania, wymagał ustawienia obrazu tła w CSS paska ładowania Gif.
Ponieważ jednak plik src był pusty, ikona zepsutego obrazu nadal pojawiała się w przeglądarkach, które go używają.
Ustawienie przezroczystego GIF-a 1x1 rozwiązuje ten problem w prosty i skuteczny sposób, bez dodawania kodu przez CSS lub JavaScript.
img[alt]::beforedziała również w Firefoksie 64 (choć kiedyś img[alt]::aftertak było, więc nie jest to wiarygodne). Nie mogę zmusić żadnego z nich do pracy w Chrome 71.
Ciekawe ... czy wiesz, czy Chrome ma podobną pseudoklasę?
1000 Gb / s
1
@ 1000 Gbps - nie mogłem znaleźć takiej odpowiedzi, kiedy ją znalazłem, i nie mogę jej teraz znaleźć, przynajmniej dzięki szybkim zapytaniom internetowym i patrząc na błąd 11011 Mozilli . Można faktycznie wystąpić coś takiego w chrom (upstream dla Chrome), jeśli chcesz, ale jak to jest nietypowa, nie ma pewności, że będzie to zrobić.
Adam Katz
Bardzo wątpię, że zrobią to w krótkim czasie, biorąc pod uwagę, że mieli trudności z radzeniem sobie z niektórymi paskudnymi błędami, które tam zgłosiłem ... Bez względu na to, że wbudowane pseudoklasy takie jak ta usuną z tworzy dużo kodu JS napisanego z tego samego powodu
Najpierw myślałem, że to fajne rozwiązanie, ale to nie działa w IE. Również nie przy dodawaniu bloku wyświetlacza w późniejszym css
Glenn Franquet
1
Brakujące obrazy po prostu nic nie wyświetlają lub wyświetlają [? ], gdy nie można znaleźć źródła. Zamiast tego możesz zastąpić tę grafikę „brakującym obrazem”, co do którego istnieje pewność, że jest lepsza informacja wizualna, że coś jest nie tak. Lub możesz chcieć to całkowicie ukryć. Jest to możliwe, ponieważ obrazy, których przeglądarka nie może znaleźć, odpalają „błąd” zdarzenia JavaScript, na które możemy patrzeć.
//Replace source
$('img').error(function(){
$(this).attr('src','missing.png');});//Or, hide them
$("img").error(function(){
$(this).hide();});
Ponadto możesz zainicjować jakieś działanie Ajax, aby wysłać wiadomość e-mail do administratora witryny, gdy to nastąpi.
Podstawowym i bardzo prostym sposobem na zrobienie tego bez wymaganego kodu byłoby po prostu podanie pustej instrukcji alt. Przeglądarka zwróci wówczas obraz jako pusty. Wyglądałoby to tak, jakby nie było tam obrazu.
To zależy od przeglądarki. W Chrome nadal będziesz mieć obramowanie obrazu i ikonę uszkodzonego obrazu oprócz (tutaj pustego) tekstu alternatywnego.
panzi
Jeśli obraz jest dekoracyjny i nie jest konieczny dla treści, pusta alt jest w porządku. W rzeczywistości jest to zalecane w ogóle. W przeciwnym razie jest to wysoce niewskazane. Zepsuty obraz jest obrazem, którego nie można zobaczyć, ale jeśli ma znacznik alt, nadal można go usłyszeć. Jeśli usuniesz tag alt, nie będzie można go zobaczyć LUB usłyszeć.
JP DeVries
2
@panzi Przetestowałem rozwiązanie i wygląda na to, że Chrome zmienił swoje zachowanie. Nie wyrenderuje ikony uszkodzonego obrazu, jeśli alt="". To samo dotyczy Firefoksa.
Philipp Mitterer,
-4
Dla przyszłych pracowników Google w 2016 roku dostępny jest bezpieczny sposób CSS do ukrywania pustych obrazów za pomocą selektora atrybutów:
img[src="Error.src"]{
display: none;}
Edycja: Wróciłem - dla przyszłych pracowników Google, w 2019 roku istnieje sposób na stylizowanie tekstu alternatywnego i obrazu tekstowego w Shadow Dom, ale działa tylko w narzędziach programistycznych. Więc nie możesz tego użyć. Przepraszam. Byłoby miło.
Odpowiedzi:
CSS / HTML nie ma możliwości sprawdzenia, czy obraz jest uszkodzony, więc będziesz musiał używać JavaScript bez względu na wszystko
Ale tutaj jest minimalna metoda ukrycia obrazu lub zamiany źródła na kopię zapasową.
lub
Aktualizacja
Możesz zastosować tę logikę do wielu obrazów jednocześnie, wykonując coś takiego:
Aktualizacja 2
Aby uzyskać opcję CSS, zobacz odpowiedź michalzubera poniżej. Nie możesz ukryć całego obrazu, ale zmieniasz wygląd uszkodzonej ikony.
źródło
Pomimo tego, co ludzie tutaj mówią, wcale nie potrzebujesz JavaScript, nawet CSS !!
Jest to w rzeczywistości bardzo wykonalne i proste tylko z HTML. Możesz nawet wyświetlić obraz domyślny, jeśli obraz się nie ładuje . Oto jak...
Działa to również we wszystkich przeglądarkach, nawet już w IE8 (z ponad 250 000 odwiedzających witryny, które hostowałem we wrześniu 2015 r., Ludzie ZERO używali czegoś gorszego niż IE8, co oznacza, że to rozwiązanie działa dosłownie na wszystko ).
Krok 1: Odwołaj się do obrazu jako obiektu zamiast img . Kiedy obiekty zawodzą, nie pokazują uszkodzonych ikon; po prostu nic nie robią. Począwszy od IE8, można używać zamiennie znaczników Object i Img. Możesz również zmieniać rozmiar i robić wszystkie chwalebne rzeczy, które możesz zrobić, używając zwykłych zdjęć. Nie bój się znacznika obiektu; to tylko metka, nic dużego i nieporęczne jest ładowane i niczego nie spowalnia. Będziesz używać tagu img pod inną nazwą. Test prędkości pokazuje, że są one używane identycznie.
Krok 2: (Opcjonalnie, ale świetnie) Umieść domyślny obraz wewnątrz tego obiektu. Jeśli żądany obraz faktycznie ładuje się do obiektu , domyślny obraz nie zostanie wyświetlony. Na przykład możesz wyświetlić listę awatarów użytkowników, a jeśli ktoś nie ma jeszcze obrazu na serwerze, może wyświetlić obraz zastępczy ... javascript lub CSS wcale nie są wymagane, ale masz funkcje tego, co bierze większość ludzi JavaScript.
Oto kod ...
... Tak, to takie proste.
Jeśli chcesz zaimplementować domyślne obrazy za pomocą CSS, możesz uprościć ten kod HTML w ten sposób ...
... i po prostu dodaj CSS z tej odpowiedzi -> https://stackoverflow.com/a/32928240/3196360
źródło
object { pointer-events: none; }
w swoim CSS (źródło: stackoverflow.com/a/16534300 )<object>
tagów zamiast<img>
tagów. Czy to podejście jest zgodne z HTML5 i poprawnie renderowane przez wszystkie główne przeglądarki?Znalazłem świetne rozwiązanie na https://bitsofco.de/styling-broken-images/
źródło
img[alt]::before
. Możesz użyć,display:inline-block
jeśli chcesz, ponieważ jest bliżej oryginału.Jeśli dodasz alt z tekstem alt = "abc" , pokaże to uszkodzoną miniaturę i alt wiadomość abc
Jeśli nie dodasz alt, pokaże to uszkodzoną miniaturę
Jeśli chcesz ukryć uszkodzony, po prostu dodaj alt = "" nie wyświetli uszkodzonej miniatury i żadnej wiadomości alt (bez użycia js)
Jeśli chcesz ukryć uszkodzony, po prostu dodaj alt = "" & onerror = "this.style.display = 'none'" nie wyświetli uszkodzonej miniatury i żadnej wiadomości alt (z js)
Czwarty jest trochę niebezpieczny (nie do końca), jeśli chcesz dodać dowolny obraz w zdarzeniu onerror, nie wyświetli się, nawet jeśli obraz istnieje jako styl. Wyświetlanie przypomina dodawanie. Dlatego używaj go, gdy nie potrzebujesz żadnego alternatywnego obrazu do wyświetlenia.
Jeśli podamy go w CSS, to element nie będzie wyświetlany (jak image, iframe, div w ten sposób).
Jeśli chcesz wyświetlić obraz i chcesz wyświetlić całkowicie puste miejsce w przypadku błędu, możesz użyć, ale także uważaj, to nie zajmie miejsca. Więc musisz trzymać to w div
Link https://jsfiddle.net/02d9yshw/
źródło
alt=""
! To dosłownie to! Dziękuję Ci. Cieszę się, że przewinąłem na dół strony. Używam leniwego ładowania, a obrazy w ramce, które nie zostały jeszcze załadowane (ponieważ przeglądarka błędnie uważa, że rzutnia jeszcze do nich nie przewinęła) pokazały się jako uszkodzone obrazy. Mały zwój i znów się pojawiają.Myślę, że najprostszym sposobem jest ukrycie ikony uszkodzonego obrazu za pomocą właściwości wcięcia tekstu.
Oczywiście nie działa, jeśli chcesz zobaczyć atrybut „alt”.
źródło
jeśli chcesz zachować / potrzebować obraz jako symbol zastępczy, możesz zmienić krycie na 0 za pomocą onerroru i trochę CSS, aby ustawić rozmiar obrazu. W ten sposób nie zobaczysz uszkodzonego linku, ale strona ładuje się normalnie.
źródło
Podobało mi się odpowiedź przez Nicka i grał wokół tego rozwiązania. Znaleziono czystszą metodę. Ponieważ pseudo :: before / :: after nie działają na zastąpionych elementach, takich jak img i object, będą działać tylko wtedy, gdy dane obiektu (src) nie zostaną załadowane. Utrzymuje HTML w czystości i doda pseudo tylko wtedy, gdy obiekt się nie załaduje.
źródło
Jeśli nadal chcesz, aby pojemnik z obrazem był widoczny z powodu jego późniejszego wypełnienia i nie chcesz zawracać sobie głowy jego pokazywaniem i ukrywaniem, możesz umieścić przezroczysty obraz 1x1 wewnątrz src:
<img id="active-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>
Użyłem tego właśnie do tego celu. Miałem kontener obrazu, który miał zostać załadowany do niego przez Ajax. Ponieważ obraz był duży i wymagał trochę załadowania, wymagał ustawienia obrazu tła w CSS paska ładowania Gif.
Ponieważ jednak plik src był pusty, ikona zepsutego obrazu nadal pojawiała się w przeglądarkach, które go używają.
Ustawienie przezroczystego GIF-a 1x1 rozwiązuje ten problem w prosty i skuteczny sposób, bez dodawania kodu przez CSS lub JavaScript.
źródło
Używanie tylko CSS jest trudne, ale możesz użyć CSS
background-image
zamiast<img>
tagów ...Coś takiego:
HTML
CSS
Oto działające skrzypce .
Uwaga: dodałem obramowanie w CSS na skrzypcach, aby pokazać, gdzie będzie obraz.
źródło
Użyj znacznika obiektu. Dodaj alternatywny tekst między tagami w ten sposób:
http://www.w3schools.com/tags/tag_object.asp
źródło
Od 2005 roku przeglądarki Mozilla, takie jak Firefox, obsługują niestandardową
:-moz-broken
pseudoklasę CSS, która może spełnić dokładnie to żądanie:img[alt]::before
działa również w Firefoksie 64 (choć kiedyśimg[alt]::after
tak było, więc nie jest to wiarygodne). Nie mogę zmusić żadnego z nich do pracy w Chrome 71.źródło
Możesz podążać tą ścieżką jako rozwiązanie css
źródło
Brakujące obrazy po prostu nic nie wyświetlają lub wyświetlają [? ], gdy nie można znaleźć źródła. Zamiast tego możesz zastąpić tę grafikę „brakującym obrazem”, co do którego istnieje pewność, że jest lepsza informacja wizualna, że coś jest nie tak. Lub możesz chcieć to całkowicie ukryć. Jest to możliwe, ponieważ obrazy, których przeglądarka nie może znaleźć, odpalają „błąd” zdarzenia JavaScript, na które możemy patrzeć.
Ponadto możesz zainicjować jakieś działanie Ajax, aby wysłać wiadomość e-mail do administratora witryny, gdy to nastąpi.
źródło
Sztuczka z
img::after
jest dobrą rzeczą, ale ma co najmniej 2 wady:Nie znam uniwersalnego rozwiązania bez JavaScriptu, ale dla Firefoksa jest tylko jedno fajne:
źródło
Ten sam pomysł opisany przez innych działa w React w następujący sposób:
źródło
Podstawowym i bardzo prostym sposobem na zrobienie tego bez wymaganego kodu byłoby po prostu podanie pustej instrukcji alt. Przeglądarka zwróci wówczas obraz jako pusty. Wyglądałoby to tak, jakby nie było tam obrazu.
Przykład:
Wypróbuj to!
;)
źródło
alt=""
. To samo dotyczy Firefoksa.Dla przyszłych pracowników Google w 2016 roku dostępny jest bezpieczny sposób CSS do ukrywania pustych obrazów za pomocą selektora atrybutów:
Edycja: Wróciłem - dla przyszłych pracowników Google, w 2019 roku istnieje sposób na stylizowanie tekstu alternatywnego i obrazu tekstowego w Shadow Dom, ale działa tylko w narzędziach programistycznych. Więc nie możesz tego użyć. Przepraszam. Byłoby miło.
źródło
img[src=''] { display: none; }
Stało się to znowu aktualne w przypadku szablonów wyłącznie w serwisie eBay