For most of a decade, the fastest way to spot an ambitious stylesheet was the little forest of prefixes at the top of every rule: -webkit-, -moz-, -ms-, -o-. They looked like progress. They were, mostly, technical debt with a hopeful face.
Vendor prefixes were meant to let browsers ship experimental features without freezing an unfinished specification into the platform forever. An author could opt in to a work-in-progress -webkit-border-radius, and when the standard settled, everyone would quietly migrate to the unprefixed version. Graceful, iterative, sensible.
That is not what happened.
The problem was economic, not technical. Once enough sites used -webkit- features, the prefix stopped being experimental and became a de facto requirement. Other engines faced a choice: implement their competitor's prefix or render broken pages. Some genuinely shipped -webkit- support in non-WebKit browsers — an absurd outcome that made the prefix meaningless as a signal.
A prefix that every engine must honour is not an experiment. It is an unversioned standard with worse ergonomics.
Meanwhile authors copied gradient snippets from blogs and pasted four near-identical lines, each with subtly different syntax. The -webkit- radial gradient and the standard one did not always agree on angle keywords, colour-stop order, or whether to bottom or bottom was correct. The result was code nobody understood and nobody dared delete.
/* The museum piece */
.box {
-webkit-box-shadow: 0 2px 6px rgba(0,0,0,.2);
-moz-box-shadow: 0 2px 6px rgba(0,0,0,.2);
box-shadow: 0 2px 6px rgba(0,0,0,.2);
}
/* What you write today */
.box {
box-shadow: 0 2px 6px rgba(0,0,0,.2);
}
Nearly every prefixed property that mattered eventually shipped unprefixed and stable. The prefixed versions did not disappear — they became landmines. Delete an old -webkit- line and some ancient device in your analytics quietly loses its rounded corners. So the lines stay, accreting.
The durable practice turned out to be the boring one:
@supports to branch on real capability instead of inferring it from a vendor string.-webkit- line for real-world browsers.Vendor extensions failed not because the idea was wrong but because the incentives around them were. The unprefixed standard won for the same reason it always does: it is the one thing every engine agreed to keep supporting, long after the fashion that produced the prefix had passed.