The Angle Bracket was a tournament of HTML tags, conducted via 57 Twitter polls in 7 rounds, conducted over a week. Apart from the final, each round consisted of games of 4 tags (because Twitter polls can only have 4 options) in which the first and second place finishers made it to the next round.
In a proper bracket competition everybody is seeded evenly across the competition by how likely they are to win, and you can draw a cute little tree structure as players are eliminated. Unfortunately I didn't think of this in advance, and also I had no idea which tags would or wouldn't be popular, so every round I randomized the winners of the previous round into new games. So you can't draw a tree. I'm sorry. Next time.
Scroll down to read the story of the tournament as it unfolded. You can click or tap any game to see the exact scores.
This was the wild west round; every tag from the HTML 5 spec (uhhhh except caption
because I accidentally left it out).
Less chaotic than round 1, less brutal than round 3, round 2 was a temporary calm before the storm.
Interesting that related tags often leave in the same round -- dt
and dd
, the ruby
trio, sub
and sup
, del
and ins
went in round 1, but fieldset
and legend
both made it to round 2 and then got eliminated at the same time, as did all the h*
tags, and em
and strong
.
blockquote
An oldie and a goodie, blockquote
was up against style
and head
in game 3 and there's no shame losing to those heavyweights.
dl
Since dt
and dd
were eliminated in round 1, the writing was on the wall for dl
, but I was glad to see people appreciated its value enough to get past round 1. It lost game 7 to script
and marquee
, both of whom went very far indeed.
main
Look, nobody gives a shit about main
. I have no idea how it managed to beat iframe
in round 1.
menu
A cute little semantic tag, menu
was never going to be a finalist, and it drew ul
and table
in game 11.
It was another tough round for the unloved embed category.
audio
Where would podcasts be without the stalwart audio
tag? We're going to find out, because we just got rid of it.
picture
Complex but powerful, picture lets you load images that look good on any device at the cost of a great deal of tedious markup. Your favorite framework's image-optimization feature probably uses this tag, but actual humans are probably just using img
.
After a tough round 1, the remaining tags in the Forms category were pretty strong in round 2.
fieldset
& legend
Clever but only occasionally useful, if your form is so complicated that you need fieldset
, you're probably doing something wrong. With it goes legend
, which even people who use fieldset
seldom use.
Given that the only tag eliminated in the scripting category was noscript
, I think it's arguable to say that no actual scripting tags were eliminated, presaging the strength of web app voters in later rounds.
noscript
No chance.
Almost no section tags got eliminated in round 1, but round 2 was a real winnower for this category.
address
Honestly kind of weird that the spec considers this a section rather than a block or a text element, but what do I know? Confidently semantic, address was too pure for this world.
aside
A delightfully semantic tag, game 12 had it up against span
and title
and that's a tough game.
h1
, h2
, h5
, h6
and hgroup
h3
and h4
were unlucky in round 1 but round 2 decided none of the header tags were essential, not even h1
, which lost to div
(obviously) and section
(surprisingly) in game 5.
Round 2 saw the exits of table
's remaining child tags, leaving it non-functional but a symbolic standard-bearer for at least one more round.
tbody
If nobody's using thead
and tfoot
, nobody's using tbody
. It only survived because game 7 in round 1 was a very weak match.
th
With th
eliminated, table
was the last tag standing in the category.
Text tags were once again the weakest category in round 2, with nearly 4 in 5 tags kicked out this round.
abbr
Old, solidly semantic but ultimately somewhat unloved, we say goodbye to abbr
.
b
Like i
and u
, the tag formerly known as Bold has been retroactively given a new name and a semantic purpose, it is now the comically try-hard Bring Attention To element which, very luckily, means it renders as bold in most browsers. It lost game 11 to ul
and table
, which seems fair.
br
The line break element is still called the line break element, unlike similar older tags which have been renamed. A convenient, get-it-done tool in any developer's toolset, it lost game 9 to button
and label
, a sign of things to come.
cite
A throwback to the early academic origins of HTML, when Tim expected most people would be writing scientific papers and would need to cite each other all the time, this tag still gets a lot of use because people really do cite papers online all the time, in addition to everything else we now use the web for.
em
& strong
The semantic replacements for i
and b
that never fully replaced either, nobody's too broken up about seeing these go.
time
An adorable, pure-hearted little semantic tag, it was up against select
and header
in game 13, so it was time to go.
details
If you've looked at the markup of this site you'll know I'm a big fan of details
, but sadly the public was not swayed.
dialog
A stylable equivalent to the much-maligned JavaScript alert()
box, dialog
is not supported in the current version of Firefox and Safari is still working on it. I imagine there's an entertaining debate going on inside Mozilla about why they shouldn't support making modals.
area
area
only survived to round 2 by drawing extremely weak opponents in round 1, and with map
already eliminated there was no chance for it.
Only 12 tags exited in round 3, so I'm not comparing by category any more, we'll go tag by tag.
li
& ul
They made it to round 3, but lists are gone. In this new pared-down HTML you're gonna have to add bullets to divs.
label
Accessibility breathes its last as the final tag that attempts to help non-visual browsers falls in game 2 to img
and html
.
select
& option
You want a drop-down menu? Fuck you. Build it in JavaScript.
head
, title
& meta
All the remaining meta tags fell out in the same round, each in different games. This version of HTML is not for search engines either.
header
& footer
Continuing the pattern of paired elements exiting simultaneously, these semantic stalwarts exited in games 6 and 7.
section
It outlasted many of its confusingly-similar peers, but no more sections for you. Only divs!
code
The second-to-last semantic tag is out of the tournament, losing to body
and script
in game 4, but code
is the MVP of this particular website; every single tag is a code
tag.
The tags that survived to round 4 showed some clear trends:
table
having no child elements, you'd be hard pressed to mark up any kind of document.nav
is the last tag standinglabel
the last to gometa
itselfstyle
, another warning sign for CSS as we continue to strip features from the language.span
and form
lost their games in round 3, but to make it an even 4 tags per round they got promoted to round 4 on the basis of being the highest-scored of the losing tags.
Also clear by this point was the groundswell of fan support for marquee
, with dozens of people drawing attention to the tournament specifically to vote for it.
p
p
barely counts as a semantic tag but it was still too semantic for the brutal, bare-bones HTML of round 5, so away it goes.
form
form
losing to input
makes it impossible to submit a form using HTML, but still lets you build forms in JavaScript, like in React, and the preferences of JavaScripters are definitely making themselves felt now.
style
Another tragedy. Now if you want to style stuff you're going to have to do it using style
attributes. Not coincidentally, adding style via attributes is another React idiom.
html
How dare you. As everyone points out, the html
tag is superfluous, because it's always implied if you leave it out. But still! It's the spiritual root of the whole thing!
body
With html
already gone, it was clear body
, another implied tag, wasn't going to make it through this round.
nav
The very last semantic tag is gone. It's just pure functionality now.
table
Long rendered useless by the absence of all its child tags, table takes its final bow.
span
Not only did span
lose to div
, it came dead last in game 1. An ignominous fate.
The version of HTML presented by round 5 reveals some uncomfortable truths about ourselves as developers. We threw out accessibility, semantic markup, discoverability, even style sheets. The remaining tags can build a web app -- you've still got canvas
, so quite a fancy web app -- sure, but at what cost? And why the fuck is marquee
still here?
Throwing away half of these tags is going to be a nightmare.
img
The grand-daddy of the commercial web, the image tag, has been cruelly dispatched. Sure, you can bring in images using style attributes on a div
, but where's the dignity?
button
& input
The final form elements bite the dust. Good luck capturing any user input, motherfuckers.
canvas
The powerful, flexible canvas, its own weird universe of APIs, has a ton of fans, as evidenced by it sticking it out all the way until now. But it didn't make the final 4.
This version of HTML is a nightmare. To do anything vaguely useful you have to resort to horrible hacks, and of course, because web developers are who we are, that's what people started doing at this point in the competition:
The final 4 had been predicted 3 rounds earlier by Howard, and his reward was a donation in his name to Codebar, which he matched with his own funds, because he's a good sport.
a
41.1%
marquee
26.1%
div
19.6%
script
13.2%
div
The mighty have fallen! A lot of people were worried (or gleeful) that div
was gonna take the whole tournament, but it was not to be, primarily because of the by-now unstoppable force of meme voters piling on to marquee
, especially Danielle Leong
script
You'd think the ejection of script
would mean the end of JavaScript shenanigans, but Alex's all-marquee rocket ship disproves that.
It all came down to a choice, emblamatic of the times we live in.
In one corner, the a tag. The H in HTML and HTTP, the basis of web 1.0, the thing that makes the web a web. A semantic tag of unmatched simplicity, purity and power, it says "the words in this tag are related to this URL". That relationship is the web.
In the other corner, marquee, a useless remnant of the browser wars of the 90s, propelled to the final round through a combination of nostalgia for a simpler time and simply for the lulz.
Would reality win over memes? It was a very 2021 question.
a
71.3%
marquee
28.7%
a
And that was it. After 57 polls, 7 rounds, and over 76,000 votes cast, we had our champion. To my enormous relief, a
was our victor. It's just not a web without it.
Thanks to everyone who voted, this competition was enormous fun.
Round 1 exits
As you'd expect from a completely randomized tag set, there were some real surprises in this round, but there are also a lot of tags of dubious value and they mostly exited in round 1. I've grouped the results into the categories defined for each tag in the spec.
Because there are so many tags in round 1, per-tag commentary is hidden; you can click or tap any tag to see it.
Block tags: 50% eliminated
Some old favorites drew tough games and were eliminated early;
dt
was robbed, robbed I say.dt
&dd
Originally Definition List,
dl
is now technically a Description List. But what it really is is a key-value map in HTML! It's cruelly under-used and I'm sad to see it go.figure
andfigcaption
Used to show some vaguely-defined content that might need a caption to explain what it is. Very niche. Nobody's sad about these.
hr
Originally meant Horizontal Rule, but since that's not even slightly semantic it now means thematic break which is a phrase that I suppose has an h and an r in it somewhere.
ol
A really tough break to be put up against
header
andtable
in game 12.ul
was much luckier and dominated game 21.pre
A cruel rejection of a faithful workhorse.
pre
isn't semantic but it's useful, dammit.Embeds: 70% eliminated
It was a brutal first round for embeds of all kinds; they were the second most-eliminated category of tags.
embed
embed
is how Netscape brought in content that was delivered by plug-ins. Nobody uses Netscape anymore, but more surprising is that the entire concept of plugins has essentially vanished. The final holdout, Flash, was end of lifed in January 2021.iframe
This was a shocking result given
iframe
's ubiquity across the web, losing tohead
andmain
in game 5.head
is obviously a strong tag, butmain
? Despite its ubiquity, devs don't loveiframe
.object
¶m
object
works likeembed
except it wasn't written in a hurry in the middle of the night by an overcaffeinated nerd at Netscape. It is similarly unhelpful in the modern, mostly plugin-free web, although people do use it to embed PDFs.video
,source
&track
The Netflix tags! They include a passing glance at accessibility in the
track
tag which is routinely ignored.Forms: 42% eliminated
In a pattern we're going to see repeated several times, all the newer, accessibility-minded stuff got kicked out early. You bastards.
datalist
A select with built-in autocomplete! This is so good! But it was up against
meta
andblockquote
in game 15, tough to beat.meter
It... shows a little gauge. Honestly, not crying any tears about losing this mysterious little tag.
optgroup
Who is grouping options in dropdowns? Nobody, that's who.
output
This is supposed to make sections of your page that change as a result of user input more accessible by making them aria-live but there are some questions as to how useful that really is.
progress
It's like
meter
but it's expected to move and... why do we have this?textarea
How DARE you. One of the foundational tags of web apps, cruelly discarded. But it was up against
p
andhtml
in game 11 so it had no chance.Metadata: 30% eliminated
With only a third of the tags in this category eliminated, it was one of the strongest early categories, although it included early warning signs for CSS fans.
base
Yeah, okay, it's useful to be able to set the base href, but we can all agree it's pretty niche.
link
A highly controversial result in game 1, round 1!
nav
andsection
, semantic but hardly fundamental, beatlink
, the core tag for (amongst other things) pulling in CSS. As we're going to see, CSS had a rough time in this tournament.Scripting: 40% eliminated
There aren't a lot of scripting tags to begin with, and it turns out only one we really care about.
slot
&template
Powerful as they are, not a lot of people are authoring web components right now, so it was unsurprising to see these exit early.
Sections: 20% eliminated
This was the strongest category in round 1, with passionate fans and a bunch of surprisingly close games.
article
Highly useful in a semantic sense but also confusingly similar to
section
in practice,article
also drew a brutal first game againsta
andimg
, and there's no coming back from that.h3
&h4
In real usage data
h3
andh4
are far more popular thanh5
andh6
, which both survived to round 2, so I'm going to say they were unlucky victims of the entirely random seeding of the first round.Tables: 66% eliminated
I feel like maybe the backlash against table layouts was learned too well; tables are nifty data structures and it was cruel to eviscerate the category in round 1.
col
&colgroup
I'll be honest, I didn't know these tags existed until I read the spec. They're certainly nifty semantically, and to make styling columns possible, but they're hardly core to the table experience. They don't even hold data!
tfoot
&thead
Be honest, when was the last time you defined a footer for a table? Headers are a lot more useful but, still, hardly essential.
td
&tr
Unlike the other four eliminated in this round, these are the very core of the table experience! Game 23 was controversial, with
li
andpre
beating the arguably more usefultd
(and even more surprisingly,span
).tr
's loss in game 23 made more sense as it was up against heavyweightsscript
andtitle
.Text: 73% eliminated
The most-eliminated tag category, round 1 saw the immediate exit of a huge number of marginally useful semantic tags, and also some big surprises.
bdi
&bdo
Unless you regularly develop for languages that read right-to-left, you probably haven't used these tags. Internationalization was an early victim of the winnowing process of the tournament.
data
The purest of purely semantic tags, it's no surprise to see this exit early.
dfn
Essentially an inline equivalent of
dt
, a very niche tag.i
Originally for italics,
i
is one of several early non-semantic tags that have been retconned into a different mean. It's now Idiomatic text, which we can all agree is some bullshit.kbd
The distinction between
kbd
andcode
is pretty fine, so no wonder this exited early.mark
Who uses this, other than search engines? Do they even use it?
q
The non-block equivalent of
blockquote
; apparently browsers enclose the text in ? Neat. Not very useful.ruby
,rp
&rt
Another victim of our manifest lack of concern for internationalization, all three of the ruby tags exited in round 1.
rp
takes my prize for being the most hacky solution to a markup problem I've ever seen, existing solely to hide the parentheses you need to include for your text to make sense in browsers that don't understand theruby
tag.rt
holds the distinction of having the fewest votes of any tag in round 1, being absolutely crushed byul
in game 21.s
The strikethrough element is not really a semantic tag, but it's so useful that it has survived many generations of HTML. Hoever, not useful enough to save it in game 22 against
em
anddl
samp
I understand why
samp
andoutput
are different but I am not sure how many authors are really going to care enough to think about that.small
Absolutely not a semantic tag, it nevertheless remains useful to be able to define "small print" as actually being small, so this tag has survived in the spec. But not in the tournament.
sub
&sup
Venerable survivors of HTML's academic origins, superscript and subscript aren't really semantic but they're useful as hell. Both drew tough opponents in round 1:
sub
lost toselect
andsummary
,sup
toscript
andtitle
. No dishonor in defeat to such opponents.u
Previously the underline element, an entirely non-semantic but ancient tag,
u
is now technically the Unarticulated Annotation element which, surprise, usually renders as an underline without upsetting semantic purists.var
An obscure tag with academic origins, nearly useless except to mathematicians,
var
scored the second lowest of any tag in round one. Only the deeply unlovedrt
scored lower.Random other tags
del
&ins
Who the fuck is using these anyway, Google Docs?
summary
Although
summary
didn't make it, its (still useful) parentdetails
survived! A lovely little combo, you are reading content in a summary/details element pair right this second. It was also a close game:summary
lost tooption
by just 0.1%.map
The oldest of old school, the image map, cruelly cut down. Its child
area
survived, but mostly as a result of being in an extremely weak game 14.