Gibt es eine Möglichkeit zu erkennen, ob der Browser Subpixel-Präzision hat?
Lesezeit: 6 Minuten
jsgroove
Gibt es eine Möglichkeit zu erkennen, ob der Browser Subpixel-Präzision für Elemente hat?
IE9 hat im Gegensatz zu allen anderen großen Browsern eine Subpixel-Präzision für seine Elemente (eine Elementbreite kann 50,25 Pixel betragen), und deshalb muss ich etwas anders behandeln.
Eine Möglichkeit besteht darin, jQuery zu verwenden, um den Namen und die Version des Browsers zu erkennen, aber dies ist in jQuery veraltet und wird nicht empfohlen, stattdessen wird vorgeschlagen, dass das Vorhandensein von Funktionen nicht für die Namen und Versionen des Browsers getestet werden sollte.
Upvoted und mit Sternchen versehen, weil ich nicht die geringste Ahnung habe, wie Subpixel überhaupt funktionieren würden.
– Philipp Schmidt
26. September 2012 um 15:06 Uhr
Könnten Sie nicht einfach den Stil eines div auf “50,5px” setzen und dann seine Breite in Javascript beim Laden überprüfen, um zu sehen, ob er abgerundet wurde oder nicht?
– Jan
26. September 2012 um 15:13 Uhr
Komisch, meines Wissens war das IE letzte des großen Browsers, um Subpixel-Präzision zu implementieren (oder wir sprechen von zwei verschiedenen Dingen ;)).
– Yoshi
26. September 2012 um 15:13 Uhr
@Yoshi Vielleicht war das für etwas anderes, aber für die Dimensionen von Elementen haben alle anderen großen Browser ganzzahlige Werte.
– jsgroove
26. September 2012 um 15:16 Uhr
$Yoshi Bezieht sich getComputedStyle nicht auf die CSS-Werte? Wie auch immer, ich denke, dass dies ein komplizierteres Problem ist, wenn man berücksichtigt, wie der Browser die Werte intern sieht, auch Ihre Punkte zur Anzeige, die Spezifikation, die Josh unten erwähnt, und die tatsächlichen Anzeigeabmessungen, die der Benutzer sieht. Ich denke, es gibt noch mehr zu wissen und zu suchen. Tatsache bleibt jedoch, dass es einen Unterschied gibt, wie IE9 damit umgeht, aber um es richtig zu verstehen, gibt es mehr zu suchen.
– jsgroove
26. September 2012 um 16:03 Uhr
josh3736
Ich bin mir nicht sicher, woher Sie die Idee haben, dass IE9 der einzige Browser ist, der gebrochene Pixeleinheiten unterstützt, aber diese Annahme ist völlig falsch.
Das Format eines Längenwerts (in dieser Spezifikation als bezeichnet) ist a (mit oder ohne Dezimalpunkt) unmittelbar gefolgt von einer Einheitenkennung (z. B. pxem usw.).
Und definierend :
Einige Werttypen können ganzzahlige Werte (gekennzeichnet durch ) oder reelle Zahlenwerte (gekennzeichnet durch ) haben. Reelle Zahlen und ganze Zahlen werden nur in Dezimalschreibweise angegeben. Eine besteht aus einer oder mehreren Ziffern “0” bis “9”. Eine kann entweder eine oder null oder mehr Ziffern gefolgt von einem Punkt (.) gefolgt von einer oder mehreren Ziffern sein. Sowohl ganzen Zahlen als auch reellen Zahlen kann ein „-“ oder „+“ vorangestellt werden, um das Vorzeichen anzugeben. -0 entspricht 0 und ist keine negative Zahl.
Daher ist per Spezifikation die px Längeneinheit muss Bruchzahlen unterstützen.
Um dies zu beweisen, werfen Sie einen Blick auf diese Geige in ganzer Bildschirm und verwenden Sie die Zoom-Funktion Ihres Browsers, um ganz hineinzuzoomen:
Beachten Sie in diesem Chrome-Screenshot, dass das blaue Kästchen mit 5,5 Pixeln tatsächlich größer ist als das rote Kästchen mit 5 Pixeln.
Ich denke, die Verwirrung könnte von der Tatsache herrühren, dass die nicht standardmäßigelement.clientHeight gibt einen berechneten (gerundeten) ganze Zahl -Wert, und diese Rundung erfolgt in verschiedenen Browsern unterschiedlich.
In meiner Geige, für die clientHeight des Blaus <div>IE9 und Firefox 15 bei 100% Zoom geben 6. Chrome 22 und Opera 12 geben 5. In allen Browsern ändert sich der Wert dieser Eigenschaft, wenn der Benutzer die Zoomstufe des Browsers ändert.
Mit anderen Worten, es ist unzuverlässig.
Wenn Sie Berechnungen mit den tatsächlichen Brucheinheiten eines Elements durchführen möchten, verwenden Sie getComputedStyle.
var el = $('#b')[0]; // the actual DOM element
var height = parseFloat(getComputedStyle(el).height); // => 5.5
Ich hatte oben eine längere Diskussion mit Yoshi, aber wenn Sie in Ihrem Beispiel die Client-Einstellungen der Elemente unter Properties – HTMLDivElement – clientWidth mit den Entwicklertools untersuchen, werden ganzzahlige Werte angezeigt. Weißt du warum das so ist?
– jsgroove
26. September 2012 um 15:51 Uhr
clientWidth/clientHeight sind nicht standardmäßige Eigenschaften, die geben immer ganzzahlige (also gerundete) Werte zurück in allen Browsern. In dem aktualisierte Geigebeachten Sie, dass der Wert von clientHeight schwankt, wenn Sie die Zoomstufe des Browsers ändern.
– josh3736
26. September 2012 um 16:05 Uhr
Der Kern des Problems war der Unterschied zwischen der Art und Weise, wie IE9 und andere Browser mit der Anzeige umgehen, insbesondere in meinem Fall war, dass dasselbe Layout in IE9 anders als in anderen Browsern angezeigt wurde, ein Problem, das ich der Art und Weise zuschreibe, wie IE9 mit Subpixel-Präzision umgeht . Aus Ihrem Beitrag sowie aus der Diskussion mit Yoshi verstehe ich, dass es mehr zu dem Problem gibt und mehr zu suchen und über die Unterschiede zwischen der Art und Weise, wie die einzelnen Browser damit umgehen, informiert zu werden. Ihr Beitrag war sehr informativ und hilfreich, um zu diesem Schluss zu kommen, und Ihre Lösung ist ebenfalls hilfreich.
– jsgroove
26. September 2012 um 16:53 Uhr
Alnitak
Sie könnten einen Container mit ungerader Größe erstellen und zwei Elemente mit einer Breite von 50 % darin ablegen und herausfinden, ob sie 50:50 geteilt wurden oder nicht.
Es kehrt zurück false auf Chrome 22.0.1229.79 auf MacOS X 10.8.2 und true auf Firefox 15.0.1. Ich habe kein MSIE, um es zu testen.
Ich bekomme true dafür in Firefox und IE10.
– Gufa
26. September 2012 um 15:17 Uhr
Chrome 22.0.1229.79 m unter Win 7
– xdazz
26. September 2012 um 15:19 Uhr
In Chrome erhalte ich bei Zoomstufen zwischen 50 % und 149 % “false” und bei vielen (aber nicht allen) Zoomstufen außerhalb dieses Bereichs “true”.
– josh3736
26. September 2012 um 15:49 Uhr
@josh3736 interessanter Fund!
– Alnitak
26. September 2012 um 15:56 Uhr
jsfiddle.net/KAW3d/1 – in IE6 und IE7 100,5px + 100,5px = 200px (zwei 100,5px-Floats passen in einen 200px-Container), in IE8+ 100,5px + 100,5px > 200px
Wir mussten kürzlich einige ernsthafte pixelgenaue Berechnungen durchführen, und ich musste überprüfen, ob der Browser Subpixel-Layouts unterstützen würde. Ich habe einen Test für die Verwendung in erstellt Bedingung oder Modernizr Verwenden Sie einige andere Antworten als Leitfaden:
Upvoted und mit Sternchen versehen, weil ich nicht die geringste Ahnung habe, wie Subpixel überhaupt funktionieren würden.
– Philipp Schmidt
26. September 2012 um 15:06 Uhr
Könnten Sie nicht einfach den Stil eines div auf “50,5px” setzen und dann seine Breite in Javascript beim Laden überprüfen, um zu sehen, ob er abgerundet wurde oder nicht?
– Jan
26. September 2012 um 15:13 Uhr
Komisch, meines Wissens war das IE letzte des großen Browsers, um Subpixel-Präzision zu implementieren (oder wir sprechen von zwei verschiedenen Dingen ;)).
– Yoshi
26. September 2012 um 15:13 Uhr
@Yoshi Vielleicht war das für etwas anderes, aber für die Dimensionen von Elementen haben alle anderen großen Browser ganzzahlige Werte.
– jsgroove
26. September 2012 um 15:16 Uhr
$Yoshi Bezieht sich getComputedStyle nicht auf die CSS-Werte? Wie auch immer, ich denke, dass dies ein komplizierteres Problem ist, wenn man berücksichtigt, wie der Browser die Werte intern sieht, auch Ihre Punkte zur Anzeige, die Spezifikation, die Josh unten erwähnt, und die tatsächlichen Anzeigeabmessungen, die der Benutzer sieht. Ich denke, es gibt noch mehr zu wissen und zu suchen. Tatsache bleibt jedoch, dass es einen Unterschied gibt, wie IE9 damit umgeht, aber um es richtig zu verstehen, gibt es mehr zu suchen.
– jsgroove
26. September 2012 um 16:03 Uhr