content
link_bar
This bar does not reload when you move. That was the entire selling point, and you are using it right now.
1996. Persistent navigation, no reloads, and one address for the whole site whether you wanted that or not. The first single page app, and it broke the same things.
Click through the site below. The content pane changes. Nothing else does.
content
Pages visited: 1 Address bar changes: 0
Four documents are open. Your history knows about one of them.
From home.netscape.com/assist/net_sites/frame_syntax.html, 1997, describing the syntax:
A FRAMESET document has no BODY, and no tags that would normally be placed in the BODY can appear before the FRAMESET tag, or the FRAMESET will be ignored.
No body means there is nowhere for the current state to live. The URL names a container and nothing else. That sentence is the bug, written down as a syntax rule by the people who invented the feature, three years before anybody complained about it.
And here is the same company selling the upside, from frames.html:
It can be given an individual URL, so it can load information independent of the other frames on the page
Each frame gets a URL. The page does not. That is the entire trade, stated as a feature, by the vendor, in the documentation. Nobody was hiding it.
nick.com, captured 11 November 1998. The whole layout document, unedited.
<FRAMESET rows="*,70" border="0" frameborder="0" framespacing="0">
<NOFRAMES>
<BODY>
<h3>Sorry, but this website requires a browser that supports frames</h3>
Come back when you a browser that supports frames.
</BODY>
</NOFRAMES>
<FRAME SRC="/docs/front_page/new_front_page/index.html" name="content" scrolling="auto" frameborder="0" marginheight="0" marginwidth="0">
<FRAMESET cols="*,498" border="0" frameborder="0" framespacing="0">
<FRAME SRC="/docs/link_bar/index.html" name="link_bar" NORESIZE scrolling="no" frameborder="0" marginheight="0" marginwidth="0">
<FRAME SRC="http://ad.doubleclick.net/adf/www.nick.com/new_front_page/index.html" name="ad" NORESIZE scrolling="no" frameborder="0" marginheight="0" marginwidth="0">
</FRAMESET>
</FRAMESET>
rows="*,70" then a nested cols="*,498". The star means whatever is left. Layout was a constraint solver expressed in two attributes, years before anything else could do that.ad.doubleclick.net. A third party, in its own browsing context, sitting in the page's own layout grid, on a children's site, in 1998. The frameset invented the ad iframe.NORESIZE scrolling="no" frameborder="0" framespacing="0" on every frame. The whole seam-hiding kit. By 1998 the point of a frameset was to look like it was not a frameset.Come back when you a browser that supports frames.Typo theirs. It is not content, it is a door being closed.
The amateur version of the same idea, hand indented, mistakes intact:
<frameset rows="25%,75%"> <frameset cols="21%,58%,21%"> <frame src="icon.htm" name="icon"SCROLLING="no"> <frame src="top.htm" name="top"SCROLLING="no"> <frame src="icon.htm" name="icon"SCROLLING="no"> </frameset> <frameset cols="21%,79%"> <frame src="list.htm" name="list"><!--Main text display--> <frame src="main.htm" name="main"><!--Index etc. display --> </frameset>
name="icon" is used twice in one frameset, there is no space in name="icon"SCROLLING="no", the outermost <frameset> never closes, and the two comments are attached to the wrong frames. It rendered anyway. That forgiveness is half the story of the era, and it is why anybody could build.
Everything above is a drawing of a browser, not a browser. A frameset document has no body, so it cannot live inside a page like this one at all. Here is a real one instead, served as its own file, rendering in your browser right now.
Open a real frameset Opens in a new tab. Watch the address bar there too.
A personal site captured for this plate is still running a genuine <frameset cols="175px,*"> in 2026, and its <noframes> block is the best sentence in the whole folder: Your browser sadly does not support frames, which it can pull out of my cold, dead hands.
It then does the thing the 1998 sites never bothered with and describes the frames, with direct links to each one.
How to spot a frameset.
http://www.geocities.com/SiliconValley/2288/The address never changes
Navigate the whole site and the URL stays on the container. If you cannot link a friend to the page you are looking at, you are in frames.
◀walks panes, not pagesThe back button walks a frame, not the site
Each frame load is a history entry, so back takes you through panes in the order they happened rather than through pages.
rows="*,70"A star in a size attribute
rows="*,70". It means give this one whatever is left over, and nothing else on the old web sized things that way.
<a href="..." target="_top">target="_top" on an outbound link
The escape hatch. Any link that has to break out of the frameset says so, and its presence tells you a frameset is there even when you cannot see one. It is why every verb in a webring fragment carried a target, since the member pasting it was often a frameset too.
<NOFRAMES><BODY>A <noframes> block that smuggles in a <body>
The frameset document has none of its own, so the fallback has to bring one.
frameborder="0" framespacing="0" border="0"Seam hiding
frameborder="0" framespacing="0" border="0" together on every frame. A frameset that admits it is a frameset is an early one.
🖶usually the navPrinting gives you one pane
Usually the wrong one, and usually the nav.
A frameset solved a real problem with no other answer at the time. Navigation stayed put while content changed, so the menu did not re-download on every click, and on a 28.8k modem that was not a nicety. One file held the layout, so a hundred pages could share it without a build step or a server. It is component reuse, in 1996, with no tooling.
What it cost was the address. The page you were looking at had no name, so it could not be bookmarked, linked, printed whole, or found by a search engine that wanted to send someone to the middle of your site. Every fix since, including the one in the next paragraph, has been an attempt to put the URL back.
One navigation, across a whole site, with no reloads and no build step.