Heute hatte ich eine wirklich peinliche Erfahrung. Wie gewohnt habe ich window.innerWidth
verwendet, um die Breite des Browsers zu messen, und wenn sie 768px oder weniger beträgt, wird der Code so geschrieben, dass isMobile = true
wird. Ich habe auch gründliche Tests durchgeführt. Ich habe auf verschiedenen Geräten wie iPhone und Galaxy getestet und sogar auf Safari, Chrome und Brave überprüft, ob alles in Ordnung war.
Aber…
Ein Bekannter hat mir plötzlich mitgeteilt, dass meine Webanwendung im Samsung Browser des Galaxy merkwürdig aussieht. "Kann das wirklich sein?" dachte ich, aber als ich es getestet habe, stellte ich fest, dass im Samsung Browser sogar im mobilen Modus window.innerWidth < 768
als false zurückgegeben wird, was eine seltsame Situation darstellt.
Ich konnte es nicht glauben. Es ist schon seltsam, dass es nur im Samsung Browser so ist, aber ich fand auch heraus, dass selbst im Entwicklermodus von Chrome und Firefox auf dem PC false zurückgegeben wird.
Verschiedene Versuche zur Problemlösung
Ich habe sofort andere Methoden getestet.
1. window.innerWidth
const isMobile = window.innerWidth < 768;
✅ Funktioniert normalerweise in jedem Browser
❌ Gibt im Samsung Browser und im Entwicklermodus von Chrome/Firefox false zurück (Fehlschlag)
2. document.documentElement.clientWidth
hinzufügen
const isMobile = (window.innerWidth || document.documentElement.clientWidth) < 768;
✅ Logisch sicherer Code
❌ Immer noch false im Samsung Browser und im Entwicklermodus (Fehlschlag)
3. Verwendung von window.matchMedia('(max-width: 767px)')
const isMobile = window.matchMedia('(max-width: 767px)').matches;
✅ Funktioniert in allen Browsern einwandfrei! (Erfolg 🎉)
Nach dieser Erkenntnis kam ich zu dem Schluss.
Beim Bestimmen, ob es sich um ein mobiles Gerät handelt, sollte window.matchMedia
verwendet werden.
Warum ist das passiert?
Um ehrlich zu sein, ist es schwierig, die genaue Ursache zu wissen, ohne den Quellcode des Browsers direkt anzusehen. Aber ich kann spekulieren.
-
Unterschiede in der Rendering-Methode des Samsung Browsers
Der Samsung Browser basiert auf Chromium, hat aber verschiedene benutzerdefinierte Optimierungen. In diesem Prozess könnte der Wert vonwindow.innerWidth
anders funktionieren als in herkömmlichen mobilen Browsern. -
Grund für das Verhalten im Entwicklermodus von PC Chrome & Firefox
Wenn die Funktion "Mobile Ansicht" im Entwicklermodus aktiviert ist, passt der Browser nicht nur die Bildschirmgröße an, sondern ändert auch intern verschiedene Einstellungen. Jedoch emuliert nicht jede Umgebung ein echtes mobiles Gerät zu 100%. Der Grund, warum der Wert vonwindow.innerWidth
sich im Entwicklermodus anders verhält als auf echten Geräten, könnte daran liegen. -
Unterschiede im Umgang mit Scrollbalken
window.innerWidth
umfasst die Breite des Viewports, währenddocument.documentElement.clientWidth
die tatsächliche Inhaltsbreite ohne Scrollbalken zurückgibt.
Verarbeitet der Samsung Browser möglicherweise intern Scrollbalken anders? Aber diese Hypothese konnte nicht alle Phänomene erklären.
Zusammenfassend…
Verwenden wir matchMedia
, um mobile Geräte zu überprüfen
Durch diese Erfahrung habe ich gelernt, dass Methoden wie window.innerWidth
nicht zuverlässig sind.
In Zukunft ist es sicherer, matchMedia
so zu verwenden:
const isMobile = window.matchMedia('(max-width: 767px)').matches;
📌 Die Verwendung dieser Methode bedeutet
✅ Funktioniert nahtlos in allen Browsern.
✅ Konsistente Ergebnisse auch im Entwicklermodus.
✅ Funktioniert einwandfrei in besonderen Umgebungen wie dem Samsung Browser.
Manchmal denke ich, dass solche unerwarteten Bugs Teil des Lernprozesses sind, um ein guter Entwickler zu werden. Auf jeden Fall hat mir der Samsung Browser heute (?) die Notwendigkeit von matchMedia
verdeutlicht. 😆
Add a New Comment