Vandaag had ik een echt gênante ervaring. Zoals gewoonlijk gebruikte ik window.innerWidth
om de breedte van de browser te meten en schreef ik de code zodat isMobile = true
werd als het minder dan 768px was. Ik had grondig getest, op verschillende apparaten zoals de iPhone en Galaxy, en controleerde die op Safari, Chrome en de Brave-browser om te bevestigen dat er geen problemen waren.
Maar…
Een kennis vertelde me plotseling dat mijn webapplicatie er vreemd uitzag op de Samsung-browser van de Galaxy. "Zou dat echt waar zijn?" Maar toen ik zelf testte, ontdekte ik dat in de Samsung-browser zelfs op mobiele apparaten window.innerWidth < 768
als false terugkeerde, wat een vreemde situatie was.
Ik begreep het niet. Het was al vreemd dat dit alleen in de Samsung-browser gebeurde, maar ik ontdekte ook dat de Chrome- en Firefox-browsers op de PC in de ontwikkelaarmodus ook false teruggaven wanneer ik het mobiele scherm controleerde.
Verschillende pogingen om het probleem op te lossen
Ik testte onmiddellijk andere methoden.
1. window.innerWidth
const isMobile = window.innerWidth < 768;
✅ Werkt normaal op reguliere browsers
❌ Retourneert false in de Samsung-browser en PC Chrome/Firefox ontwikkelaar modus (mislukt)
2. document.documentElement.clientWidth
toegevoegd
const isMobile = (window.innerWidth || document.documentElement.clientWidth) < 768;
✅ Logisch veilige code
❌ Nog steeds false in Samsung-browser en ontwikkelaar modus (mislukt)
3. Gebruik van window.matchMedia('(max-width: 767px)')
const isMobile = window.matchMedia('(max-width: 767px)').matches;
✅ Werkt normaal in alle browsers! (succes 🎉)
Na deze resultaten trok ik mijn conclusie.
Voortaan moet window.matchMedia
worden gebruikt om de mobiele status te bepalen.
Waarom gebeurde dit?
Eerlijk gezegd is het moeilijk om de exacte oorzaak te kennen zonder de interne bronnen van de browser te bekijken. Maar we kunnen wel speculeren.
-
Verschil in renderingswijze van de Samsung-browser
De Samsung-browser is Chromium-gebaseerd, maar heeft verschillende aangepaste optimalisaties. Dit kan dewindow.innerWidth
waarde anders laten functioneren dan in andere mobiele browsers. -
Reden voor PC Chrome & Firefox ontwikkelaar modus
Wanneer je de "mobiele weergave" functie in de ontwikkelaar modus activeert, past de browser niet alleen de schermgrootte aan, maar verandert hij ook intern verschillende instellingen. Echter, niet alle omgevingen emuleren een echt mobiel apparaat 100% perfect. Dit kan de reden zijn waarom dewindow.innerWidth
waarde anders functioneert dan op echte apparaten. -
Verschil in het al dan niet opnemen van de scrollbar
window.innerWidth
omvat de breedte van de viewport, terwijldocument.documentElement.clientWidth
de werkelijke breedte van de inhoud zonder scrollbar retourneert.
Is het mogelijk dat de Samsung-browser scrollbar intern anders behandelt? Maar die hypothese kon niet alle fenomenen verklaren.
In conclusie…
Gebruik in de toekomst matchMedia
om de mobiele status te controleren
Door deze ervaring realiseerde ik me dat methoden zoals window.innerWidth
niet betrouwbaar zijn.
Voortaan is het veiliger om matchMedia
zoals hieronder te gebruiken om de mobiele omgeving te bepalen.
const isMobile = window.matchMedia('(max-width: 767px)').matches;
📌 Als je deze methode gebruikt
✅ Werkt normaal in alle browsers.
✅ Levert consistente resultaten in de ontwikkelaar modus.
✅ Functioneert probleemloos in vreemde omgevingen zoals de Samsung-browser.
Soms denk ik dat ontmoetingen met deze onverwachte bugs deel uitmaken van het proces om een betere ontwikkelaar te worden. Hoe dan ook, vandaag dankte ik de Samsung-browser(?) voor het realiseren van de noodzaak van matchMedia
. 😆
댓글이 없습니다.