Mega Menu SEO
How to build a mega menu that stays crawlable and doesn't dilute your topical structure — the real-href requirement, the JS-flyout failure mode, hidden-until-hover content, link-budget guidance, mobile parity, and a good-vs-bad markup example.
A mega menu is just internal links wearing a bigger UI, so it lives or dies by the same rules: every link must be a real <a href>. The single most common failure is a JS click/hover flyout that never renders real anchors — it looks linked to a user but silently orphans the pages. Content hidden until hover isn't automatically discounted for being hidden, as long as it's in the initial HTML and not fetched only on interaction — Google says it's taken into account, though identical ranking weight to always-visible content isn't documented. There's no hard link-count ceiling; the real lever is organization — group by category with descriptive anchor text. And your mobile hamburger/accordion needs the same crawlable links (and its own keyboard-tested disclosure), not a trimmed-down version.
TL;DR — A mega menu is a big navigation dropdown that shows lots of links at once, grouped into columns. For SEO it’s just internal links, so the rules are the same: every link should be a real
<a href>so Google can reliably follow it. The most common mistake is building the flyout with JavaScript click handlers instead of real links — it looks fine to a person, but search engines can’t crawl it. On mobile (the hamburger menu), make sure you kept the same links.
What a mega menu is
A mega menu is a disclosed navigation panel — hidden until you hover or click a top-level menu item — that opens to show a lot of links at once, arranged in columns by category so they’re easy to scan. A normal dropdown gives you a single short list. A mega menu gives you “Shoes” opening into Men’s, Women’s, and Kids’ columns, each with its own subcategories. Big online stores use them because they let a shopper jump to a deep category page from anywhere on the site in one click.
The important thing to understand: a mega menu is just a pile of internal links in a fancy container. Everything that’s true about internal links generally is true here. If you haven’t read the internal links write-up in this cluster, start there — this page is the practical, “how do I not break it” companion.
The one rule that matters most
For a search engine to follow a link, it has to be a real HTML link — an <a>
element with an href:
<a href="/shoes/mens/">Men's shoes</a>That’s it. If your mega menu’s links are real <a href> links, you’re 90% of the
way there. The trouble starts when a developer builds the flyout with JavaScript
“click to go here” behavior instead of actual links. To a person, it looks
identical — you click and the page loads. To Google, there’s nothing to follow, so
those pages can quietly go undiscovered.
How to check yours
Right-click the page and choose View Page Source (not “Inspect”) and search for
one of your menu links. If it shows up as <a href="..."> in that raw source,
good. If your menu links only appear when you use Inspect Element (the live,
JavaScript-built version) but not in View Source, that’s the warning sign to hand
your developer.
Don’t forget mobile
On phones your mega menu becomes a hamburger or accordion menu. Teams often trim
that menu to keep it tidy — and accidentally drop links that only existed there.
Google wants your mobile content to match your desktop content, so run the same
check on the mobile menu: are the same links there, and are they real <a href>
links?
Want the deeper version — the JavaScript failure mode in detail, whether hidden-until-hover content is discounted, how many links is too many, and a good-vs-bad markup example? Switch to the Advanced tab.
TL;DR — A mega menu is internal links wearing a bigger UI, so every rule from the internal links write-up applies unchanged — starting with the
<a href>requirement. The #1 real-world failure is a JS click/hover flyout whose links aren’t real anchors: it looks linked to a user but Google can’t crawl it, silently orphaning pages if the menu was their only internal link. Verify with View Source, not Inspect. Content hidden until hover isn’t automatically discounted for being hidden as long as it’s in the initial HTML and not fetched only on interaction — CSS-hidden is fine; AJAX-on-hover is the risk. Google says it takes that content into account, though it hasn’t documented identical ranking weight to always-visible content. No hard link-count ceiling exists (the 100-link rule is a myth), but organization is the real lever: group by category with scannable columns and descriptive anchor text so you don’t pancake your topical structure. Mobile hamburger/accordion needs the same crawlable links, not a trimmed version. Structured data is not a substitute for real links.
Start here: a mega menu is just internal links
I want to set expectations before getting into the specifics. There is nothing magical or separate about “mega menu SEO.” A mega menu is a navigation component built entirely from internal links, and every rule that governs internal links generally — the crawlable-link requirement, descriptive anchor text, the fact that there’s no magic link-count limit — applies here with zero modification. I’m not going to re-derive those; the internal links article in this cluster covers them, and this page cross-references it repeatedly.
What makes mega menus worth their own page is that they do one thing normal navigation doesn’t: they cram an unusually large number of links into a single, repeated, sitewide UI element. That concentration is what raises two distinct risks — an implementation risk (JavaScript flyouts that never render real links) and a structural risk (over-flattening your site so Google loses the grouping signal). The structural side — the flat-vs-deep, pyramid-vs-pancake argument — is already covered in the site architecture and website structure articles in this cluster, including Mueller’s line that over-flattening a site with a mega menu can make it so “Google can’t recognize which parts of the site belong together.” I’m not going to re-litigate that here. This page is about the practical build.
The single most common failure: JS handlers instead of real links
Here’s the one I see break in the wild more than any other. A team builds a mega
menu — often with an older jQuery plugin, or a hand-rolled React/Vue component — and
the flyout’s “links” are actually click handlers, a router attribute with no
href, or content that only gets injected into the DOM after a hover or click event
fires. Google’s own list of link formats it can’t reliably crawl maps directly
onto exactly these patterns:
<a routerLink="products/category">Shoes</a> <!-- no href -->
<span href="https://example.com">Shoes</span> <!-- not an anchor -->
<a onclick="goto('https://example.com')">Shoes</a> <!-- onclick, no href -->The reason this one is so dangerous is that the failure is silent. The pages look linked — a human hovers, sees the flyout, clicks, and lands on the category page. Nothing appears broken. But those destination pages get zero crawl and zero link-equity credit from the mega menu, and if the mega menu was their only internal link, they become orphan pages (see the internal links article on why orphans are a discovery dead end). You can have an entire category tree that’s invisible to Google while looking perfectly navigable to every human who tests it. That’s why it survives QA: humans don’t experience the bug.
How to verify a mega menu is actually crawlable
Don’t trust the rendered page — check the source.
- View Page Source, not Inspect Element. Right-click → View Page Source shows the
raw HTML the server sent. Inspect Element shows the live DOM after JavaScript has
run, which hides exactly the problem you’re hunting. If your flyout links appear as
<a href="...">in View Source, they’re server-rendered and safe. If they only show up in the Inspect view, that’s your red flag. - URL Inspection tool (GSC). Run the page through Search Console’s URL Inspection and look at the rendered HTML / crawled page. This tells you what Googlebot actually ended up with.
This checks the links the analyzer can observe; it does not prove that interaction-only links exist in the initial HTML. Keep View Source and URL Inspection as the crawlability checks.
Review observed menu destinations and anchor patterns with my free Link Analyzer Free
- Analyze a representative desktop page and the equivalent mobile route.
- Review non-navigational links, repeated generic anchors, redirected targets, and internal nofollow findings.
- Fix the menu component, then verify real anchor elements in source and rerun the sample.
The nuance worth stating plainly: yes, Google renders JavaScript now, so a JS-built
menu might get crawled. But “might” is the operative word. The verifiable, safe
pattern is server-rendered <a href> links, progressively enhanced with
JavaScript for the hover animation and interactivity — not links that depend on JS
to exist at all. Use JS to make the menu behave, not to make the links exist.
Is hidden-until-hover content discounted?
This is the question everyone eventually asks about mega menus, and it’s the one place where old SEO folklore is genuinely outdated. A mega-menu flyout is hidden until you hover it — does Google discount all those links because they’re not visible on load?
Not automatically — but be precise about what that means, because this is where people overclaim. Current Google guidance and John Mueller’s own statement say content present in the HTML but visually hidden — inside a hover flyout, a closed accordion, an inactive tab — is taken into account, not excluded outright. Mueller, asked directly whether hidden tab/accordion content is devalued under mobile-first indexing: “No. Specifically when it comes to content on mobile pages we do take into account anything that’s in the HTML. So if there’s something there that might be visible to users at some point we will include that… so that’s completely normal” (reported by Roger Montti in Search Engine Journal’s write-up of the myth). Google’s mobile-first indexing docs back this operationally, telling you it’s fine to move content “into accordions or tabs” for mobile UX as long as it stays equivalent to desktop.
What that quote actually establishes is availability — the content gets crawled, rendered, and considered, rather than thrown out. It doesn’t establish that hover-hidden content carries identical ranking weight to always-visible content; Google hasn’t published anything on that specific question either way, so treat it as undocumented rather than assuming equivalence. Keep the two questions separate: is it excluded outright (no — settled) versus does it rank exactly like visible content (not documented).
This supersedes the older (roughly 2015–2016-era) line that content behind tabs and click-to-expand boxes carried less ranking weight — that specific claim is dead. What the record actually supports is narrower: hidden-in-HTML content isn’t discounted out of hand, but no one has documented that its weighting is identical to visible content. If you’ve heard the old “discounted” version, this is what changed — don’t swap it for an equally unsupported “definitely equal” version.
But there’s a nuance that trips people up, and it’s the whole game: “hidden via CSS” and “fetched only on interaction” are two completely different things.
- A flyout that’s
display:noneuntil hover, with the links already sitting in the DOM, is fine — indexed normally. - A flyout whose HTML is fetched via an API call triggered by the hover event may never be crawled at all.
That’s not a “hidden content is discounted” problem — it’s a crawlability problem. The links don’t exist until a user does something, so a crawler never sees them. Conflating those two failure modes is exactly how the myth survives. Keep them separate: CSS-hidden links = fine; AJAX-on-interaction links = broken.
Link budget: group it, don’t dump it
There is no documented hard limit on how many links a mega menu can have. The old “100 links per page” rule is a flat myth — the internal links article debunks it in full, so I won’t re-argue it here. Google’s line is that there’s no magical ideal number.
But “no limit” doesn’t mean “dump everything in.” The real lever isn’t raw count — it’s organization. This is where Mueller’s actual mega-menu answer is useful. In a 2021 Search Central hangout (reported by Barry Schwartz), someone described a mega menu with over 1,000 links and a traffic drop after moving those links from hover-loaded to static HTML. Mueller’s practical concern wasn’t the number — it was whether a huge, undifferentiated set of same-level links flattens the topical grouping. As he put it, going too flat means “we think, oh, all of these are equally important, and we don’t really know which of these are connected to each other,” whereas “a pyramid structure helps us a lot more to understand the context of individual pages.” Notably, he also treated reverting some of those 1,000 links to hover-loading — while keeping a crawl path to them via other, more relevant pages — as a legitimate structural fix, not something inherently bad.
The practical takeaway: a well-organized 150-link mega menu with clear column headers (Men’s / Women’s / Kids’, then subcategories under each) preserves the hierarchy signal. An unorganized wall of 150 links with no grouping doesn’t — even at the identical count. So:
- Group by real category boundaries. Columns and headings that mirror your actual site hierarchy.
- Keep columns scannable. A handful of items per group, not an alphabetical soup of everything.
- Keep anchor text descriptive and specific. Link text that describes the destination — not “Shop now” repeated thirty times.
- Don’t make it exhaustive. A mega menu is for high-level discovery paths. Your true priority pages should also earn contextual, in-content links, not rely solely on the global menu (which repeats identically on every page and spreads the same “importance” signal everywhere).
Mobile equivalents need the same links, not a smaller UI
On mobile your mega menu becomes a hamburger or accordion. The trap is teams trimming the mobile menu for UX cleanliness and, in doing so, dropping destinations that existed only on the desktop mega menu. Google’s mobile-first indexing guidance is explicit that mobile content — navigation included — should be equivalent to desktop. If your mobile nav is where indexing happens (and under mobile-first indexing, it is), links you dropped there can be treated as less important, or — if the mega menu was their only internal link — go undiscovered entirely.
So run the same audit on mobile that you run on desktop: pull up the mobile nav’s
rendered HTML, confirm the same destinations are present, and confirm each is a real
<a href>. Same crawlability test, same parity test — just on the smaller UI.
That covers destinations. It doesn’t cover interaction — a separate check, and one
teams skip. Mobile-first indexing requires the important destination set to be
present, not an identical interaction layout, so a hamburger/accordion is fine as a
pattern. But whatever disclosure pattern you use needs its own keyboard and focus
test: can a keyboard-only user reach the trigger, open it, and tab through the
destinations, with an accurate aria-expanded state? The
WAI-ARIA disclosure navigation pattern
is a worked example of that behavior — treat it as one conforming implementation,
not the only one. Test destination parity and disclosure/keyboard behavior as two
separate pass/fail checks, since a menu can pass one and fail the other.
One more myth: structured data isn’t a crawlability fix
Some mega-menu guides present SiteNavigationElement schema markup as if it makes a
menu crawlable. It doesn’t. Structured data can describe your navigation
semantically, but it is not a substitute for real crawlable links — the same
principle the internal links article covers, where Mueller notes that even when you
provide URLs in structured data, “we don’t use those URLs in the same way as we
would use normal internal links on a page.” Schema is a layer you add on top of
already-crawlable <a href> links, never instead of them.
What these checks do — and don’t — guarantee
Real anchors, source-visible links, grouped structure, mobile parity, and keyboard-operable disclosure remove the specific failure modes covered above: undiscovered pages, flattened topical structure, broken parity, and inaccessible navigation. None of it guarantees crawling, indexing, higher rankings, more traffic, or an AI citation — those depend on far more than navigation markup. Treat source/rendered anchors, crawler extraction, desktop/mobile destination parity, and keyboard/focus behavior as separate pass/fail tests, not one bundled fix; a mega menu can pass some of these and fail others.
Should your site even have a mega menu?
Briefly, because the full flat-vs-deep argument lives in the site architecture and website structure articles: a mega menu earns its place when your site is large enough that cross-category discovery is a genuine user journey and surfacing deep category pages from everywhere meaningfully cuts click depth (it’s one of the best tools for keeping important pages within a few clicks of the homepage — and for hitting Bing’s roughly three-clicks-from-home target). If your catalog is small, or the long tail of menu items barely gets clicked, a mega menu is overhead you don’t need. Decide whether to have one before you obsess over how to build it — the decision tree lens walks through it.
AI summary
A condensed take on the Advanced version:
- A mega menu is just internal links in a bigger UI. Every internal-link rule
applies unchanged — starting with: every link must be a real
<a href>. - The #1 real-world failure: a JS click/hover flyout whose links aren’t real
anchors (
onclick,routerLinkwith nohref, or DOM injected only on interaction). It looks linked to a user but Google can’t crawl it — and if the mega menu was a page’s only internal link, that page gets orphaned. The failure is silent, so it survives human QA. - Verify with View Source, not Inspect Element. View Source shows the raw
server HTML; if links appear there as
<a href>, they’re safe. Also use GSC’s URL Inspection. - Safe pattern: server-rendered
<a href>links progressively enhanced with JS for animation — not links that depend on JS to exist. - Hidden-until-hover isn’t excluded outright. Mueller and current mobile-first docs say content in the HTML but visually hidden (flyouts, accordions, tabs) is taken into account — but Google hasn’t documented that it carries identical ranking weight to always-visible content; that’s a separate, open question. The nuance: CSS-hidden links = fine, evaluated normally; fetched-only-on-interaction (AJAX-on-hover) links = may never be crawled. Those are different failure modes.
- No mega-menu change guarantees an outcome. Real anchors, source-visible links, grouped structure, mobile parity, and keyboard-operable disclosure remove specific failure modes — they don’t guarantee crawling, indexing, higher rankings, traffic, or an AI citation. Validate each check (source/rendered anchors, crawler extraction, desktop/mobile parity, keyboard and focus behavior) separately.
- No hard link-count ceiling (100-link rule is a myth). The real lever is organization: group by category, scannable columns, descriptive anchor text. Mueller’s mega-menu answer shows the concern is flattening the grouping signal, not raw count.
- Mobile needs the same crawlable links, not a trimmed hamburger — Google expects mobile content parity.
- Structured data (
SiteNavigationElement) is not a substitute for real crawlable links.
Official documentation
There is no Google or Bing doc scoped specifically to “mega menus.” All the official guidance is the general link-crawlability, anchor-text, and mobile-first docs applied to this UI pattern. Here are the relevant primary sources.
- SEO link best practices — the crawlable-
<a href>requirement and the list of non-recommended link formats (nohref,onclick, non-anchor tags) that mega-menu flyouts commonly break. This is the foundational doc. - Mobile-first indexing best practices — content parity between mobile and desktop, and the explicit note that moving content into accordions or tabs for mobile is fine as long as it stays equivalent.
- In-Depth Guide to How Google Search Works — general URL-discovery context: links are how Google finds most new pages.
Bing / Microsoft
- Bing Webmaster Guidelines — no mega-menu-specific content, but Bing’s general guidance (keep important pages within roughly three clicks of the homepage, and a heavier reliance on XML sitemaps for discovery) is the relevant backdrop. Because Bing leans more on sitemaps, a mega menu that accidentally orphans pages is a comparatively bigger risk there — fewer alternate discovery paths make the fallback matter more.
- SiteNavigationElement — the navigation schema type. Useful as a semantic enhancement layered on top of real links; not a crawlability fix.
Accessibility (WAI-ARIA / WCAG)
- WAI-ARIA disclosure navigation menu example — a worked example of keyboard-operable disclosure behavior for exactly this UI pattern. It’s an example implementation, not the only conforming one.
- WCAG 2.2 — Understanding Success Criterion 2.1.1: Keyboard — the underlying requirement that a mega menu’s trigger and flyout be operable without a mouse.
Quotes from the source
On-the-record statements relevant to building a crawlable, well-structured mega menu.
Google — the crawlable-link requirement (SEO link best practices)
- “Google can only crawl your link if it’s an
<a>HTML element (also known as anchor element) with an href attribute.” Jump to quote
John Mueller, Google — hidden/tabbed content is indexed the same as visible content
- “No. Specifically when it comes to content on mobile pages we do take into account anything that’s in the HTML. So if there’s something there that might be visible to users at some point we will include that… so that’s completely normal.” (asked directly whether content hidden behind tabs/accordions is devalued under mobile-first indexing) Read the coverage
John Mueller, Google — flat vs. pyramid, in the context of a 1,000-link mega menu
- “If it’s very flat, then we think, oh, all of these are equally important, and we don’t really know which of these are connected to each other.” Read the coverage
- “A pyramid structure helps us a lot more to understand the context of individual pages within the site.” / “I don’t think it would always have a negative effect.” (on going from ~1,000 flat mega-menu links to a deeper structure) Read the coverage
John Mueller, Google — structured data is not a substitute for real internal links
- “Even if in the structured data you also provide URLs, we don’t use those URLs in the same way as we would use normal internal links on a page.”
<a href> crawlability quote
is from Google’s live developer docs. Confirm any JS-rendered passage against the
live source before treating it as final. Older commentary that hidden tab/accordion
content is “discounted” (circa 2015–2016) is superseded by the Mueller statement
above and is treated here as an outdated myth, not current guidance. Should you have a mega menu — and is yours safe?
This walks the two questions that actually matter: should this site have a mega menu, and if it has one, is it built in a way Google can crawl? For the full flat-vs-deep structural argument, see the site architecture and website structure articles in this cluster.
Mega menu: keep it, fix it, or skip it?
Mega menu SEO checklist
Work it top to bottom — crawlability first, structure second, mobile last:
- Every flyout link is a real
<a href>— notonclick, not arouterLink/ router attribute withouthref, not a non-anchor tag styled as a link. - Links appear in View Page Source, not just in Inspect Element / the live DOM (the difference between server-rendered and JS-only).
- Flyout HTML is in the initial page, hidden with CSS — not fetched via an API call on hover/click.
- URL Inspection (GSC) confirms the menu links are present in the crawled / rendered HTML.
- JavaScript enhances, doesn’t create — JS handles the hover animation and interactivity; the links exist without it.
- No orphaned destinations — no important page relies on the mega menu as its only internal link (cross-check with contextual in-content links).
- Links are grouped by category with column headers that mirror your site hierarchy — not an ungrouped wall.
- Columns are scannable — a handful of items per group, not an alphabetical dump of everything.
- Anchor text is descriptive and specific to each destination — no generic “Shop now” repeated across dozens of links.
- The menu is selective, not exhaustive — high-level discovery paths, with priority pages also earning contextual links.
- Mobile hamburger/accordion has the same links as the desktop mega menu (content parity).
- Mobile links are also real
<a href>— run the same View Source / URL Inspection check on the mobile nav. - Structured data (
SiteNavigationElement), if used, sits on top of real links — never as a substitute for them. - Re-check after front-end upgrades — framework changes are where real links quietly become click handlers.
Mega menu SEO — cheat sheet
Crawlable vs. not
| Pattern | Crawlable? | Notes |
|---|---|---|
<a href="/shoes/mens/">Men's shoes</a> | Yes | The only reliably crawlable pattern. |
<a routerLink="/shoes/mens/">Men's shoes</a> | No | No href — router attribute only. |
<span onclick="go('/shoes/mens/')">Men's shoes</span> | No | Not an anchor; JS click handler. |
<a onclick="go(...)">Men's shoes</a> | No | Anchor, but no href to follow. |
<a href> present, panel display:none until hover | Yes | CSS-hidden links index normally. |
| Flyout HTML fetched via API on hover | Risky/No | May never be crawled — fetched only on interaction. |
The two failure modes people conflate
- CSS-hidden (links in the DOM, panel hidden until hover) → indexed normally.
- Fetched-on-interaction (links don’t exist until an event fires) → may never be crawled. This is a crawlability bug, not a “hidden content is discounted” issue.
Myth vs. reality
| Myth | Reality |
|---|---|
| Hidden-until-hover content is discounted | Not excluded — Google takes it into account if it’s in the HTML (Mueller, mobile-first docs). Identical ranking weight to always-visible content isn’t documented either way. |
| Mega menus are inherently bad for SEO | Risk is specific: JS-only links, or an ungrouped wall flattening structure. Built well, it’s fine. |
| There’s a hard link limit (e.g. 100) | Myth. No documented max. Organization matters more than count. |
SiteNavigationElement schema makes a menu crawlable | No — schema describes; it doesn’t replace real <a href> links. |
Quick verify
- View Page Source (not Inspect) → search for a menu link → is it
<a href>? - GSC URL Inspection → crawled/rendered HTML has the links?
- Mobile: repeat both checks on the hamburger/accordion menu.
Good vs. bad mega-menu markup
Bad: a JS-only flyout
Links that don’t exist until JavaScript runs — Google can’t reliably follow any of these:
<nav class="mega">
<button class="trigger" onclick="openFlyout('shoes')">Shoes</button>
<div class="flyout" id="shoes-flyout" hidden>
<!-- injected by JS after the click; empty in the server HTML -->
<span class="menu-link" data-url="/shoes/mens/">Men's shoes</span>
<span class="menu-link" data-url="/shoes/womens/">Women's shoes</span>
<a routerLink="/shoes/kids/">Kids' shoes</a> <!-- no href -->
<a onclick="go('/shoes/sale/')">Sale</a> <!-- onclick, no href -->
</div>
</nav>Every destination here is invisible to a crawler: the <span> “links” aren’t
anchors, the routerLink has no href, and the onclick anchor has nothing to
follow. If these pages have no other internal link, they’re orphaned.
Good: server-rendered links, progressively enhanced
The links are real <a href> elements sitting in the server HTML; JavaScript only
adds the hover behavior:
<nav class="mega" aria-label="Primary">
<ul>
<li>
<a href="/shoes/">Shoes</a>
<div class="flyout"> <!-- CSS: display:none until hover/focus -->
<div class="col">
<h3>Men's</h3>
<ul>
<li><a href="/shoes/mens/running/">Men's running shoes</a></li>
<li><a href="/shoes/mens/boots/">Men's boots</a></li>
</ul>
</div>
<div class="col">
<h3>Women's</h3>
<ul>
<li><a href="/shoes/womens/running/">Women's running shoes</a></li>
<li><a href="/shoes/womens/boots/">Women's boots</a></li>
</ul>
</div>
</div>
</li>
</ul>
</nav>/* Hidden until hover — links are still in the DOM, so they're crawled normally */
.flyout { display: none; }
.mega li:hover > .flyout,
.mega li:focus-within > .flyout { display: block; }Everything here is crawlable in the raw HTML, and hiding the panel with CSS doesn’t change that — CSS-hidden content is indexed the same as visible content.
Better still: grouped, not a wall
The two markups below have the same link count but tell Google very different things. On the left, an ungrouped dump; on the right, the same links grouped under headings that mirror your hierarchy.
<!-- Structurally flat: an ungrouped wall -->
<div class="flyout">
<a href="/shoes/mens/running/">Men's running</a>
<a href="/shoes/womens/running/">Women's running</a>
<a href="/shoes/kids/">Kids'</a>
<a href="/shoes/mens/boots/">Men's boots</a>
<a href="/shoes/sale/">Sale</a>
<a href="/shoes/womens/boots/">Women's boots</a>
<!-- ...140 more, no structure... -->
</div>
<!-- Grouped: the hierarchy is legible -->
<div class="flyout">
<div class="col"><h3>Men's</h3>
<ul><li><a href="/shoes/mens/running/">Running</a></li>
<li><a href="/shoes/mens/boots/">Boots</a></li></ul></div>
<div class="col"><h3>Women's</h3>
<ul><li><a href="/shoes/womens/running/">Running</a></li>
<li><a href="/shoes/womens/boots/">Boots</a></li></ul></div>
<div class="col"><h3>Kids & Sale</h3>
<ul><li><a href="/shoes/kids/">Kids' shoes</a></li>
<li><a href="/shoes/sale/">Sale</a></li></ul></div>
</div>Both are crawlable. Only the grouped version preserves the category relationships that let Google understand which pages belong together.
Mega-menu anti-patterns
The recurring ways mega menus break, and what to do instead.
1. Links that are click handlers, not anchors.
The classic. onclick, a routerLink/router attribute with no href, or a <span>
styled as a link. Looks fine to a human; a crawler can’t follow it. → Use real
<a href> links, enhanced with JS for behavior.
2. Flyout HTML fetched on hover. The panel’s content is pulled from an API only after the hover/click fires, so the links don’t exist in the page until a user acts. → Put the links in the initial HTML; hide the panel with CSS instead.
3. Trusting the rendered page instead of the source. Checking the menu in Inspect Element (the live DOM) hides exactly the JS-only bug you should be hunting. → Use View Page Source and GSC URL Inspection.
4. The undifferentiated link wall. Hundreds of same-level links dumped into one panel with no grouping. No link-count rule is broken, but the topical grouping signal is flattened. → Group by category with headings that mirror your hierarchy; keep it selective.
5. Generic, repeated anchor text. “Shop now,” “View all,” “Click here” repeated across dozens of destinations tells search engines nothing about where each link goes. → Descriptive anchor text specific to each destination.
6. A trimmed mobile menu. Dropping links from the hamburger/accordion for a cleaner mobile UI breaks mobile-first content parity — and can orphan pages whose only link was the desktop mega menu. → Keep the same links, and verify they’re real anchors on mobile too.
7. Treating schema as a crawlability fix.
Adding SiteNavigationElement markup over JS-only links and assuming it makes them
crawlable. It doesn’t. → Schema is a semantic layer on top of already-crawlable
links, never a replacement.
8. Believing hidden-until-hover is discounted. Building elaborate workarounds because of the old “hidden content is devalued” myth. CSS-hidden links in the DOM are indexed normally. → Don’t over-engineer around a myth; just make sure the links are actually in the HTML.
Mega menu problems to diagnose
Links appear to work, but a crawler cannot discover them
Symptom: Clicking a menu item in a browser opens the destination, but the URL is
absent from a crawl that started at the home page. Likely cause: The item is a
div, button, or JavaScript handler rather than an anchor with an href.
Fix: Render a real <a href="/destination/"> in the HTML, then crawl from the
home page again and confirm the destination appears as an internal outlink.
Desktop links are crawlable but mobile links disappear
Symptom: Important categories are present in the desktop menu but absent from the mobile DOM. Likely cause: The mobile menu uses a separate, shortened data source. Fix: Give the mobile accordion the same important destinations as the desktop menu and confirm the anchors exist before any tap.
A flyout opens on hover but not with a keyboard
Symptom: Mouse users can reach the panel, while tab and enter do not expose it.
Likely cause: The interaction depends only on hover. Fix: Make the trigger a
button with keyboard handling and an accurate aria-expanded state; keep the
destination links as normal anchors.
The Reach, Render, Restrain framework
Use three checks when reviewing any mega menu:
- Reach: Can a user and crawler reach each important destination through a real anchor, on desktop and mobile?
- Render: Are those anchors present in delivered or rendered HTML without requiring a hover, click, or API response?
- Restrain: Is the menu limited to destinations that deserve sitewide links, grouped under useful headings instead of becoming a site map in a dropdown?
A menu fails if any one of the three breaks. Reach protects discovery, Render protects implementation, and Restrain protects hierarchy and usability.
Inspect mega-menu links in the browser
Run this in the Chrome DevTools Console while the menu is closed. It lists anchors
inside common navigation containers and flags entries without an href:
const links = [...document.querySelectorAll('header nav a, [role="navigation"] a')];
console.table(links.map(a => ({ text: a.textContent.trim(), href: a.getAttribute('href'), crawlable: a.hasAttribute('href') })));Run the same snippet at desktop and mobile viewport widths. A destination that exists in only one result set needs review.
Extract navigation destinations in a crawl
Use this XPath in a crawler’s custom extraction feature to collect menu URLs:
//header//nav//a[@href]/@href | //*[@role='navigation']//a[@href]/@hrefThe union covers semantic nav elements and navigation regions identified with an
ARIA role. Compare the extracted set with the approved navigation inventory rather
than assuming every click target is a link.
Resources worth your time
My related writing
- Internal Links for SEO: An Actionable Guide — the full Ahrefs guide on how internal links pass PageRank, the no-fixed-link-limit framing, and anchor text — all of which is what a mega menu is really made of.
- The Beginner’s Guide to Technical SEO — where navigation and crawlability fit into the bigger technical picture.
- JavaScript SEO Issues & Best Practices — the rendering/JS side that’s behind most broken mega-menu flyouts.
Official
- Google’s SEO link best practices — the canonical reference for what makes a link crawlable.
- Google’s Mobile-first indexing best practices — the content-parity requirement your mobile menu has to meet.
From around the industry
- Google’s Mueller On Myth Of Hidden Tab Content (Search Engine Journal) — the direct Mueller statement that hidden-until-interaction content is indexed the same as visible content.
- Google Recommends Pyramid Navigation Structure For Large Sites (Search Engine Roundtable) — Mueller’s full answer to the 1,000-link mega-menu question; the source for the link-budget guidance here.
- Tabbed Content: Is It A Google Ranking Factor? (Search Engine Journal) — the history of the hidden-content debate and why the old “discounted” line is outdated.
- Google: Content Within Tabs Or Click To Expand Boxes Are Discounted (Search Engine Roundtable) — the older, now-superseded guidance, useful for understanding where the myth came from.
- Mega Menus & SEO (MagsTags) — a link-equity-theory-heavy treatment, including a worked example of how a big menu spreads PageRank; useful background, not Google-sourced.
- r/TechSEO — the community for debugging orphaned pages and crawlability issues, which is where most mega-menu problems actually surface.
Test yourself: Mega Menu SEO
Five quick questions on building a crawlable, well-structured mega menu. Pick an answer for each, then check.
Mega Menu
A mega menu is a large, categorized navigation panel — usually opened by hover or click on a top-level nav item — that surfaces many links at once, grouped into columns instead of the single list a standard dropdown shows.
Related: Internal Link, Site Architecture, Website Structure, Crawlability
Mega Menu
A mega menu is a large, expanded dropdown or flyout navigation panel that reveals many links at once, typically organized into columns or groups by category, instead of the single-column list a standard dropdown shows. It’s usually triggered by hovering or clicking a top-level navigation item, and large-catalog ecommerce sites lean on it heavily — think a “Shoes” item opening into Men’s, Women’s, and Kids’ columns, then subcategories under each — because it lets a user reach a deep category page in one click from anywhere on the site.
For SEO, a mega menu is just a navigation component made of internal links. Everything that applies to internal links generally — crawlability, anchor text, and link-graph signals — applies here without modification. Every link needs to be a real <a href> element, or Google can’t follow it.
What makes mega menus their own topic is that they concentrate an unusually large number of links into one repeated, sitewide UI element. That raises two specific risks a small nav doesn’t: JavaScript-only flyouts that never render real links (silently orphaning the pages they “link” to), and over-flattening — dumping hundreds of same-level links into one panel so search engines lose the sense of which pages belong together. Built well, with grouped and genuinely crawlable links, a mega menu is a legitimate, search-friendly pattern.
Related: Internal Link, Site Architecture, Website Structure, Crawlability
Build-time retrieval analysis plus live signals for this exact article. The automatic chunk report includes a deterministic readiness score and is ready without a model download.
Search Console
sampleGA4 traffic (28d)
sampleCloudflare traffic (7d)
sampledCrUX field data (28d, phone)
sampleGoogle NLP entities
localChangelog
Updated Jul 18, 2026.
Editorial summary and recorded change details.Summary
Corrected an overclaim on hidden-until-hover content: the article previously said hover/accordion-hidden links are 'indexed the same as visible content,' but the underlying Mueller quote only establishes that Google takes hidden-in-HTML content into account, not that it carries identical ranking weight to always-visible content — that specific question isn't documented either way. Reworded this across the TL;DRs, the dedicated section, the AI summary, the cheat-sheet myth table, and the quiz. Also added a mobile keyboard/focus disclosure check (WAI-ARIA disclosure-navigation pattern), a closing note that none of these checks guarantee crawling/indexing/rankings/traffic, and a light definition tweak foregrounding the disclosure pattern.
Change details
-
Hidden-until-hover content is 'taken into account' and not excluded outright, but Google hasn't documented that it gets identical ranking weight to always-visible content — availability and ranking weight are separate, and only the first is settled.
-
Added a mobile-specific keyboard/focus/disclosure-state check (citing the WAI-ARIA disclosure-navigation pattern), separate from the destination-parity check.
-
Added a closing note that crawlable links, grouping, mobile parity, and keyboard access remove specific failure modes but don't guarantee crawling, indexing, rankings, traffic, or AI citations.
Full comparison unavailable — no prior snapshot was archived for this revision.