CSS-flikgenerator

Nästa

Flikar finns överallt – i inställningsfönster, på dokumentationswebbplatser och i produktgallerier. Inbyggd HTML saknar ett särskilt flikelement, så utvecklare bygger egna. Denna generator skapar ett enkelt flikfält i HTML + CSS: en accentfärg för den aktiva fliken, en hörnradie för knapparna och ett hover-tillstånd. Klistra in markeringen i ditt projekt och koppla flikbytet till din egen JavaScript.

Så bygger du flikar

  1. 1

    Välj en accentfärg

    Bakgrunds- och textfärg för den aktiva fliken. Välj en färg som passar ditt varumärke.

  2. 2

    Ställ in hörnradien

    Rundar av knapparnas övre hörn. Högre värden ger ett mjukare utseende.

  3. 3

    Redigera etiketterna

    Resultatet innehåller tre knappar, "Overview", "Details" och "Settings": byt namn så att de passar ditt innehåll.

  4. 4

    Kopiera koden

    Flikmarkeringen levereras med ett eget <style>-block. Klistra in båda på din sida.

  5. 5

    Lägg till flikbyte

    Generatorn producerar bara den visuella delen. Koppla knapparna till din egen JavaScript eller ditt UI-bibliotek för att visa och dölja panelerna.

Korrekt tillgänglig markup

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

Kritiska egenskaper:

  • role="tablist" omsluter knapparna.
  • role="tab" på varje knapp, tillsammans med aria-selected och aria-controls.
  • tabindex använder roving tabindex-mönstret: endast den aktiva fliken är 0, de övriga är -1. Pilknapparna flyttar fokus mellan dem.
  • role="tabpanel" på varje panel, där aria-labelledby pekar på dess flik.
  • hidden på inaktiva paneler (inte endast display: none – detta är det attribut som AT använder).

Tangentbordskontrakt

Tangent Åtgärd
Tab In i / ut ur fliklistan
ArrowLeft Föregående flik (går runt till den sista)
ArrowRight Nästa flik (går runt till den första)
Home Första fliken
End Sista fliken
Enter / Space Aktivera den fokuserade fliken (vid manuell aktivering)

Automatisk aktivering (flik skiftas när fokus flyttas) jämfört med manuell (fokus flyttas och flik aktiveras vid tryck på Enter) – WAI-ARIA tillåter båda alternativen. Den automatiska metoden är enklare för användare utan synbesvär; den manuella är bättre när innehållet i fliken är omfattande att visa.

Understruken stil

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

Pillformad stil

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

Synligt fokus

Rita alltid en fokusring när fokus kommer via tangentbordet:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

JavaScript

ungefär:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

Trettio rader totalt, inga beroenden.

Flikar vs. dragspel

På smala skärmar blir flikraderna trånga. Vanligt mönster: flikar på datorn, dragspel (accordion) på mobilen. Använd en container query eller media query för att ändra den visuella presentationen utan att ändra ARIA-rollerna.

Vanliga frågor

För tillgängliga flikar: ja. Utan role="tablist" och role="tab" behandlar skärmläsare knapparna som vanliga knappar, och användarna förlorar den vanliga navigeringskonventionen. Alternativet är ett enkelt <details> / <summary>-dragspel med inbyggd semantik.

Automatiskt (fliken aktiveras när fokus flyttas) fungerar bra när innehållet i varje flik är lätt att rendera. Manuellt (fokus flyttas och Enter aktiverar) är bättre när ett flikbyte utlöser tungt arbete, till exempel hämtning eller rendering av ett stort formulär.

För innehållsbärande flikar (dokumentation, produktflikar): ja – använd en hash (#specs) eller en frågeparameter så att länkar kan djuplänka till en specifik flik och den aktiva fliken bevaras mellan omladdningar. För UI-flikar (inställningsfönster) är URL:en valfri.

Endast med kryssrute-/radioknappstricket, som saknar navigering med piltangenter och ARIA-tillstånd. För en verkligt tillgänglig implementering är den lilla JS-snutten värd det. Om du behöver serverrenderade reservlösningar kopplar du varje flik till en unik URL och renderar motsvarande panel på serversidan.

Relaterade verktyg

Verktyget finns på andra språk