eduardweb.
Animații (Framer Motion)Începător#css#tailwind#animatii#frontend#performanta

Gradient animat în Tailwind fără Framer Motion: Doar CSS și 0KB JS

De Alexandru Matei, 27 sept. 2026 · 12 vizualizări · 2 like-uri

Postat acum 4 zile
javascript
// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      keyframes: {
        gradient: {
          '0%, 100%': { backgroundPosition: '0% 50%' },
          '50%': { backgroundPosition: '100% 50%' },
        },
      },
      animation: {
        'gradient-shift': 'gradient 8s ease infinite',
      },
    },
  },
};

// Utilizare în HTML / JSX:
// <div className="bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500 bg-[length:200%_200%] animate-gradient-shift h-64 w-full rounded-2xl" />

Nu mai instalați framer-motion doar ca să mișcați două culori pe un landing page. Am văzut dependența asta aruncată într-un proiect de prezentare doar pentru un efect de glow pe fundal, iar la auditul de bundle m-a luat cu dureri de cap: 35KB gzipped degeaba. Rezolvi totul cu trei proprietăți CSS native și câteva clase de Tailwind.

Problema cu interpolarea gradientului în CSS

Dacă ai încercat vreodată să pui un transition direct pe background-image: linear-gradient(...), ai observat probabil că browserul pur și simplu dă flash între stări. CSS nu știe nativ să interpoleze ușor două funcții de gradient fără proprietăți experimentale de @property (care încă pot face figuri pe browsere mai vechi sau webview-uri de iOS).

Trucul clasic, vechi de când lumea, e să trișezi: faci gradientul mult mai mare decât containerul (de exemplu 200% sau 300%) și animezi doar background-position. Practic, deplasezi o textură mare printr-o fereastră mică.

Cum configurăm totul în Tailwind

Ca să nu scrii CSS chior într-un fișier separat, poți extinde tema direct în tailwind.config.js adăugând keyframe-ul și animația corespunzătoare. Ai nevoie de o mișcare dus-întors lină, așa că folosim alternate sau calculăm procentele manual la 0%, 50% și 100%.

În markup, cheia e clasa arbitrară bg-[length:200%_200%] (sau bg-[length:300%_300%] dacă vrei treceri și mai subtile). Fără ea, Tailwind va desena gradientul exact la dimensiunea elementului și background-position nu va avea unde să se deplaseze.

La un proiect recent cu 15k vizitatori unici pe zi, am înlocuit o animație pe canvas făcută de un coleg cu varianta asta pură de CSS. Pe lângă faptul că am scăpat de 40KB de scripturi inutile, First Contentful Paint a scăzut cu 180ms pe dispozitivele mobile medii. Browserul optimizează mult mai eficient compoziția grafică pe un fir separat de execuție când folosești animații native.

Trade-off-ul sincer: Atenție la repaints

Merge perfect pentru hero sections, carduri de pricing cu border animat sau butoane de CTA care trebuie să iasă în evidență. Arată fluid, consumă resurse minime și nu depinde de starea de hidratare din React sau Vue.

Totuși, există o capcană: background-position declanșează uneori operațiuni de repaint pe thread-ul principal dacă este aplicat pe suprafețe uriașe (cum ar fi un body întreg de 4K pixeli). Dacă adaugi peste el și un backdrop-blur-xl, telefoanele Android mai ieftine vor sughița vizibil și vor scădea sub 30fps. Dacă ai nevoie de efectul ăsta pe tot ecranul, izolează-l pe un div fix separat (fixed inset-0 pointer-events-none -z-10) și forțează o compunere pe GPU cu transform: translateZ(0) sau will-change: background-position.

Voi mai folosiți librării de animație pentru fundaluri decorative sau ați rămas fani CSS pur?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.