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.

Developer testing a website on a smartphone


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.

  1. 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 von window.innerWidth anders funktionieren als in herkömmlichen mobilen Browsern.

  2. 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 von window.innerWidth sich im Entwicklermodus anders verhält als auf echten Geräten, könnte daran liegen.

  3. Unterschiede im Umgang mit Scrollbalken
    window.innerWidth umfasst die Breite des Viewports, während document.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. 😆