2012-06-25 5 views
6

Ich habe eine Situation, in der ich eine HTML img haben möchte, die noch nicht geladen wurde, um eine voreingestellte Höhe zu haben. Der Grund ist, dass diese Höhe in einer Berechnung verwendet wird, die ausgelöst wird, bevor das Bild vollständig geladen ist und genau bleiben muss. Ich habe versucht, die folgenden:HTML Forcing img Dimensionen erfordert Block?

<div>hello<img src='http://example.com/invalid.gif' class="testimage"> there</div> 

und

.testimage { 
    height: 200px; 
    width: 200px; 
} 
​ 

in einigen CSS setzen und zumindest in Firefox 5, der zusätzliche Raum wird nicht gerendert (und seltsam, das gebrochene Bild zeigt nicht entweder, nur ein Leerzeichen). Das heißt, bis ich display: inline-block hinzufügen. In mindestens einigen anderen Browsern zeigt die Standardanzeige inline das gewünschte Ergebnis. Wird das erwartet? Wenn ja warum?

Hier ist ein jsFiddle auch: http://jsfiddle.net/uYXD4/

+0

Nicht wirklich eine Antwort, aber warum nicht das Bild (die Bilder) auf einer anderen Seite vorab laden und dann auf die Hauptseite umleiten, auf diese Weise werden Sie immer 100% sicher sein, dass das Bild geladen wurde. – compcobalt

+0

Wenn Sie Bilder mit unterschiedlichen Höhen haben und auf diese Höhen angewiesen sind, um einige js auszulösen, müssen Sie wirklich warten, bis das Bild geladen ist. – idrumgood

+0

oder verwenden Sie ein leeres oder transparentes Bild (.PNG) mit einer Spezifikation. Höhe/Gewicht bereits eingestellt und dann ersetzen Sie einfach die Img src, wenn Sie möchten. (wie ein Platzhalter) – compcobalt

Antwort

2

Bilder sind replaced elements:

Ein Element, dessen Inhalt außerhalb des Bereichs des CSS-Formatierungsmodells, z. B. ein Bild, ein eingebettetes Dokument oder ein Applet. Zum Beispiel wird der Inhalt des HTML-IMG-Elements oft durch das Bild ersetzt, das sein "src" -Attribut bezeichnet.

Für ersetzten Elemente, display: inline-block ist supposed to have the same exact same efffect als display: inline, die der Standard ist.

kann dies also eine mögliche Erklärung in einigen Browsern für dieses seltsame Verhalten sein *:

Sie behandeln nur vollständig geladen Bilder als Elemente ersetzt, und sonst sie als nicht-ersetzte Elemente behandeln. Das macht schließlich Sinn und der Standard verbietet das nicht ausdrücklich.Als Folge gibt es drei mögliche Szenarien:

  1. ersetzt Element, Inline oder Inline-Block keine Rolle spielt, height Eigenschaft
  2. Inline nicht ersetzt Element arbeitet, height Attribut has no effect
  3. inline-block nicht -replaced Element, height Eigenschaft funktioniert

Loaded Bilder immer als 1. qualifizieren und gebrochen/Laden von Bildern qualifizieren können als 1. oder 2. (oder 3. wenn Sie Anzeige ein: inline-block explizit)

* Nicht sicher, ob die Dinge tatsächlich so funktionieren.

3

es sagt hier, dass die Bilder Inline Elemente sind - http://htmlhelp.com/reference/html40/special/img.html

Auf der anderen Seite hier einen Blick - Is <img> element block level or inline level?

Es sieht aus wie die <img> element ist sowohl inline als auch block. Keine strengen Regeln, die es definieren, so dass die Browser-Hersteller wahrscheinlich ihre eigenen Entscheidungen über die Standardeinstellungen treffen. So Ihre beste Wette ist, ihre Annahmen zu display: inline-block

0

zurücksetzen Warum nicht etwas verwenden wie

<img src="..." width=400 height=200> 

ich genau dasselbe zu tun und es funktioniert ganz gut. Eine weitere Option ist ...

$('.myimg').load(function() { /* ops */ }); 

obwohl ich weiß nicht, ob das das Bild in allen Browsern laden wartet oder nicht

+0

funktioniert nicht in FF - http://jsfiddle.net/uYXD4/2/ –

+0

@ ZoltanToth es tut, aber wenn Sie es eine ungültige IMG geben, wird es das Bild los: http://jsfiddle.net/uYXD4/10/ – tigertrussell

+0

Ein anderes Beispiel, das es OHNE das src-Attribut lädt und dann den src von JS auffüllt. Funktioniert mit Firefox. http://jsfiddle.net/uYXD4/11/ – tigertrussell