Tailwind CSS Academy · Lektion

Hvad @apply gør, og hvornår det skal bruges

Forstå, hvordan @apply indsætter utility-klasser i en CSS-regel, og identificér situationer, hvor det giver mening at udtrække en klasse.

Lektion 1 af 413 trin

Hvad @apply gør, og hvornår det skal bruges er en gratis Tailwind CSS Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Tailwind CSS Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Tailwind CSS Academy-kurset indeholder 4 lektioner i alt.

Problemet, som @apply løser

Tailwinds tilgang med værktøjer først placerer alle typografiske og visuelle egenskaber direkte på HTML-elementer. På simple sider fungerer det fint. Men når den samme kombination af 15 værktøjsklasser optræder på 50 knapelementer, kræver en ændring af én designdetalje ændringer 50 steder. Direktivet @apply løser dette ved at lade dig udtrække hyppigt gentagne kombinationer af værktøjer til én enkelt brugerdefineret CSS-klasse — uden at opgive Tailwinds værktøjssystem.

Sådan fungerer @apply

@apply er et PostCSS-direktiv, som Tailwind behandler under kompileringen. Når Tailwind møder @apply bg-blue-600 text-white font-semibold i en CSS-regel, indsætter det de CSS-erklæringer, som disse værktøjer ville generere. Den resulterende CSS-regel indeholder de faktiske egenskabsværdier, ikke Tailwind-klassenavne. Den endelige browseroutput har ingen viden om Tailwind eller @apply.

/* Your CSS with @apply */
@layer components {
  .btn {
    @apply px-4 py-2 rounded-lg font-semibold text-sm;
  }
  .btn-primary {
    @apply btn bg-blue-600 text-white hover:bg-blue-700;
  }
}

/* Compiled output (what the browser sees) */
.btn {
  padding: 0.5rem 1rem;
  border-radius: 0.5rem;
  font-weight: 600;
  font-size: 0.875rem;
}
.btn-primary {
  /* btn styles + primary colors */
}

Skrivning af @apply i en CSS-fil

Brug @apply i CSS-filer, der behandles af Tailwind. Pak altid udtrukne komponentklasser ind i en @layer components-blok, så Tailwind indsætter dem på den korrekte placering i det genererede stylesheet — efter basis typografiske og visuelle egenskaber, men før værktøjsklasserne. Det sikrer, at værktøjsklasser, der anvendes direkte i HTML, stadig kan tilsidesætte typografien og de visuelle egenskaber i din komponentklasse.

/* styles/components.css or in your main CSS file */
@layer components {
  .btn {
    @apply inline-flex items-center justify-center
           px-4 py-2 rounded-lg text-sm font-semibold
           transition-colors duration-150
           focus:outline-none focus:ring-2 focus:ring-offset-2;
  }

  .btn-primary {
    @apply btn bg-blue-600 text-white
           hover:bg-blue-700
           focus:ring-blue-500;
  }

  .btn-secondary {
    @apply btn bg-gray-200 text-gray-800
           hover:bg-gray-300
           focus:ring-gray-500;
  }
}

Hvornår skal du bruge @apply

De rigtige situationer for @apply er få og specifikke. Brug det, når: den samme værktøjskombination optræder ordret 5 eller flere steder; komponenten gengives i en kontekst, hvor du ikke kan styre HTML'en (f.eks. indhold gengivet fra markdown eller en tredjepartskomponent); eller når begrænsninger i rammeværket gør betinget logik baseret på klasser upraktisk. Hvis du kan bruge JSX-komponenter, Vue-komponenter eller delvise HTML-skabeloner, er de næsten altid et bedre valg.

Almindelige anvendelser af @apply

Praktiske anvendelser af @apply omfatter: grundlæggende knaptypografi og -udseende, der deles af mange knapforekomster, ensartede nulstillingsregler for formularfelter, typografi til blogindhold gengivet fra markdown og værktøjsklasser, der er indlejret i HTML fra tredjepartskomponenter, som du ikke kan ændre. Fælles for alle disse tilfælde er, at du ikke kan placere værktøjsklasserne direkte på det HTML-element, der har brug for dem.

@layer components {
  /* Used in markdown-rendered content where you can't add classes to elements */
  .content h1 { @apply text-3xl font-bold mb-4 text-gray-900; }
  .content h2 { @apply text-2xl font-semibold mb-3 text-gray-800; }
  .content p  { @apply text-gray-600 leading-relaxed mb-4; }
  .content a  { @apply text-blue-600 underline hover:text-blue-800; }
  .content ul { @apply list-disc list-inside mb-4 space-y-1; }

  /* Shared input base */
  .form-field {
    @apply w-full rounded-lg border border-gray-300 px-4 py-2
           focus:outline-none focus:ring-2 focus:ring-blue-500 text-sm;
  }
}

Direktivet @layer

Tailwind har tre lag: base, components og utilities. Brug @layer base til nulstilling af elementer og globale standarder. Brug @layer components til udtrukne komponentklasser, der er opbygget med @apply. Brug @layer utilities til brugerdefinerede værktøjsklasser med ét formål. Lagenes rækkefølge sikrer, at værktøjsklasser altid tilsidesætter komponentklasser, som igen tilsidesætter basisreglerne — og dermed bevares det forventede hierarki for specificitet.

@layer base {
  /* Global resets and element defaults */
  body { @apply font-sans text-gray-900 antialiased; }
  a { @apply text-blue-600 hover:underline; }
}

@layer components {
  /* Extracted multi-utility patterns */
  .card { @apply bg-white rounded-xl shadow p-6; }
}

@layer utilities {
  /* Custom single-purpose utilities */
  .text-balance { text-wrap: balance; }
}

Anvendelse af modifikatorer med @apply

Du kan bruge tilstands- og responsive modifikatorer i @apply på samme måde som i HTML. Skriv hover:bg-blue-700, focus:ring-2 eller md:flex direkte i din @apply-erklæring, så genererer Tailwind den korrekte CSS baseret på vælgere. Det er en af grundene til, at @apply er mere effektivt end at skrive CSS manuelt — du får hele variantsystemet uden ekstra arbejde.

@layer components {
  .badge {
    @apply
      inline-flex items-center px-2.5 py-0.5 rounded-full
      text-xs font-medium
      bg-gray-100 text-gray-700
      /* Hover state */
      hover:bg-gray-200
      /* Dark mode */
      dark:bg-gray-700 dark:text-gray-300
      dark:hover:bg-gray-600
      /* Transition */
      transition-colors duration-150;
  }
}

Kædning af @apply-klasser

Du kan referere til andre komponentklasser, der er oprettet med @apply, i en anden @apply. Definer f.eks. en grundklasse .btn, og referer derefter til den i .btn-primary for at nedarve alle grundtypografierne og -egenskaberne for knapper. Det opretter en enkel nedarvningskæde. Vær forsigtig med dyb indlejring — det opretter implicitte afhængigheder, som kan være svære at spore under fejlfinding.

@layer components {
  /* Base class */
  .btn {
    @apply inline-flex items-center px-4 py-2 rounded-lg
           text-sm font-medium transition-colors duration-150
           focus:outline-none focus:ring-2 focus:ring-offset-2;
  }

  /* Variants inherit from .btn */
  .btn-primary   { @apply btn bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500; }
  .btn-danger    { @apply btn bg-red-600 text-white hover:bg-red-700 focus:ring-red-500; }
  .btn-ghost     { @apply btn text-gray-700 hover:bg-gray-100 focus:ring-gray-400; }
}

@apply i SFC-stilarter

I Vue Single File Components (SFC'er) og nogle React-opsætninger med CSS Modules kan du bruge @apply i komponentens <style>-blok. Det holder komponentstilarterne samlet med skabelonen, samtidig med at Tailwind-værktøjer stadig bruges som byggesten. Konfigurer din bundler til at behandle disse style-blokke gennem PostCSS med Tailwind-pluginet, så @apply aktiveres.

<!-- Vue SFC with @apply in <style> -->
<template>
  <button class="btn">Click Me</button>
</template>

<style scoped>
  .btn {
    @apply bg-blue-600 text-white px-4 py-2 rounded-lg
           font-medium hover:bg-blue-700
           transition-colors duration-150;
  }
</style>

Det rigtige spørgsmål: Er @apply nødvendigt

Før du griber til @apply, skal du altid spørge: Kan jeg i stedet udtrække dette til en komponent? I React betyder det en Button-komponent, der accepterer en variant-egenskab. I HTML betyder det en delvis skabelon eller en skabeloninkludering. Komponentudtrækning er normalt bedre end @apply, fordi den er eksplicit, søgbar og fungerer med alle rammeværk. Brug kun @apply, når komponentudtrækning ikke er mulig eller praktisk.

/* Instead of @apply in a CSS file... */
.btn-primary { @apply bg-blue-600 text-white px-4 py-2 rounded-lg; }

/* Prefer a JSX component */
function Button({ children, variant = 'primary' }) {
  const styles = {
    primary: 'bg-blue-600 text-white hover:bg-blue-700',
    secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',
  };
  return (
    <button className={'px-4 py-2 rounded-lg font-medium ' + styles[variant]}>
      {children}
    </button>
  );
}

Kontrol af @apply-output

Efter du har skrevet en @apply-regel, skal du kontrollere, at den kompileres korrekt, ved at bygge din CSS og inspicere outputtet. Søg efter det klassenavn, du oprettede, i den kompilerede CSS-fil. Du bør se de fulde CSS-erklæringer indsat — ikke @apply-syntaks, som fjernes under kompileringen. Hvis klassen mangler eller viser uventede egenskaber, skal du kontrollere placeringen af @layer og sikre, at alle refererede værktøjer er gyldige Tailwind-klasser.

# Build and search for your custom class
npx tailwindcss -i ./src/input.css -o ./dist/output.css
grep '.btn-primary' ./dist/output.css

# Or watch mode for real-time feedback
npx tailwindcss -i ./src/input.css -o ./dist/output.css --watch

Hurtigt tjek

Test din forståelse af @apply-direktivet i Tailwind CSS.

Opsummering af lektionen

I denne lektion lærte du: @apply indsætter CSS'en fra værktøjsklasser i et brugerdefineret klassenavn og er ideelt til indhold, hvor du ikke kan tilføje klasser direkte. Placér altid klasser baseret på @apply i @layer components for at bevare den korrekte specificitet, og komponentudtrækning (JSX, Vue SFC, delvise HTML-skabeloner) er normalt at foretrække frem for @apply, når det er muligt. Næste emne er opbygning af genanvendelige komponentklasser med @apply.

Gratis at komme i gang

Lær HTML med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “Hvad @apply gør, og hvornår det skal bruges” gratis?

Ja — hele teksten til “Hvad @apply gør, og hvornår det skal bruges” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Tailwind CSS Academy-kurset, skal du opgradere til CoddyKit PRO. Tailwind CSS Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Hvad @apply gør, og hvornår det skal bruges”?

Forstå, hvordan @apply indsætter utility-klasser i en CSS-regel, og identificér situationer, hvor det giver mening at udtrække en klasse. Du øver dig i Tailwind CSS Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Tailwind CSS Academy?

Der kræves ingen tidligere erfaring. Tailwind CSS Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Hvad @apply gør, og hvornår det skal bruges”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Tailwind CSS Academy-lektion?

Ja. Alle Tailwind CSS Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvad @apply gør, og hvornår det skal bruges
  2. Oprettelse af genanvendelige komponentklasser
  3. Organisering af tilpasset CSS med layers
  4. Ulemper ved @apply og alternativer
← Tilbage til Tailwind CSS Academy