CSS / HTMLのみを使用して画像の壊れたアイコンを非表示にする方法は?


193

壊れた画像のアイコンを非表示にするにはどうすればよいですか? 例

エラーsrcの画像があります。

<img src="Error.src"/>

ソリューションはすべてのブラウザで機能する必要があります。


1
alt = ""を設定して、img teg background throw CSSライブに設定しようとしました:{background:url(src)、width:...; height:..}ですが、そうではありません。私のimgタグは非表示にする必要があります。そうしないとsrcが壊れます。
Geray Suinov、2014

ここで可能な解決策を参照してください-stackoverflow.com/questions/18484753/…しかし、JSが必要です。CSSだけでこれを行うことはできません。
JohanVdR 2014

w3schools.com/jsref/event_onerror.aspの「onerror」属性を参照してください
Amy.js 2016年

回答:


273

CSS / HTMLが画像が壊れたリンクであるかどうかを知る方法がないため、何があってもJavaScriptを使用する必要があります

ただし、画像を非表示にするか、ソースをバックアップで置き換えるための最小限の方法を次に示します。

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

または

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

更新

このようなロジックを一度に複数の画像に適用するには、次のようにします。

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">

アップデート2

CSSオプションについては、以下のmichalzuberの回答を参照してください。画像全体を非表示にすることはできませんが、壊れたアイコンの外観を変更します。


3
imgタグのように画像を表示するために使用でき、画像が存在しない場合はリンク切れを表示しないため、objectタグを使用するだけでHTMLでそれを行うことができますIE8だけで、この方法でデフォルトの画像を使用することもできます。以下に詳細を記載した回答を投稿しました。
Nick Steele 2015

1
これは、<object>アプローチの代わりに機能しました。画像にマージンを宣言する必要があるためですが、有効な画像が見つかった場合のみ、それ以外の場合は、スペースをゼロにする必要がありました。<object>にはonerrorイベントがないため、そこにはオプションがありませんでした。:empty疑似クラスを使用してマージンを削除するスタイルルールがオブジェクトでトリガーされたことはありません。
John Hatton

質問があります。すべての画像タグにこの特定のスクリプト行を与える代わりに、ページ上のすべての画像タグに適用する共通のスクリプトを与えることが可能な方法はありますか?ありがとう@Kevin jantzer
Lemdor

1
@Lemdor –はい、ロード時に画像を検索し、それぞれに共通の関数をアタッチする必要があります。jQueryまたはバニラJSを使用してこれを達成することができます(私は例で私の答えを更新しました)
Kevin Jantzer

reactJsではそれを行うのは非常に簡単で、同じ原則がそこで適用されます。このチュートリアルはここにあります-youtu.be/90P1_xCaim4。また、イメージのプリローダー(youtu.be/GBHBjv6xfY4)を追加すると、遷移が非表示になり、優れたUXの提供に役立ちます。
プレム

143

ここで人々が言っ​​ていることにもかかわらず、JavaScriptはまったく必要なく、CSSも必要ありません。

それは実際にはHTMLだけで非常に実行可能でシンプルです。 画像が読み込まれない場合は、デフォルトの画像を表示することもできます。ここに方法があります...

これはIE8までさかのぼって、すべてのブラウザーで機能します(2015年9月に私がホストしたサイトへの250,000以上の訪問者のうち、ZERO人はIE8よりも悪いものを使用しました。つまり、このソリューションは文字通りすべてに機能します)。

手順1:画像をimgではなくオブジェクトとして参照します。オブジェクトが失敗しても、壊れたアイコンは表示されません。彼らは何もしません。IE8以降では、ObjectタグとImgタグを交換して使用できます。サイズを変更して、通常の画像で実行できるすべての見事なこともできます。オブジェクトタグを恐れないでください。それは単なるタグであり、大きくてかさばることはなく、何も遅くなりません。別の名前でimgタグを使用するだけです。速度テストは、それらがまったく同じように使用されていることを示しています。

ステップ2:(オプションですが、すばらしい)デフォルトの画像をそのオブジェクト内に貼り付けます。目的の画像が実際にオブジェクトに読み込まれる場合、デフォルトの画像は表示されません。たとえば、ユーザーのアバターのリストを表示したり、サーバーに画像がない場合はプレースホルダー画像を表示したりすることができます。JavaScriptやCSSはまったく必要ありませんが、ほとんどの人がJavaScriptを使用します。

ここにコードがあります...

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

...はい、それはとても簡単です。

CSSを使用してデフォルトの画像を実装したい場合は、次のようにHTMLでさらに単純にすることができます...

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

...そしてこの回答からCSSを追加するだけです-> https://stackoverflow.com/a/32928240/3196360


6
振り返ってみると明らかなのですが、どういうわけか私はこのアイデアを完全に逃しました。残念ながら、img.srcsetプロパティで確認し始めているように、オブジェクトタグがレスポンシブな画像を適切に処理できないと思います:(
Windgazer

2
素晴らしいアイデア、ありがとうございました!object { pointer-events: none; }
余談

4
ただし、これはイメージタグのセマンティクスを壊します。検索エンジンが<object>タグの代わりに<img>タグの使用を好むかどうかはわかりません。このアプローチはHTML5に準拠しており、すべての主要ブラウザで正しくレンダリングされていますか?
Pieter

6
これはHTML4に準拠しており(1997年以降準拠)、IE8 / 2009以降のすべての主要なブラウザーで正しくレンダリングされます(他のブラウザーはずっと以前に実行していました)。検索エンジンが画像タイプのオブジェクトが画像であることを理解しない場合、仕様に追いつくまで19年かかったため、おそらくあまり良いエンジンではありません...車を運転している十代の若者たちは、今ではそうではありませんでした。このソリューションが仕様を満たしたときにも考えられます...どれくらい前に戻りたいですか?:)これは堅実なソリューションです。
Nick Steele

6
@MonsterMMORPGはJavaScriptを使用せず、常に許可されているわけではないためです(たとえば、電子メールメッセージの本文で)。
ForNeVeR 2016

63

https://bitsofco.de/styling-broken-images/で素晴らしいソリューションを見つけました

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
CSSを純粋に使用する素晴らしいソリューション。これは、受け入れられる答えになるはずです。ブラウザサポートが現在97,87%であるため、リンクされている記事は古くなっています:caniuse.com/#feat=css-gencontent
holm50 2016年

1
リンク先の記事には、ブラウザが画像を扱う方法についての優れた説明がありますが、このソリューションは、あなたが単色の背景を持っている、あなたがしたい場合にのみ機能することを心に留めておく別のボックスですべて網羅同じソリッドカラーの、または別の画像とを。このソリューションは、壊れた画像アイコンを実際に削除または非表示にするのではなく、単にそれを覆っているだけです。
Claudio Floreani 2017

3
Chrome 70では、鳥と壊れた画像アイコンが表示されます:(
Simon Arnold

2
^ Firefox 63でも同じ
dailysleaze 2018年

1
@dailysleaze – Firefox 64以降では、これはに移動しましたimg[alt]::beforedisplay:inline-blockオリジナルに近いのでお好みでお使いいただけます。
アダムKatz

40

テキストalt = "abc"を付けaltを追加すると、破損したショーのサムネイルが表示され、altメッセージabcが表示されます。

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

第一

altを追加しない場合は、破損したショーのサムネイルが表示されます

<img src="pic_trulli.jpg"/>

2番目

壊れたものを非表示にしたい場合は、alt = ""を追加するだけで、破損したサムネイルとaltメッセージは表示されません(jsを使用しない場合)

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

壊れたものを非表示にしたい場合は、alt = ""&onerror = "this.style.display = 'none'"を追加するだけで、破損したサムネイルとaltメッセージが表示されなくなります(jsを使用)

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

4番目のものは少し危険です(正確ではありません)、onerrorイベントで画像を追加したい場合、style.displayが追加のように画像が存在していても表示されません。したがって、表示する代替画像が不要な場合に使用します。

display: 'none'; // in css

CSSで指定すると、アイテムは表示されません(画像、iframe、divなど)。

画像を表示したいが、エラーの場合は完全に空白を表示したい場合は、使用できますが、スペースを取らないように注意してください。だから、あなたはそれをdivに保持する必要があります

リンクhttps://jsfiddle.net/02d9yshw/


2
はい!追加するだけalt=""!それは文字通りそれです!ありがとうございました。ページの一番下までスクロールしてよかったです。私は遅延読み込みを使用しており、まだ読み込まれていないフレーム内画像(ブラウザーが誤ってビューポートがまだスクロールしていないと考えているため)が壊れた画像として表示されました。少しスクロールすると、再び表示されます。代わりに壊れた画像はとても醜い
velkoon

25

壊れた画像のアイコンをtext-indentプロパティで非表示にするのが最も簡単な方法だと思います。

img {
    text-indent: -10000px
}

「alt」属性を表示したい場合は、明らかに機能しません。


1
最も簡単な方法。
theerasan tonthongkam

16

私が好きな答えをすることによってニック、この溶液で遊んでました。よりクリーンな方法が見つかりました。:: before / :: after疑似はimgやオブジェクトなどの置換された要素では機能しないため、オブジェクトデータ(src)が読み込まれていない場合にのみ機能します。HTMLをよりクリーンに保ち、オブジェクトのロードに失敗した場合にのみ疑似を追加します。

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>


16

画像をプレースホルダーとして保持/必要とする場合は、onerrorといくつかのCSSを使用して不透明度を0に変更し、画像サイズを設定できます。この方法では、壊れたリンクは表示されませんが、ページは通常どおりロードされます。

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

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

9

後で入力するために画像コンテナを表示したままにする必要があり、表示や非表示に煩わされたくない場合は、src内に1x1の透明画像を貼り付けることができます。

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

私はこれをまさにこの目的のために使用しました。Ajaxを介して画像が読み込まれる画像コンテナーがありました。画像が大きく、読み込みに少し時間がかかるため、Gif読み込みバーのCSSで背景画像を設定する必要がありました。

ただし、のsrcが空だったため、壊れた画像アイコンは、それを使用するブラウザで引き続き表示されました。

透明な1x1 Gifを設定すると、CSSまたはJavaScriptを介してコードを追加することなく、この問題を簡単かつ効果的に修正できます。


他のすべてがうまくいった答えだけが白い輪郭を残しました
futurelucas4502

8

CSSのみを使用するのは難しいですがbackground-image<img>タグの代わりにCSSを使用することもできます...

このようなもの:

HTML

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

CSS

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

}

これが実用的なフィドルですです。

注:画像の位置を示すために、フィドルのCSSに境界線を追加しました。


良いですが、このソリューションは私には適していません:) imgタグを非表示にすると、srcが壊れます。div-no :(
Geray Suinov

@GeraySuinovその後、Javascriptを使用する必要があるかもしれません
ドライデンロング


3

2005年以降、FirefoxなどのMozillaブラウザーは、:-moz-brokenこの要求を正確に実行できる非標準のCSS疑似クラスをサポートしています。

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]::beforeFirefox 64でも動作します(たまにimg[alt]::afterそうだったので、これは信頼できません)。Chrome 71では、どちらも動作しません。


興味深い... Chromeに同様の疑似クラスがあるかどうか知っていますか?
1000 Gbps

1
@ 1000Gbps –その答えを見つけたとき、1つは見つかりませんでした。現在、少なくともWebクエリを使用し、mozillaバグ11011を確認しても、答えを見つけることができません。必要に応じて、実際にChromium(Chromeのアップストリーム)でそのようなことを要求することもできますが、それは非標準であるため、それらがそれを実行する保証はありません。
Adam Katz

私がそこで報告したいくつかの厄介なバグに対処するのに苦労したことを考慮して、彼らが短時間でそれを行うことを強く疑います...このような組み込みの疑似クラスが削除されるという事実に関係なくフレームワークは、同じ理由で書かれた多くのJSコード
1000Gbps

2

あなたはCSSソリューションとしてこのパスをたどることができます

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">


まず、これは良い解決策だと思っていましたが、IEでは機能しません。また、CSSの後にディスプレイブロックを追加する場合もそうではありません
Glenn Franquet

1

画像がない場合は、何も表示されないか、[[ ]ソースが見つからない場合のスタイルボックス。代わりに、存在することが確実である「欠落している画像」のグラフィックに置き換えて、何かが間違っているという視覚的なフィードバックが得られるようにすることができます。または、完全に非表示にすることもできます。これは可能です。ブラウザが検出できない画像は、監視できる「エラー」JavaScriptイベントを発火させるためです。

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

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

さらに、これが発生したときにサイト管理者に電子メールを送信するために、ある種のAjaxアクションをトリガーしたい場合があります。


1

のトリックimg::afterは良いものですが、少なくとも2つの欠点があります:

  1. すべてのブラウザーでサポートされているわけではありません(例:Edge https://codepen.io/dsheiko/pen/VgYErmでは機能しません)
  2. 単に画像を非表示にすることはできません、それを覆います-ケースでデフォルトの画像をどのように表示するかはそれほど役に立ちません

私はJavaScriptなしの普遍的な解決策を知りませんが、Firefoxのためだけに素晴らしいものがあります:

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

-3

コードを必要とせずにこれを行う基本的で非常に単純な方法は、空のaltステートメントを提供することです。その後、ブラウザは画像を空白として返します。画像が存在しないかのように見えます。

例:

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

ぜひお試しください! ;)


10
それはブラウザに依存します。Chromeでは、(ここでは空の)altテキストに加えて、画像の枠と壊れた画像のアイコンも表示されます。
panzi

画像が装飾的でコンテンツに不可欠ではない場合、空のaltで問題ありません。実際には、それはまったくaltよりもお勧めです。それ以外の場合、これはあまりお勧めできません。壊れた画像は見えない画像ですが、altタグがあれば少なくとも聞くことができます。altタグを削除すると、それを表示したり、聞いたりすることができなくなります。
JP DeVries 2016年

2
@panziソリューションをテストしたところ、Chromeの動作が変わったようです。の場合、壊れた画像アイコンはレンダリングされませんalt=""。Firefoxについても同様です。
Philipp Mitterer 2018

-4

今後のGoogle社員向けに、2016年には、属性セレクターを使用して空の画像を非表示にするブラウザーセーフの純粋なCSS方法があります。

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

編集:私は戻ってきました-今後のGoogle社員のために、2019年にはシャドウドムで実際の代替テキストと代替テキストイメージのスタイルを設定する方法がありますが、これは開発者ツールでのみ機能します。そのため、使用できません。ごめんなさい。いいですね。

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

1
img[src=''] { display: none; } これは、eBayのHTMLのみのテンプレートと再び関連するようになりました
imos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.