<noframes>
Deprecated in HTML5 specifications. Frames are obsolete.
⚠️ DEPRECATEDDefinition and Usage
The
<noframes> tag is obsolete and non-conforming in modern HTML.
Frames and framesets are completely obsolete in modern web
development.
The <noframes> tag was used in HTML 4 to
provide fallback content for browsers that did not support frames
or had frames disabled.
It was placed inside a <frameset> element and
contained alternative HTML content that would be displayed if the
browser couldn't render frames.
Browser support and standards
Browser rendering and modern HTML conformance are different questions. Check the current element reference for the browsers and features your project needs; the older source version table is not a current compatibility guarantee.
Read the MDN element referenceAttributes
The <noframes> tag supports the
Global Attributes in HTML.
However, this tag is obsolete and should not be used in modern HTML.
Old Usage (HTML 4)
In HTML 4, the <noframes> tag was used with
framesets:
Old HTML 4 Example (Don't Use)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>Old Frameset Page</title>
</head>
<frameset cols="25%, 75%">
<frame src="menu.html" name="menu">
<frame src="content.html" name="content">
<noframes>
<body>
<h1>Your browser does not support frames</h1>
<p>This website requires frames to display properly.</p>
<p>Please upgrade your browser or <a href="no-frames.html">click here</a> for a non-frames version.</p>
</body>
</noframes>
</frameset>
</html>
Why Frames Were Deprecated
- SEO Problems: Search engines couldn't properly index framed content
- Bookmark Issues: Users couldn't bookmark specific pages within framesets
- Accessibility: Screen readers had major difficulty navigating framed layouts
- Usability: Back button behavior was confusing and unpredictable
- Printing Problems: Printing framed pages was difficult or impossible
- Mobile Incompatibility: Frames don't work well on mobile devices
- URL Problems: The URL in the address bar didn't reflect the actual content
- Maintenance: Managing multiple HTML files for frames was complex
- Security: Frames introduced security vulnerabilities
- Performance: Loading multiple HTML files was slower than modern techniques
Modern Alternatives
Instead of frames and <noframes>, use modern
HTML5 and CSS:
1. Regular HTML Structure
Use standard HTML elements for layout:
Example - Modern HTML5 Layout
Unavailable or blocked: stylesheet “styles.css”; fragment context “#section1”; fragment context “#section2”. Provide inline styles and scripts, embedded images or the missing HTML context. External requests and browser dialogs stay blocked.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modern Layout</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<h1>Website Header</h1>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<aside>
<h2>Sidebar</h2>
<nav>
<ul>
<li><a href="#section1">Section 1</a></li>
<li><a href="#section2">Section 2</a></li>
</ul>
</nav>
</aside>
<article>
<h2>Main Content</h2>
<p>This is the main content area.</p>
</article>
</main>
<footer>
<p>© 2025 Your Website</p>
</footer>
</body>
</html>
2. CSS Grid Layout
Create complex layouts with CSS Grid:
Example - CSS Grid
<style>
body {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 200px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
margin: 0;
gap: 10px;
}
header {
grid-area: header;
background: #333;
color: white;
padding: 20px;
}
aside {
grid-area: sidebar;
background: #f4f4f4;
padding: 20px;
}
main {
grid-area: main;
padding: 20px;
}
footer {
grid-area: footer;
background: #333;
color: white;
padding: 20px;
text-align: center;
}
</style>
3. CSS Flexbox Layout
Use Flexbox for flexible layouts:
Example - Flexbox
<style>
body {
display: flex;
flex-direction: column;
min-height: 100vh;
margin: 0;
}
header {
background: #333;
color: white;
padding: 20px;
}
.container {
display: flex;
flex: 1;
}
aside {
width: 200px;
background: #f4f4f4;
padding: 20px;
}
main {
flex: 1;
padding: 20px;
}
footer {
background: #333;
color: white;
padding: 20px;
text-align: center;
}
</style>
<body>
<header>Header</header>
<div class="container">
<aside>Sidebar</aside>
<main>Main Content</main>
</div>
<footer>Footer</footer>
</body>
4. IFrame for Specific Cases
If you need to embed external content, use iframe (sparingly):
Example - IFrame (Use Only When Necessary)
The snippet includes CSS inside its HTML. Unavailable or blocked: embedded content “https://www.google.com/maps/embed?pb=...”. Provide inline styles and scripts, embedded images or the missing HTML context. External requests and browser dialogs stay blocked.
<!-- Only use iframe for embedding external content like maps, videos -->
<h2>Embedded Map</h2>
<iframe
src="https://www.google.com/maps/embed?pb=..."
width="600"
height="450"
style="border:0;"
allowfullscreen=""
loading="lazy">
</iframe>
<!-- Note: iframe is different from frames/frameset -->
<!-- Use it only for embedding third-party content -->
5. Single Page Applications (SPA)
Use JavaScript frameworks for dynamic content:
Example - Concept
<!-- Modern approach with JavaScript -->
<div id="app">
<header>
<nav id="main-nav">
<!-- Navigation links -->
</nav>
</header>
<main id="content">
<!-- Content loaded dynamically via JavaScript -->
</main>
<footer>
<!-- Footer content -->
</footer>
</div>
<script>
// Load content dynamically using JavaScript
// Frameworks like React, Vue, Angular handle this
</script>
Migration Guide from Framesets
- Assess Your Frameset: Identify what each frame displays (menu, content, header, etc.)
- Combine into Single Page: Merge frame content into a single HTML file with semantic elements
-
Choose Layout Method:
- CSS Grid - Best for complex 2D layouts
- CSS Flexbox - Best for 1D layouts (rows or columns)
- Combination - Use both for different sections
- Update Navigation: Replace frame targets with regular links or JavaScript navigation
- Test Accessibility: Ensure screen readers can navigate your new layout
- Optimize for Mobile: Use responsive design techniques
- Update SEO: Ensure all content is in the main HTML document
- Set Up Redirects: Redirect old frameset URLs to new pages
Comparison: Frames vs Modern Layout
Try it Yourself
Modern Layout Example
Here's what a modern layout looks like (no frames needed):
This layout is SEO-friendly, accessible, mobile-responsive, and maintainable!
Related Tags
-
<frameset>
Deprecated - Defined frameset
-
<frame>
Deprecated - Defined a frame
-
<iframe>
Use for embedding external content
-
<div>
Use for layout containers
-
<section>
Use for semantic sections