https://zerotrickpony.com/articles/browser-bugs/ Fifty problems with standard web APIs in 2025 Zero Trick Pony - December 2025 Recently, I made a free game. It's a little mystery investigation game which I was inspired to write after enjoying games like Case of the Golden Idol, Roottrees are Dead, and Return of the Obra Dinn. I thought my UX ideas were pretty simple, so I decided to implement it in HTML5. [game-scree] I know, I know: games should be made with game engines. But listen: The game is mostly text. It has a dirt simple single-page ("SPA") type layout, static images, a few fonts, a few sounds, and that's it. No need for a backing server, no 3D graphics, no complex animations, and no particularly novel interactions. Just a single page load, and then clicking and reading. I figured it should be easy to make this game (app, really) work on multiple browsers and devices, so that players could access it without a native install. The web has supported these basic functions for over a decade. Surely in the year 2025, I thought, HTML5 is a good choice for these simple needs. It's the future now! What really happened was, I hit over 50 surprising problems related to gaps in web standards, requiring me to spend over half of the total development time on rework for cross-browser and cross-device support. In this article I'd like to list the problems I hit, as an illustration of what a novice web developer faces on the modern web today. I'll give some simple advice on reducing rework costs, and conclude with some points on what web standards in 2025 do and don't do for us. Surely this is my fault [tombstone] I know, I know: new features are always being added to browsers. There's always going to be some "wet paint" in web standards. If I make a web project that depends on the newest features, it's not going to work everywhere. You might be thinking that in order to hit 50+ cross-browser problems, I must have used the hottest, newest, most experimental web APIs, and that was all my fault. The common wisdom is that if only I restrain myself to the "safe harbor" of the oldest, most time-tested parts of the standard web, then I can rest assured that my web page will work on any "modern" browser and device. But sadly, no. Unfortunately some of the most buggy, glitchy, and/or divergent behaviors I found were in 20+ year old standard web features. It's not (just) the new stuff. I was surprised to find no clear safe harbor feature set for building polished, interactive web-based projects, even if they are pretty simple. Even with other projects that were barely interactive, I've hit fairly important platform and browser variances, and needed at least some rework for multiple browsers. Even so, I imagine that an experienced web developer could read the list of problems below and nod to themselves knowingly: "sure, these are all common pitfalls. That's why we have frameworks that polyfill many of these problems, and experienced designers and frontend engineers who know all the best practices." Perhaps that's true, but my point is: should it be? If a "standard platform" requires a giant device testing lab and a priesthood of finger-wagging frontend druids with trauma response for engineering intuition, is this "standard" really helping us a lot? Even if web standards don't let us live the dream of "write once, run everywhere", shouldn't it at least be predictable where the problems are going to be? The novice web developer experience The way I ended up hitting all these nasty surprises was not as naive as it may sound. I am not a novice web developer; I am, unhappily, one of the druids. I did not naively blunder into cross-browser pitfalls, I'm perfectly well aware that huge browser differences exist (spoiler: mobile) and need design consideration, and testing. But I did accidentally simulate the naive web developer experience with my game project, because of how I was prototyping. In game development, the core game mechanics have to be fun or else the rest of the game is not worth making. So I whipped up a prototype wireframe in HTML5 to get a feel for core puzzle mechanics, purposely disregarding cross platform considerations. I willfully ignored phones and tablets and Safari, and iterated just on my own MacBook with only one browser. Only later, after the wireframe game mechanics had been refined with playtesting, did I decide to polish the prototype into a cross-browser game that also worked well on mobile. If you work at a giant company you wouldn't work like this; in fact you probably wouldn't get to design the UX at all, because you'd receive the proposed interactions from a paid UX designer. But a new developer working alone probably would do this? And why shouldn't they? It should be reasonable to get an idea working on one's own computer first, and not be surprised later by massive rework on a second device/browser. So, where are we on that in 2025? To find out, I compiled all the browser bugs and rework tasks from my game project into this list. TLDR: buy an old iPhone and test with it daily If you don't read the rest of this rant, I can sum up my advice as just this: if you're making a web project, even a simple one, do your rapid, many-times-a-day iteration loop testing on an older iPhone as your test mule. Yes this is a pain, because none of us are programming on an iPhone soft keyboard. We're sitting at a computer or laptop, and so that's the platform it's most natural to iterate on. Most frontend tools do not make it easy to have a quick edit-and-reload cycle with a real mobile device. So you'll have to either frequently push to a private web server, or use some exotic ssh tunnel contraption, to get it so that your test mule iPhone can view your test web project. This is not because iPhones are good, it's because they're bad. iPhones are more peculiar and less compliant than any other device I tried. I promise that if you get your web project looking good and working smoothly on a crappy iPhone, your residual costs to test and polish on all other platforms and browsers will be fairly low. (For extra bravery, I recommend Firefox iOS instead of Safari, because it is the most buggy, least compliant browser I was able to find. If it works on Firefox iOS it's going to work anywhere. See below.) Yes all the desktop browsers have some form of "design for mobile" mode, and that's better than nothing. But these tools will not reveal 80% of the problems I've described below. Not even the Safari responsive design mode. Not even the XCode device simulator. If you'd like to hear more, then let's start with some gleeful indignation at one of the biggest culprits in web development: Culprit #1: Apple has opinions Writing this with fresh bruises from my iOS testing lab, I feel like it's fair to say that Apple's mobile devices (iPhone, iPad) wilfully and unapologetically diverge from the rest of the web more than any other platform. Safari has a few bugs and is the slowest to support any given web API. But this section is not about Safari's bugs and sandbagging; more on that below. This section is just about Safari's strong opinions. Here are few issues I hit: Can't use the whole screen In a game, and arguably in any well designed UX, the application wants to use all the available screen space. The design should neither waste space on unintended gutters or dead pixels, nor should it confuse the user by letting important information fall below the fold where the user will have to scroll to get at it, or will be confused because they won't notice it. I want to simply fill the whole canvas but not overspill it, and this is comically difficult on iOS. [browser-ba] Mandatory automatic resizing: First, the navigation bar at the top of the screen will appear and dissappear depending on the user's most recent gesture. There is no event your application can receive to know this is happening, nor any measurement you can take to detect it. [surprising problem #1] The standard CSS features vw and vh units are broken by this behavior, so trying to create a whole-page user experience will break on iOS Safari. Broken CSS units: Experienced web developers have tried complicated tricks to work around this resizing behavior. Later, new units were introduced to CSS to try to give the web page more control over this. And although newer Safari iOS versions support them, Firefox iOS still doesn't. [#2] Anti-competitive non-standards: Relatedly, there is a Fullscreen API in the web standards, which every browser supports... except Safari iPhone. [3] The community hypothesizes that fullscreen is purposely hobbled on iOS so that Apple can sell more native iOS games without web-based games being a viable competitor. When I considered using the fullscreen web standard to give my game better use of the screen, I was thwarted by this. Useless fullscreen behavior: The Fullscreen API is supposed to work on iPad, and I wasted time trying to offer it to my users. But it has three ridiculous problems: First, it replaces the top of the screen with a black area and an irremovable "X" which doesn't actually reclaim any more space than the address bar would have. [4] Second, if the user scrolls down in any element anywhere on the page, full-screen mode ends. [5] [ios-fullsc] Third, Safari will refuse to summon the soft keyboard if fullscreen is currently on. Newer versions of Safari simply exit fullscreen, but in iOS 12 I encountered this hilarious error dialog informing the user that Apple believes the web page is phishing them. (!) [6] Since my game had both scrolling elements and occasionally needed the keyboard, I gave up in disgust so now I simply hide the fullscreen button on iOS. Workarounds: My solutions were to (a) give up on the Fullscreen API on iOS, (b) use position:fixed and some cleverness with CSS transforms to fill the screen at least horizontally, and (c) to blindly add in some height fudge factors to try to stay below the unknowable threshold of vertical scrolling on these browsers. My game now uses almost the whole screen on iOS. Touch screen problems Apple's mobile browser is perfectly okay for scrolling to read articles and tapping hyperlinks. But for my game I needed to design more interactive elements. Although I tried to keep it simple, I was still hit by a number of Apple-specific surprises: Dragging does what: Dragging with the mouse on a desktop browser will drag any draggable elements, or do text selection otherwise. But on Safari iOS, dragging a finger will only scroll. [7] Even if the touched area isn't scrollable, and even if the finger lands on a draggable element, swiping gestures only scroll. If the user does a compound press-and-hold-and-then-drag gesture, then on Android this will drag the draggable element but on iOS it will select text instead. [8] I was able to fix this with a liberal sprinkling of user-select:none styles on many more elements than Android needed. What is scrollable: In the name of saving space and beautifying the display, Apple defaulted us all to the "overlay" style of scroll bars. These elements are translucent, narrow, or entirely invisible for most of their lifetime. The result looks simple and attractive, and next time I want to print out my phone's screen and hang it on my wall as art, I'll thank them for that. The rest of the time, this makes it impossible for the user to discern which areas of the screen are scrollable. This is probably a perfectly reasonable tradeoff decision for when the browser is displaying a wikipedia article about raccoons. But for anything more interactive, the inability for the user to discover what is scrollable is pretty bad. I had to add on-screen glinting elements to draw the user's attention to the otherwise invisible scrolling areas. [9] [tap-test-s] Apple's finger location algorithm: I assigned click Event listeners to various on-screen objects, some of which were