Main Content (Custom ID)
Both the SkipNavLink and SkipNavContent use the same custom ID "main-content" to ensure proper linking and focus management.
Build faster with Premium Chakra UI Components 💎
Learn moreSkip Nav Link allows keyboard users to skip to the main content of the page.
Navigation
This represents a navigation area that users might want to skip over.
import { Box, SkipNavContent, SkipNavLink, Text } from "@chakra-ui/react"
const Demo = () => {
return (
<Box>
<SkipNavLink>Skip to Content</SkipNavLink>
{/* Simulated navigation */}
<Box p="4" bg="gray.100" borderRadius="md" mb="4">
<Text fontWeight="medium" mb="2">
Navigation
</Text>
<Text fontSize="sm" color="gray.600">
This represents a navigation area that users might want to skip over.
</Text>
</Box>
{/* Main content area */}
<SkipNavContent>
<Box p="4" bg="blue.50" borderRadius="md">
<Text fontWeight="medium" mb="2">
Main Content
</Text>
<Text fontSize="sm">
This is the main content area. When users press Tab and then Enter
on the "Skip to Content" link, focus will jump directly here,
bypassing the navigation.
</Text>
</Box>
</SkipNavContent>
</Box>
)
}
Skip Navigation link and destination container for screen readers and keyboard users.
Per WebAIM.org on WCAG 2.4.1 (Bypass Blocks - Level A), because the main content is not always the first section that the user encounters on a page, it is strongly recommended to include a skip link for users to be able to bypass content that is present on multiple pages. Navigation links are the most common skipped.
A user with a screen reader or specialized software could skip content via the
headings or main region, but this is not sufficient for sighted users who
primarily use a keyboard.
import { SkipNavContent, SkipNavLink } from "@chakra-ui/react"<SkipNavLink>Skip to content</SkipNavLink>
<SkipNavContent />The SkipNavLink component ideally needs to be one of the first items a user
encounters when they begin navigating a page after load. Therefore, it is
recommended to place it as high as possible in the app.
It renders an a tag and automatically creates a link with an href attribute
that will point to SkipNavContent.
The SkipNavContent component is used as a target for the link to place
keyboard focus on the first piece of main content. It renders a div and can
either be a self-closing component, or wrap the main content.
Navigation
This represents a navigation area that users might want to skip over.
import { Box, SkipNavContent, SkipNavLink, Text } from "@chakra-ui/react"
const Demo = () => {
return (
<Box>
<SkipNavLink>Skip to Content</SkipNavLink>
{/* Simulated navigation */}
<Box p="4" bg="gray.100" borderRadius="md" mb="4">
<Text fontWeight="medium" mb="2">
Navigation
</Text>
<Text fontSize="sm" color="gray.600">
This represents a navigation area that users might want to skip over.
</Text>
</Box>
{/* Main content area */}
<SkipNavContent>
<Box p="4" bg="blue.50" borderRadius="md">
<Text fontWeight="medium" mb="2">
Main Content
</Text>
<Text fontSize="sm">
This is the main content area. When users press Tab and then Enter
on the "Skip to Content" link, focus will jump directly here,
bypassing the navigation.
</Text>
</Box>
</SkipNavContent>
</Box>
)
}
You can supply a custom id value using the id prop but you will have to use
this prop and value in both components, or they will not match.
Header & Navigation
This example uses a custom ID "main-content" for both components to ensure they match.
Main Content (Custom ID)
Both the SkipNavLink and SkipNavContent use the same custom ID "main-content" to ensure proper linking and focus management.
import { Box, SkipNavContent, SkipNavLink, Text } from "@chakra-ui/react"
const Demo = () => {
return (
<Box>
<SkipNavLink id="main-content">Skip to Main Content</SkipNavLink>
{/* Simulated header and navigation */}
<Box p="4" bg="gray.100" borderRadius="md" mb="4">
<Text fontWeight="medium" mb="2">
Header & Navigation
</Text>
<Text fontSize="sm" color="gray.600">
This example uses a custom ID "main-content" for both components to
ensure they match.
</Text>
</Box>
{/* Main content area with custom ID */}
<SkipNavContent id="main-content">
<Box p="4" bg="green.50" borderRadius="md">
<Text fontWeight="medium" mb="2">
Main Content (Custom ID)
</Text>
<Text fontSize="sm">
Both the SkipNavLink and SkipNavContent use the same custom ID
"main-content" to ensure proper linking and focus management.
</Text>
</Box>
</SkipNavContent>
</Box>
)
}
The SkipNavContent component can wrap your main content area to ensure proper
focus management.
Site Header
• Home
• About
• Services
• Contact
import {
Box,
Heading,
SkipNavContent,
SkipNavLink,
Text,
VStack,
} from "@chakra-ui/react"
const Demo = () => {
return (
<Box>
<SkipNavLink>Skip to Content</SkipNavLink>
{/* Simulated header with multiple navigation items */}
<Box p="4" bg="gray.100" borderRadius="md" mb="4">
<Text fontWeight="medium" mb="2">
Site Header
</Text>
<VStack align="start" gap="1">
<Text fontSize="sm" color="gray.600">
• Home
</Text>
<Text fontSize="sm" color="gray.600">
• About
</Text>
<Text fontSize="sm" color="gray.600">
• Services
</Text>
<Text fontSize="sm" color="gray.600">
• Contact
</Text>
</VStack>
</Box>
{/* SkipNavContent wrapping main content */}
<SkipNavContent>
<Box p="6" bg="purple.50" borderRadius="md">
<Heading size="lg" mb="4">
Welcome to Our Site
</Heading>
<VStack align="start" gap="4">
<Text>
This is the main content area. The SkipNavContent component wraps
this entire section, making it the target for the skip navigation
link.
</Text>
<Text>
When keyboard users press Tab to focus the "Skip to Content" link
and then press Enter, focus will jump directly to this content
area, bypassing all the navigation items above.
</Text>
<Text fontSize="sm" color="purple.600">
This is especially helpful for users with screen readers or those
who navigate primarily with keyboards.
</Text>
</VStack>
</Box>
</SkipNavContent>
</Box>
)
}
You can see these components in action on this page!
/skip-nav#usage)Enter to reload the page, then hit Tab. The Skip Nav link will appear
in the upper left.Enter on the link will take you to the top of the docs content.