Live Preview
Visual mockup of how a three-column frameset layout looked (modern browsers no longer render framesets):

By the end of this tutorial, you’ll understand how frameset structured legacy multi-pane pages and what to use instead in HTML5.
The HTML <frameset> tag defined split-window layouts that held multiple <frame> panes. This guide covers historical syntax, nesting, attributes, and why CSS grid and iframe replaced frames entirely.
How <frameset> divided the browser window.
Define column and row sizes for panes.
Combine rows and columns with nested framesets.
Content for browsers without frame support.
Modern split layouts without frames.
Why HTML5 removed frameset entirely.
<frameset> Tag?The frameset element (<frameset>) was the layout container for legacy frame-based pages. It replaced the body in some HTML4 documents and defined how the browser window was split into columns or rows, each filled by a <frame>.
Do not use <frameset> or <frame> in new projects. Modern browsers do not render framesets in HTML5 documents. Use CSS grid or flexbox and iframe instead.
Framesets caused bookmarking, accessibility, and SEO problems. HTML5 removed them entirely. Learn frameset to read legacy code, but build layouts with contemporary tools.
The <frameset> tag wrapped <frame> elements and replaced body in frame-based HTML4 pages:
<frameset cols="25%,50%,25%">
<frame src="frame1.html">
<frame src="frame2.html">
<frame src="frame3.html">
</frameset>In this example, the window is divided into three columns. Each frame loads a separate HTML document.
frameset must contain frame or nested frameset elements.cols or rows (not both on the same frameset) to define pane sizes.noframes fallback content inside frameset for accessibility.| Pattern | Code Snippet | Notes |
|---|---|---|
| Three columns | <frameset cols="25%,50%,25%"> | Obsolete layout |
| Two rows | <frameset rows="50%,50%"> | Horizontal split |
| Nested split | <frameset><frameset cols="..."> | Rows + columns combined |
| Frame border | frameborder="1" | Show/hide pane borders |
| Modern replacement | display: grid + iframe | Valid HTML5 approach |
| HTML5 status | Obsolete | Removed from specification |
<frameset> vs CSS GridBoth create multi-pane layouts, but only CSS grid fits modern HTML:
| Feature | <frameset> | CSS Grid |
|---|---|---|
| HTML5 status | Obsolete | Standard, widely used |
| Document model | Multiple top-level HTML documents | Single page with styled regions |
| Bookmarking | Poor (one URL, many panes) | Works normally |
| Accessibility | Poor (removed for good reason) | Semantic landmarks, one focus tree |
| Responsive design | Difficult | Media queries, fr units |
<frameset>, <frame>, and <noframes>These legacy elements worked together as a split-window system:
| Element | Role | When used (historical) |
|---|---|---|
<frameset> | Layout container | Define columns or rows for the window |
<frame> | Individual pane | Load one HTML document per pane |
<noframes> | Fallback content | Alternative page for non-frame browsers |
| Today | Use CSS grid + semantic HTML + iframe instead | |
The <frameset> tag had these historical attributes. All are obsolete in HTML5:
cols LayoutComma-separated column widths (percentages or pixels) for vertical splits.
cols="25%,50%,25%"rows LayoutComma-separated row heights for horizontal splits.
rows="50%,50%"frameborder DeprecatedControl whether borders appear between frames: 0 or 1.
frameborder="1"framespacing DeprecatedPixel spacing between frame panes.
framespacing="10"border DeprecatedBorder width in pixels between frames.
border="2"<frameset cols="50%,50%" frameborder="1" framespacing="10">
<!-- frame elements go here -->
</frameset>The entire frameset element is obsolete. Use CSS grid with grid-template-columns or grid-template-rows in new projects.
Historical frameset patterns plus the modern CSS grid replacement. Legacy examples are for learning only—do not use in new code.
Visual mockup of how a three-column frameset layout looked (modern browsers no longer render framesets):
The primary use of <frameset> was to display multiple documents simultaneously in one window.
<frameset cols="50%, 50%">
<frame src="navigation.html">
<frame src="maincontent.html">
</frameset>Developers once used <frameset> for fixed navigation sidebars, split documentation views, and dashboard-style multi-pane UIs. Today use CSS grid with semantic HTML, server-side includes, or a single-page application architecture instead.
Framesets could be nested to combine rows and columns for more complex layouts.
<frameset rows="50%,50%">
<frame src="topsection.html">
<frameset cols="25%,75%">
<frame src="leftcolumn.html">
<frame src="maincontent.html">
</frameset>
</frameset>Always include <noframes> inside frameset so users without frame support could still read meaningful content.
<frameset cols="50%,50%">
<frame src="nav.html">
<frame src="content.html">
<noframes>
<body>
<p>Your browser does not support frames. <a href="content.html">View main content</a></p>
</body>
</noframes>
</frameset>Use CSS grid with optional iframe elements to achieve split layouts in valid HTML5.
<div class="split-layout">
<iframe src="sidebar-left.html" title="Left sidebar"></iframe>
<iframe src="content.html" title="Main content"></iframe>
<iframe src="sidebar-right.html" title="Right sidebar"></iframe>
</div>Replace frameset column splits with CSS grid and optional iframe panes:
grid-template-columns Define column sizesgrid-template-rows Define row sizesgrid-template-areas Named regions (nested layouts)iframe Embed external panes when needed/* Modern split layout (replaces frameset) */
.split-layout {
display: grid;
grid-template-columns: 25% 50% 25%;
gap: 0.5rem;
min-height: 400px;
}
.split-layout iframe {
width: 100%;
height: 100%;
border: 1px solid #cbd5e1;
border-radius: 6px;
}Live CSS grid split
Framesets were removed partly due to accessibility failures:
nav, main, and aside in one document are easier to navigate.title.frameset split the window into proportional panes.
Child frame elements pointed to separate HTML pages.
Rows and columns could be combined for dashboard-style layouts.
Learn frameset for history. Build with grid and iframe in all new projects.
<frameset> and <frame> are obsolete and not supported in HTML5 documents. Modern browsers will not render frameset layouts.
Frameset and frame were removed from the HTML5 specification. Legacy Internet Explorer supported them, but current Chrome, Firefox, Safari, and Edge do not render framesets in modern documents.
Use these HTML5 approaches instead of frameset and frame.
grid-template-*Bottom line: Do not use <frameset> in new projects. Use CSS grid and semantic HTML for modern split layouts.
While the <frameset> tag played a significant role in early web development, its usage is not recommended today. Frameset and frame are obsolete, break accessibility and SEO, and are unsupported in HTML5 documents.
Adopt CSS grid or flexbox for split layouts and iframe when you need embedded external content. Plan migrations if you maintain very old frame-based codebases.
nav, main, aside)title on every iframeframeset or frame in new projects<frameset>Bookmark these before you ship — they’ll keep you on modern HTML standards.
<frameset> is removed from HTML5.
Defined pane sizes for the window.
LayoutCombined rows and columns.
StructureModern split layout replacement.
ReplacementFrames broke navigation and SEO.
AccessibilityModern browsers skip framesets.
Compatibilitycols or rows, containing frame elements that each loaded a separate HTML document.frameset and frame are obsolete and removed from the HTML5 specification.iframe to embed external pages inline.frameset split the entire window into multiple documents (obsolete). iframe embeds one document inside a page and is valid HTML5.frameset elements to combine row and column splits. Use CSS grid areas for the same effect today.frameset only to read legacy HTML.Replace obsolete framesets with CSS grid in the interactive HTML editor.
6 people found this page helpful