OTTODesign System

Components

Skip link

Skip links provide keyboard users with a quick way to bypass navigation or repeated content. They only appear when they receive keyboard focus and are positioned above the layout so that no surrounding elements shift.

Configurator

LiveSkip link: click into the stage and press Tab, the skip link appears on focus. The header variant sits at the top of this stage (on a page: at the top of the viewport).
Empfehlungen überspringen
Sneaker Jeans Jacken

After the skipped section

Alle Kategorien
HTML
<div style="position:relative;transform:translateZ(0);min-height:220px;padding-top:88px">
  <oc-skip-link-v1>
    <oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link">Empfehlungen überspringen</oc-button-v1>
  </oc-skip-link-v1>
  <div style="display:flex;flex-wrap:wrap;gap:8px">
    <oc-button-v1 variant="secondary" size="50">Sneaker</oc-button-v1>
    <oc-button-v1 variant="secondary" size="50">Jeans</oc-button-v1>
    <oc-button-v1 variant="secondary" size="50">Jacken</oc-button-v1>
  </div>
  <p class="demo-label" style="margin-top:16px">After the skipped section</p>
  <oc-link-v2><a href="#">Alle Kategorien</a></oc-link-v2>
</div>

Usage

Anatomy

Zur HauptnavigationZur SeitennavigationZum Inhalt
1 2
  1. Skip link container (appears on keyboard focus)
  2. Button 50, secondary, with skip-link icon
LiveAnatomy
HTML
<div class="anatomy">
<div style="display:inline-flex;gap:8px;padding:8px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Hauptnavigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Seitennavigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>
<span class="anatomy-pin" style="left:0%;top:0%">1</span>
<span class="anatomy-pin" style="left:18%;top:100%">2</span>
<ol class="anatomy-key"><li data-n="1">Skip link container (appears on keyboard focus)</li><li data-n="2">Button 50, secondary, with skip-link icon</li></ol>

Variants

The header variant consists of several buttons that appear centered at the top of the page. It offers up to four targets, depending on which areas are available on the respective page and currently visible. "Hauptnavigation", "Seitennavigation" and "Filter" are not visible on breakpoints S and M and therefore do not appear as skip‑link options. In the app, „Zum Inhalt“ is also not needed because there is no header.

Breakpoint L: all applicable targets

OTTO

Inspiration

Zur HauptnavigationZum Inhalt

Breakpoint S and app: only „Zum Inhalt“

OTTO

Inspiration

Zum Inhalt
LiveHeader variant
HTML
<p class="demo-label">Breakpoint L: all applicable targets</p>
<div style="position:relative;background:#fff;padding:16px;display:grid;gap:16px">
<div style="width:96px"><img src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" style="display:block;margin:0;width:100%"></div><div class="demo-row gap-8"><oc-icon-button-v3 variant="transparent" icon="wishlist" oc-aria-label="Merkzettel"></oc-icon-button-v3><oc-icon-button-v3 variant="transparent" icon="basket" oc-aria-label="Warenkorb"></oc-icon-button-v3></div></div>
<oc-link-v2 variant="secondary" size="75"><a href="#">Damen-Mode</a></oc-link-v2><oc-link-v2 variant="secondary" size="75"><a href="#">Herren-Mode</a></oc-link-v2><oc-link-v2 variant="secondary" size="75"><a href="#">Baby &amp; Kind</a></oc-link-v2><oc-link-v2 variant="secondary" size="75"><a href="#">Möbel</a></oc-link-v2></div>
  <p class="oc-headline-100">Inspiration</p>
  <div style="position:absolute;left:50%;top:8px;transform:translateX(-50%);display:flex;gap:8px;padding:8px;white-space:nowrap;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Hauptnavigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>
</div>
<p class="demo-label">Breakpoint S and app: only „Zum Inhalt“</p>
<div style="position:relative;background:#fff;padding:16px;display:grid;gap:16px;max-width:320px">
<oc-icon-button-v3 variant="transparent" icon="burger" oc-aria-label="Sortiment"></oc-icon-button-v3><div style="width:72px"><img src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" style="display:block;margin:0;width:100%"></div><oc-icon-button-v3 variant="transparent" icon="basket" oc-aria-label="Warenkorb"></oc-icon-button-v3></div>
  <p class="oc-headline-100">Inspiration</p>
  <div style="position:absolute;left:50%;top:8px;transform:translateX(-50%);display:flex;gap:8px;padding:8px;white-space:nowrap;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>
</div>

The in‑page variant is used within content to skip sections like recommendations or long navigation blocks. It mostly features a single button. Cinemas use an in‑page skip link as the first focusable element to allow skipping large item lists.

Empfehlungen für dich

Empfehlungen überspringen
LiveIn-page variant
HTML
<div class="on-frame" style="margin:0">
<div style="position:relative;background:#fff;padding:16px;display:grid;gap:16px">
  <p class="oc-headline-100">Empfehlungen für dich</p>
  <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px"><img src="/references/images/otto/otto-fashion-drop-mojo-01.jpg" alt="" style="display:block;margin:0;width:100%;aspect-ratio:1;object-fit:cover"><img src="/references/images/otto/otto-fashion-drop-mojo-04.jpg" alt="" style="display:block;margin:0;width:100%;aspect-ratio:1;object-fit:cover"><img src="/references/images/otto/otto-fashion-drop-mojo-06.jpg" alt="" style="display:block;margin:0;width:100%;aspect-ratio:1;object-fit:cover"></div>
  <div style="position:absolute;left:24px;top:64px;display:flex;padding:8px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Empfehlungen überspringen</oc-button-v1></div>

Behaviour

Interaction

Skip links remain hidden until they receive focus via keyboard. Activating a skip link triggers an immediate focus jump to or after a target; the page scrolls automatically if the target is out of view.

The header variant is positioned absolutely at the top of the page and centered. The in‑page variant appears just above its corresponding section.

States

Skip links use buttons inside, so the states are derived from them.

Fitting

The skip link container fits its content.

fit-content

Zur HauptnavigationZur SeitennavigationZum Inhalt
Livefitting
HTML
<div style="display:inline-flex;gap:8px;padding:8px;outline:1px dashed #e5006b;outline-offset:4px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Hauptnavigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Seitennavigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>

Placement

The header variant is positioned absolutely at the top of the page and centered.

The in‑page variant appears at the start of its corresponding section with a offset of 8px horizontally and vertically.

OTTO

Inspiration

Empfehlungen für dich

Empfehlungen überspringen
Zur HauptnavigationZum Inhalt

Header variant: centred at the top of the page. In-page variant: 8px from the start of its section.

LivePlacement
HTML
<div class="on-frame" style="margin:0">
<div style="position:relative;background:#fff;padding:16px;display:grid;gap:16px;border-top:2px solid #e5006b">
<div style="width:96px"><img src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" style="display:block;margin:0;width:100%"></div><div class="demo-row gap-8"><oc-icon-button-v3 variant="transparent" icon="wishlist" oc-aria-label="Merkzettel"></oc-icon-button-v3><oc-icon-button-v3 variant="transparent" icon="basket" oc-aria-label="Warenkorb"></oc-icon-button-v3></div></div>
  <p class="oc-headline-100">Inspiration</p>
  <div style="position:relative;display:grid;gap:16px;padding-top:8px;border-top:1px solid #e5006b"><p class="oc-headline-50">Empfehlungen für dich</p>
    <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px"><img src="/references/images/otto/otto-fashion-drop-mojo-01.jpg" alt="" style="display:block;margin:0;width:100%;aspect-ratio:4/3;object-fit:cover"><img src="/references/images/otto/otto-fashion-drop-mojo-04.jpg" alt="" style="display:block;margin:0;width:100%;aspect-ratio:4/3;object-fit:cover"><img src="/references/images/otto/otto-fashion-drop-mojo-06.jpg" alt="" style="display:block;margin:0;width:100%;aspect-ratio:4/3;object-fit:cover"></div>
    <div style="position:absolute;left:8px;top:48px;display:flex;padding:8px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Empfehlungen überspringen</oc-button-v1></div>
  <div style="position:absolute;left:50%;top:8px;transform:translateX(-50%);display:flex;gap:8px;padding:8px;white-space:nowrap;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Hauptnavigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>
<p class="demo-label" style="margin-top:8px">Header variant: centred at the top of the page. In-page variant: 8px from the start of its section.</p>

Best practices

Use skip links where they help users avoid long or repetitive sections. Keep their usage focused and consistent. They are particularly helpful in areas with large or repeating content and should be offered whenever they significantly reduce keyboard navigation effort.

OTTO

Sneaker

Zum Inhalt
DoProvide a header skip link for every page with a main siteframe with all applicable entries of „Zur Hauptnavigation“, „Zur Seitennavigation“, „Zu den Filtern“ and „Zum Inhalt“.
OTTO

Adresse ändern

ZurückWeiter
Don'tDon’t provide header skip links on pages using a dialog siteframe. They do not require skip links because they do not contain bypassable structural regions.
Don'tDon’t place multiple skip‑link containers after each other.

A skip link should never directly lead to another skip link.

OTTO

Sneaker

Zur Navigation
Zum Inhalt
LiveDon't
HTML
<div style="position:relative;display:grid;gap:12px;padding:12px;background:#fff;box-shadow:0 0 0 8px #f0f0f0;margin:8px auto;max-width:360px">
<oc-icon-button-v3 variant="transparent" icon="burger" oc-aria-label="Sortiment"></oc-icon-button-v3><div style="width:64px"><img src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" style="display:block;margin:0;width:100%"></div><oc-icon-button-v3 variant="transparent" icon="basket" oc-aria-label="Warenkorb"></oc-icon-button-v3></div>
<p class="demo-title">Sneaker</p><oc-icon-button-v3 variant="primary" size="50" icon="filter" oc-aria-label="Filter"></oc-icon-button-v3></div>
<div style="height:140px;background:var(--oc-semantic-color-background-soft-mint)"></div>
<div style="position:absolute;left:50%;top:6px;transform:translateX(-50%);display:flex;padding:6px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Navigation</oc-button-v1></div>
<div style="position:absolute;left:50%;top:62px;transform:translateX(-50%);display:flex;padding:6px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>
DoPlace several header skip links inside one shared skip‑link container.

Users should encounter all consecutive skip link options in a single focus stop, not scattered across separate containers.

Zur NavigationZu den FilternZum Inhalt
LiveDo
HTML
<div style="display:inline-flex;gap:8px;padding:8px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zur Navigation</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zu den Filtern</oc-button-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Zum Inhalt</oc-button-v1></div>
DoUse in‑page skip links where they are practically helpful.

Apply them in sections that are long or repetitive.

OTTO

Sneaker

Empfehlungen überspringen
LiveDo
HTML
<div style="position:relative;display:grid;gap:12px;padding:12px;background:#fff;box-shadow:0 0 0 8px #f0f0f0;margin:8px auto;max-width:360px">
<oc-icon-button-v3 variant="transparent" icon="burger" oc-aria-label="Sortiment"></oc-icon-button-v3><div style="width:64px"><img src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" style="display:block;margin:0;width:100%"></div><oc-icon-button-v3 variant="transparent" icon="basket" oc-aria-label="Warenkorb"></oc-icon-button-v3></div>
<p class="demo-title">Sneaker</p>
<div style="position:relative;height:140px;background:var(--oc-semantic-color-background-soft-mint)"><div style="position:absolute;left:-4px;top:-8px;display:flex;padding:6px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Empfehlungen überspringen</oc-button-v1></div></div>
<div style="height:60px;background:var(--oc-semantic-color-background-soft-mint)"></div>
Don'tDon’t overuse in‑page skip links.

Only insert them where they add real value; too many skip options create noise rather than accessibility.

OTTO

Sneaker

Empfehlungen überspringen
Bewertungen überspringen
LiveDon't
HTML
<div style="position:relative;display:grid;gap:12px;padding:12px;background:#fff;box-shadow:0 0 0 8px #f0f0f0;margin:8px auto;max-width:360px">
<oc-icon-button-v3 variant="transparent" icon="burger" oc-aria-label="Sortiment"></oc-icon-button-v3><div style="width:64px"><img src="/references/logos/otto/otto-de-press-Otto_Logo_rgb.png" alt="OTTO" style="display:block;margin:0;width:100%"></div><oc-icon-button-v3 variant="transparent" icon="basket" oc-aria-label="Warenkorb"></oc-icon-button-v3></div>
<p class="demo-title">Sneaker</p>
<div style="position:relative;height:140px;background:var(--oc-semantic-color-background-soft-mint)"><div style="position:absolute;left:-4px;top:-8px;display:flex;padding:6px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Empfehlungen überspringen</oc-button-v1></div></div>
<div style="position:relative;height:60px;background:var(--oc-semantic-color-background-soft-mint)"><div style="position:absolute;left:-4px;top:-8px;display:flex;padding:6px;border-radius:var(--oc-component-skip-link-border-radius,16px);background:var(--oc-semantic-color-background-above,#fff);filter:var(--oc-semantic-shadow-above)"><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Bewertungen überspringen</oc-button-v1></div></div>

Content guidelines

Header skip links always follow the pattern „Zurm [Bereich]“ (e.g., „Zu den Filtern“).
In‑page skip links always follow the pattern „[Bereich] überspringen“ (e.g., „Empfehlungen überspringen“).

Accessibility

Skip links must be reachable early in the tab order to meet WCAG’s bypass‑blocks requirement (2.4.1).

Status

Implementation

Live demo

Click into this frame, then press Tab: the in-page skip link appears at the start of the recommendations

Newsletter anmelden & Vorteile sichern

Die Empfehlungen wurden übersprungen, der Fokus landet hier.

E-Mail-Adresse
Anmelden
LiveReal OTTO components, rendered by the OTTO component runtime
HTML
<div class="on-frame" style="margin:0;padding:24px">
<div style="display:grid;gap:16px;max-width:880px;margin:0 auto">
<div style="position:relative;background:#fff;border-radius:16px;padding:16px;display:grid;gap:16px">
  <oc-skip-link-v1><oc-button-v1 variant="secondary" size="50" icon-type-left="skip-link" style="flex:none">Empfehlungen überspringen</oc-button-v1></oc-skip-link-v1>
  <p class="oc-headline-100">Das könnte dir auch gefallen</p>
  <div style="display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px">
    <oc-interactive-overlay-v2 style="--border-radius:12px;width:auto"><a href="#" style="display:grid;gap:4px;text-decoration:none;color:inherit"><img src="/previews/imagery/samples/otto-product-still/product-headphones.webp" alt="" style="display:block;margin:0;width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px"><span class="oc-copy-75">Kopfhörer, Noise Cancelling</span><span class="oc-headline-50">149,99 €</span></a></oc-interactive-overlay-v2>
    <oc-interactive-overlay-v2 style="--border-radius:12px;width:auto"><a href="#" style="display:grid;gap:4px;text-decoration:none;color:inherit"><img src="/previews/imagery/samples/otto-product-still/product-armchair.webp" alt="" style="display:block;margin:0;width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px"><span class="oc-copy-75">Sessel „Lina“, Bouclé</span><span class="oc-headline-50">399,00 €</span></a></oc-interactive-overlay-v2>
    <oc-interactive-overlay-v2 style="--border-radius:12px;width:auto"><a href="#" style="display:grid;gap:4px;text-decoration:none;color:inherit"><img src="/previews/imagery/samples/otto-product-still/product-sneaker.webp" alt="" style="display:block;margin:0;width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px"><span class="oc-copy-75">Ledersneaker „Court“</span><span class="oc-headline-50 oc-text-color-sale">89,99 €</span></a></oc-interactive-overlay-v2>
<oc-block-v2><div style="display:grid;gap:8px"><p class="oc-headline-100">Newsletter anmelden &amp; Vorteile sichern</p><p class="oc-copy-75 oc-text-color-secondary">Die Empfehlungen wurden übersprungen, der Fokus landet hier.</p><div class="demo-row gap-8" style="flex-wrap:nowrap"><div style="flex:1"><oc-text-field-v1>E-Mail-Adresse</oc-text-field-v1></div><oc-button-v1 variant="secondary" fit-content>Anmelden</oc-button-v1></div></div></oc-block-v2>

Code

Version Tag Status API
v1 <oc-skip-link-v1> Stable, allowed for generation SkipLinkV1

Overview (v1)

The skip link component provides a mechanism for users to quickly navigate to the main content of a page, bypassing repetitive navigation links. It is particularly useful for improving accessibility, allowing users with assistive technologies to skip directly to the main content without having to tab through all the navigation links.

Default variation
überspringen 1 2 3 4 5
Dummy
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1>
  <oc-button-v1>überspringen</oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1>5</oc-button-v1>
<div class="oc-mt-100">
<oc-button-v1>Dummy</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>
Configuration

The skip link component offers a slot for buttons which you can use to let users skip to the content of a page. This component is configurable, allowing you to tailor its features and appearance to your specific needs. To explore all the available options and adjust the component, use the component configurator and see the changes affect the component in real-time.

Usage guidelines

Before integrating the skip link component into your project, make sure you have correctly installed the OTTO components package. Look through the variations page for examples of possible component variations. Here, you can discover both common and specific variations that address different use cases.

Accessibility

The skip link component comes with a set of built-in accessibility features to ensure a seamless experience for all users.

Keyboard navigation

As soon as the skip link component is focused, the skip link menu becomes visible.

Key Action
Tab Focuses the first button, then opens the skip link menu. Use Tab to move between buttons.
Enter / Space Selects the focused option and skips to or after the target section.

In the skip link menu, pressing Tab after the last button moves focus to the next focusable element, usually the next focusable element in the main content area.

Note: In addition to keyboard navigation, users may navigate the skip link menu using assistive technologies such as screen readers, or with custom navigation configurations depending on their accessibility needs.

To enable the skip link functionality, you need to define skip link targets in your HTML structure. These targets are identified using the data-skiplink attribute, which should be added to the main sections of your page that users may want to skip to. Here is an example of how to set up these targets:

<nav data-skiplink="main-navigation">
  <!-- Main navigation content -->
</nav>
<aside data-skiplink="sub-navigation">
  <!-- Sub navigation content -->
</aside>
<section data-skiplink="filters">
  <!-- Filter options content -->
</section>
<main data-skiplink="main-content">
  <!-- Main content of the page -->
</main>

The identifiers used in the data-skiplink attributes are a fixed set of values recognized by the skip link component. These identifiers correspond to the buttons in the skip link menu, allowing users to quickly navigate to these sections of the page:

ID Displayed Name
main-navigation Zur Hauptnavigation
sub-navigation Zur Subnavigation
filters Zu den Filtern
main-content Zum Inhalt

Please be aware that your skip link will only be shown if your target element is both visible and focusable.

Configuration (v1)

Configure the skip link component with the controls below and see the changes live in the preview canvas. Click the Show code button within the preview canvas to see the source code for the current component configuration.

überspringen 1 2 3 4 5
Dummy
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1>
  <oc-button-v1>überspringen</oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1>5</oc-button-v1>
<div class="oc-mt-100">
<oc-button-v1>Dummy</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>

Interactive configurator (Storybook controls); every option is listed in the API section of this file.

API v1

The skip link component provides a way for users to skip directly to content of a page, bypassing repetitive navigation links. It is particularly useful for keyboard and screen reader users, enhancing accessibility.

Attributes / properties
Attribute Type Default Required Description
variant "in-page" | "header" "in-page" no Sets the variant of the skip link.

The in-page variant positions the skip link within top left corner of the parent element. The header variant places the skip link fixed at the top of the page and horizontal centered.
Slots
Slot Required Description
default yes Sets the content of the skip link. This slot is required and should contain a focusable element, such as an oc-button-v1.

Per default the buttons will skip to the first focusable element after the current parent element.

Alternative the buttons can have the following attributes: - data-oc-skip-link-v1-to for skipping to a specific element, - data-oc-skip-link-v1-after for skipping to the first focusable element after the current parent element.
Events
Event Detail type Description
oc-property-change OcSkipLinkV1Events["oc-property-change"] Whenever a property value changes, this event triggers. Use this event to track all property changes within the component.

Refer to the Events documentation for more information.
oc-mount { component: string; } Fired when the component is mounted to the DOM. The event is fired when the onMount hook of the component is called by the runtime.
oc-unmount { component: string; } Fired when the component is unmounted from the DOM. The event is fired when the function returned by the onMount hook of the component is called by the runtime.

Variations (v1)

Variations

Listed below are the most common variations of the skip link component as well as specific component variations for different use cases.

You can explore all available options using the component configurator, adjust the component to your needs, and see the changes live in a preview canvas.

Default

Story: components-skip-link-variations--default · tags: components, skip-link, 1, variations

Default behavior of the Skip Link component. Buttons from 1 to 5 can be skipped using the skip link.

überspringen 1 2 3 4 5
Dummy
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1>
  <oc-button-v1>überspringen</oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1>5</oc-button-v1>
<div class="oc-mt-100">
<oc-button-v1>Dummy</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Default",
  args: {},
  render() {
    return html`
      <div class="relative oc-grid oc-gap-100">
        <oc-skip-link-v1>
          <oc-button-v1>überspringen</oc-button-v1>
        </oc-skip-link-v1>
        <oc-button-v1>1</oc-button-v1>
        <oc-button-v1>2</oc-button-v1>
        <oc-button-v1>3</oc-button-v1>
        <oc-button-v1>4</oc-button-v1>
        <oc-button-v1>5</oc-button-v1>
      </div>

      <div class="oc-mt-100">
        <oc-button-v1>Dummy</oc-button-v1>
      </div>

      <style>
        .relative {
          position: relative;
        }
      </style>
    `;
  }
}
Skip To

Story: components-skip-link-variations--skip-to · tags: components, skip-link, 1, variations

Skip to a specific element using the data-oc-skip-link-v1-to attribute. This demonstrates how to skip directly to the 6th button when the skip link is activated.

Zur 6 springen 1 2 3 4 5 6 7 8 9 10
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1>
  <oc-button-v1 data-oc-skip-link-v1-to="#button6">Zur 6 springen </oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1>5</oc-button-v1>
<oc-button-v1 id="button6">6</oc-button-v1>
<oc-button-v1>7</oc-button-v1>
<oc-button-v1>8</oc-button-v1>
<oc-button-v1>9</oc-button-v1>
<oc-button-v1>10</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Skip To",
  render() {
    return html`
      <div class="relative oc-grid oc-gap-100">
        <oc-skip-link-v1>
          <oc-button-v1 data-oc-skip-link-v1-to="#button6">Zur 6 springen </oc-button-v1>
        </oc-skip-link-v1>
        <oc-button-v1>1</oc-button-v1>
        <oc-button-v1>2</oc-button-v1>
        <oc-button-v1>3</oc-button-v1>
        <oc-button-v1>4</oc-button-v1>
        <oc-button-v1>5</oc-button-v1>

        <oc-button-v1 id="button6">6</oc-button-v1>
        <oc-button-v1>7</oc-button-v1>
        <oc-button-v1>8</oc-button-v1>
        <oc-button-v1>9</oc-button-v1>
        <oc-button-v1>10</oc-button-v1>
      </div>

      <style>
        .relative {
          position: relative;
        }
      </style>
    `;
  }
}
Skip After

Story: components-skip-link-variations--skip-after · tags: components, skip-link, 1, variations

Skip after a specific element using the data-oc-skip-link-v1-after attribute. This allows skipping all buttons after the 5th button when the skip link is activated.

5 überspringen 1 2 3 4 5 6 7 8 9 10
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1>
  <oc-button-v1
    variant="secondary"
    size="50"
    data-oc-skip-link-v1-after="#button5"
    icon-type-left="skip-link"
    >5 überspringen
  </oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1 id="button5">5</oc-button-v1>
<oc-button-v1>6</oc-button-v1>
<oc-button-v1>7</oc-button-v1>
<oc-button-v1>8</oc-button-v1>
<oc-button-v1>9</oc-button-v1>
<oc-button-v1>10</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Skip After",
  render() {
    return html`
      <div class="relative oc-grid oc-gap-100">
        <oc-skip-link-v1>
          <oc-button-v1
            variant="secondary"
            size="50"
            data-oc-skip-link-v1-after="#button5"
            icon-type-left="skip-link"
            >5 überspringen
          </oc-button-v1>
        </oc-skip-link-v1>
        <oc-button-v1>1</oc-button-v1>
        <oc-button-v1>2</oc-button-v1>
        <oc-button-v1>3</oc-button-v1>
        <oc-button-v1>4</oc-button-v1>
        <oc-button-v1 id="button5">5</oc-button-v1>

        <oc-button-v1>6</oc-button-v1>
        <oc-button-v1>7</oc-button-v1>
        <oc-button-v1>8</oc-button-v1>
        <oc-button-v1>9</oc-button-v1>
        <oc-button-v1>10</oc-button-v1>
      </div>

      <style>
        .relative {
          position: relative;
        }
      </style>
    `;
  }
}

Story: components-skip-link-variations--multiple-skip-links · tags: components, skip-link, 1, variations

You can configure multiple skip links to skip to different sections or elements. This example shows how to add multiple items to the skip link menu, allowing users to navigate to corresponding elements. Here, the skip link allows skipping to the 6th button, skipping after the 10th button, and skipping all buttons, focusing the last "Dummy" button.

Zur 6 springen 10 überspringen Alles überspringen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Dummy
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1>
  <oc-button-v1 data-oc-skip-link-v1-to="#button6">Zur 6 springen </oc-button-v1>
  <oc-button-v1 data-oc-skip-link-v1-after="#button10">10 überspringen </oc-button-v1>
  <oc-button-v1>Alles überspringen</oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1>5</oc-button-v1>
<oc-button-v1 id="button6">6</oc-button-v1>
<oc-button-v1>7</oc-button-v1>
<oc-button-v1>8</oc-button-v1>
<oc-button-v1>9</oc-button-v1>
<oc-button-v1 id="button10">10</oc-button-v1>
<oc-button-v1>11</oc-button-v1>
<oc-button-v1>12</oc-button-v1>
<oc-button-v1>13</oc-button-v1>
<oc-button-v1>14</oc-button-v1>
<oc-button-v1>15</oc-button-v1>
<div class="oc-mt-100">
<oc-button-v1>Dummy</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Multiple Skip Links",
  render() {
    return html`
      <div class="relative oc-grid oc-gap-100">
        <oc-skip-link-v1>
          <oc-button-v1 data-oc-skip-link-v1-to="#button6">Zur 6 springen </oc-button-v1>
          <oc-button-v1 data-oc-skip-link-v1-after="#button10">10 überspringen </oc-button-v1>
          <oc-button-v1>Alles überspringen</oc-button-v1>
        </oc-skip-link-v1>
        <oc-button-v1>1</oc-button-v1>
        <oc-button-v1>2</oc-button-v1>
        <oc-button-v1>3</oc-button-v1>
        <oc-button-v1>4</oc-button-v1>
        <oc-button-v1>5</oc-button-v1>

        <oc-button-v1 id="button6">6</oc-button-v1>
        <oc-button-v1>7</oc-button-v1>
        <oc-button-v1>8</oc-button-v1>
        <oc-button-v1>9</oc-button-v1>
        <oc-button-v1 id="button10">10</oc-button-v1>

        <oc-button-v1>11</oc-button-v1>
        <oc-button-v1>12</oc-button-v1>
        <oc-button-v1>13</oc-button-v1>
        <oc-button-v1>14</oc-button-v1>
        <oc-button-v1>15</oc-button-v1>
      </div>

      <div class="oc-mt-100">
        <oc-button-v1>Dummy</oc-button-v1>
      </div>

      <style>
        .relative {
          position: relative;
        }
      </style>
    `;
  }
}
Header Variant

Story: components-skip-link-variations--header-variant · tags: components, skip-link, 1, variations

The header variant positions the skip link menu at a fixed position at the top of the page and centers it horizontally.

überspringen 1 2 3 4 5
Dummy
HTML
<div class="relative oc-grid oc-gap-100">
<oc-skip-link-v1 variant="header">
  <oc-button-v1>überspringen</oc-button-v1>
</oc-skip-link-v1>
<oc-button-v1>1</oc-button-v1>
<oc-button-v1>2</oc-button-v1>
<oc-button-v1>3</oc-button-v1>
<oc-button-v1>4</oc-button-v1>
<oc-button-v1>5</oc-button-v1>
<div class="oc-mt-100">
<oc-button-v1>Dummy</oc-button-v1>
<style>
.relative {
  position: relative;
}
</style>
Story source (TypeScript, verbatim from Storybook)
{
  name: "Header Variant",
  args: {},
  render() {
    return html`
      <div class="relative oc-grid oc-gap-100">
        <oc-skip-link-v1 variant="header">
          <oc-button-v1>überspringen</oc-button-v1>
        </oc-skip-link-v1>
        <oc-button-v1>1</oc-button-v1>
        <oc-button-v1>2</oc-button-v1>
        <oc-button-v1>3</oc-button-v1>
        <oc-button-v1>4</oc-button-v1>
        <oc-button-v1>5</oc-button-v1>
      </div>

      <div class="oc-mt-100">
        <oc-button-v1>Dummy</oc-button-v1>
      </div>

      <style>
        .relative {
          position: relative;
        }
      </style>
    `;
  }
}