2012-03-30 8 views
0

diesen Code vor:Erkennen von Bildbreite über JavaScript, wenn maxWidth verwendet wird

var img = new Image(); 

img.onload = function() { 
    console.log(this.width); 
}; 

img.src = 'http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Gull_portrait_ca_usa.jpg/800px-Gull_portrait_ca_usa.jpg'; 

document.body.appendChild(img); 

Dadurch wird die Bildbreite (800) korrekt ausdrucken. Aber wenn ich einen max-width mit CSS anwenden:

img {max-width: 400px} 

Testfall: http://jsfiddle.net/MSjnM/

Der oben JS-Code wird stattdessen 400 ausdrucken. Das ist ein wenig verwirrend, da man denken könnte, dass das width Attribut die ursprüngliche Bildbreite repräsentiert, nicht die berechnete Breite.

Nun zu etwas noch verwirrender, wenn ich das Bild im onload-Ereignis nach der Breitenerkennung anhängen bekomme ich ein anderes Ergebnis:

var img = new Image(); 

img.onload = function() { 
    console.log(this.width); 
    document.body.appendChild(img); 
}; 

img.src = 'http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Gull_portrait_ca_usa.jpg/800px-Gull_portrait_ca_usa.jpg'; 

Testfall: http://jsfiddle.net/MSjnM/2/

Dieses heraus gedruckt wird 800 stattdessen, obwohl das CSS angewendet wurde. Ich nehme an, es ist, weil das Bild angehängt ist nach Ich erkannte die Breite und dass die maximale Breite angewendet wird, sobald das Bild in das DOM eingefügt wird.

OK, also, wenn ich die ursprüngliche Bildgröße erhalten möchte, egal wann oder ob das IMG Element in das DOM eingefügt wird oder welche CSS Stile angewendet wurden, wie würde ich das ausfallsicher machen?

+0

FX11 und Op11.61 sowohl Ihre Geige print "400" verwenden. – fcalderan

+0

@ FabrizioCalderan Ich habe in Chrome getestet, aber das ist noch alarmierender ... – David

+0

OK Ich habe den Code leicht geändert, um den gleichen Effekt über die Browser zu erreichen, danke Fabrizio. – David

Antwort

2

Für mich: in IE9, Opera, Safari (PC), FF und Chrom die naturalWidth/naturalHeight -properties Rück die gewünschte Werte

http://jsfiddle.net/MSjnM/5/

+0

nett, +1: in welcher IE-Version wird unterstützt? – fcalderan

+0

IE9 wie ich schrieb. In IE8 gibt die Breite 800 für mich zurück. –

+0

Ich kann auch bestätigen, dass Chrome 20.0 funktioniert –

2

Laden Sie das Bild unabhängig in ein neues Image-Objekt und gibt die Breite erhalten:

var img = new Image(); 
img.src = 'http://placehold.it/350x150' 
console.log(img.width); 
+0

Dies ist in Safari nicht zuverlässig. Es funktioniert auch nicht, wenn das Bild im DOM vorhanden ist und eine maximale Breite angewendet wurde. – David

+1

Hinweis: Das Bild sollte sich jetzt im Cache befinden, also keine zusätzlichen Anforderungen/Leistungseinbußen. – dirkbonhomme

+0

@David Thought: ist es in Safari nur unzuverlässig, weil du eine CSS-Regel hast, die alle ''s eine maximale Breite hat? Sicher, auch wenn es die CSS-Regel auf ein 'Image()' -Objekt anwendet, das sich nicht im DOM befindet, solange Sie die CSS-Regel spezifischer machen können, dann wird es kein Problem geben? – GregL

Verwandte Themen