Místo pro zvědavé medvědy

Search

Text s vlnkou

Animovaný HTML nadpis: jak funguje a proč je to elegantní řešení

Na této stránce je použitý vlastní animovaný nadpis vytvořený pomocí kombinace HTML a CSS, bez potřeby JavaScriptu. Výsledkem je čistý, lehký a vizuálně zajímavý efekt, při kterém se jednotlivá písmena nadpisu postupně objevují odspodu nahoru. Celý text tak působí živě, moderně a přitom nerušivě.

Tento princip je vhodný všude tam, kde má nadpis zaujmout návštěvníka hned při načtení sekce, ale zároveň nemá působit agresivně nebo přehnaně efektně. Hodí se proto zejména pro firemní prezentace, přehledy služeb, portfolio, projektové sekce nebo úvodní bannery.

Prvoplánovitě jsem tento efekt nadpisu chtěl vložit, a vlastně i vložil do patičky mých stránek. Ostatně, pokud se dostanete až na konec této stránky, tak tam tento nadpis uvidíte.

 
Základní princip celého řešení

Celý systém stojí na jednoduché myšlence: místo jednoho souvislého textu je nadpis rozdělený na jednotlivá písmena, přičemž každé písmeno je vložené do samostatného HTML prvku. Díky tomu je možné ovládat animaci každého znaku zvlášť.

Každé písmeno dostane:

  • vlastní pořadí,
  • vlastní malé časové zpoždění,
  • stejnou animační logiku,
  • společný vzhled nadpisu.

Právě díky tomu nevyskočí celý text najednou, ale skládá se plynule znak po znaku.

V HTML kódu jsou mezi značkami <!– popisky funkcí –>, a obdobné je to u CSS kódu, kde mezi značkami /* jsou také popisky funkcí */, které následně doporučuji vymazat!

 

U všech důležitých funkcí jsou popisky mezi lomítky, nebo závorkami, které po aplikaci kódu prosím vymažte.

Další úpravy a nastavení již nechám na Vaší fantazii.

P ř e h l e d p r o j e k t ů B e a r H u g s s . r . o .

Připravený HTML kód pro nadpis

Jak funguje HTML část

V HTML je nadpis zapsaný tak, že každé písmeno je umístěné do samostatného elementu <span>. To umožňuje přiřadit každému znaku pořadí pomocí vlastní proměnné, například --i:0, --i:1, --i:2 a podobně.

 

Toto pořadí se pak využívá v CSS jako základ pro časové zpoždění animace.

  • První písmeno začne hned,
  • druhé o zlomek sekundy později,
  • třetí o něco později než druhé a tak dále.

Výsledkem je plynulé „odhalování“ textu.

 

Zvlášť jsou řešené také mezery mezi slovy. Ty se neanimují jako písmena, ale pouze udržují správné rozestupy v textu.

HTML kód stačí jen zkopírovat "COPY"
				
					<div class="bh-title-wrap">
  <h3 class="bh-reveal-title" aria-label="Přehled projektů Bear Hugs s.r.o.">
    <span style="--i:0">P</span>
    <span style="--i:1">ř</span>
    <span style="--i:2">e</span>
    <span style="--i:3">h</span>
    <span style="--i:4">l</span>
    <span style="--i:5">e</span>
    <span style="--i:6">d</span>
    <span class="bh-space" aria-hidden="true"></span>
    <span style="--i:7">p</span>
    <span style="--i:8">r</span>
    <span style="--i:9">o</span>
    <span style="--i:10">j</span>
    <span style="--i:11">e</span>
    <span style="--i:12">k</span>
    <span style="--i:13">t</span>
    <span style="--i:14">ů</span>
    <span class="bh-space" aria-hidden="true"></span>
    <span style="--i:15">B</span>
    <span style="--i:16">e</span>
    <span style="--i:17">a</span>
    <span style="--i:18">r</span>
    <span class="bh-space" aria-hidden="true"></span>
    <span style="--i:19">H</span>
    <span style="--i:20">u</span>
    <span style="--i:21">g</span>
    <span style="--i:22">s</span>
    <span class="bh-space" aria-hidden="true"></span>
    <span style="--i:23">s</span>
    <span style="--i:24">.</span>
    <span style="--i:25">r</span>
    <span style="--i:26">.</span>
    <span style="--i:27">o</span>
    <span style="--i:28">.</span>
  </h3>
</div>
				
			

Připravený CSS kód

Jak funguje CSS stylování

CSS se stará o tři hlavní oblasti:

1. Vzhled nadpisu

Zde se nastavuje typografie a rozložení, tedy například:

  • velikost písma,
  • tloušťka řezu,
  • výška řádku,
  • mezery mezi písmeny,
  • barva textu,
  • zarovnání na střed,
  • jemný stín pro lepší čitelnost.

Tato vrstva určuje celkový vizuální dojem nadpisu.

2. Chování jednotlivých písmen

Každé písmeno je na začátku:

  • lehce posunuté směrem dolů,
  • neviditelné.

Během animace se postupně:

  • přesune do své přirozené pozice,
  • zviditelní,
  • po určitou dobu zůstane zobrazené,
  • a na konci cyklu se připraví pro opětovné spuštění.

Tím vzniká elegantní efekt nájezdu odspodu nahoru.

3. Responzivita pro různá zařízení

Nadpis je upravený zvlášť pro:

  • počítače,
  • tablety,
  • mobilní zařízení na výšku.

Na každém typu zařízení se může měnit velikost písma, řádkování i síla animačního posunu. Díky tomu je text dobře čitelný na velké obrazovce i na mobilu.

CSS kód stačí jen zkopírovat "COPY"
				
					/* NADPIS: Přehled projektů Bear Hugs s.r.o.
   Animace: písmena se objevují odspodu nahoru*/

/* 1) HLAVNÍ OBAL
   Tento blok určuje šířku, zarovnání a prostor kolem nadpisu*/
   
.bh-title-wrap{
  width: 100%;                    /* blok zabere celou dostupnou šířku */
  text-align: center;             /* zarovnání obsahu doprostřed */
  padding: 10px 0 18px 0;         /* horní / pravé / dolní / levé odsazení */
  overflow: visible;              /* nic se nesmí ořezat */
}

/* 2) NADPIS
   Zde je hlavní nastavení pro PC */
.bh-reveal-title{
  --bh-offset-y: 34px;            /* počáteční svislý posun písmen směrem dolů */

  margin: 0;                      /* zrušení výchozího vnějšího odsazení nadpisu */
  padding: 0 0 0.14em 0;          /* spodní vnitřní prostor proti ořezu spodních tahů */
  font-size: 54px;                /* velikost písma na PC */
  font-weight: 300;               /* tloušťka písma */
  line-height: 1.22;              /* výška řádku */
  letter-spacing: 0.02em;         /* mezery mezi písmeny */
  text-transform: none;           /* bez automatické změny na velká/malá písmena */
  font-family: inherit;           /* přebere font z webu */
  color: #020202;                 /* barva textu */

  display: inline-flex;           /* nadpis se chová jako pružný inline blok */
  flex-wrap: wrap;                /* umožní zalomení na další řádek */
  justify-content: center;        /* obsah uvnitř nadpisu na střed */
  align-items: flex-end;          /* zarovnání písmen ke spodní hraně */
  gap: 0;                         /* bez mezer mezi prvky */

  overflow: visible;              /* důležité – neusekne spodní části písmen */
  text-shadow: 0 1px 0 rgba(0,0,0,0.03); /* velmi jemný stín textu */
}

/* 3) JEDNOTLIVÁ PÍSMENA
   Každé písmeno má vlastní animaci a zpoždění */
   
.bh-reveal-title span{
  display: inline-block;                          /* každé písmeno je samostatný blok */
  opacity: 0;                                    /* na začátku je neviditelné */
  transform: translateY(var(--bh-offset-y));     /* na začátku je posunuté dolů */
  animation-name: bhLetterLoop;                  /* název animace */
  animation-duration: 15s;                       /* délka celého cyklu */
  animation-timing-function: linear;             /* rovnoměrný průběh animace */
  animation-iteration-count: infinite;           /* animace se opakuje stále dokola */
  animation-delay: calc(var(--i) * 0.15s);       /* postupné zpoždění podle pořadí písmene */
  will-change: transform, opacity;               /* optimalizace pro prohlížeč */
}

/* 4) MEZERY MEZI SLOVY
   Speciální prvek, který vytváří mezery a neanimuje se
   */

.bh-reveal-title .bh-space{
  width: 0.38em;                 /* šířka mezery mezi slovy */
  opacity: 1;                    /* mezera je stále aktivní */
  transform: none;               /* bez posunu */
  animation: none;               /* mezera se neanimuje */
}

/* 5) ANIMACE
   Písmena se objeví odspodu, zůstanou viditelná a pak se resetují */

@keyframes bhLetterLoop{
  0%{
    opacity: 0;                                  /* písmeno je skryté */
    transform: translateY(var(--bh-offset-y));   /* písmeno je posunuté dolů */
  }

  4%{
    opacity: 1;                                  /* písmeno se zobrazí */
    transform: translateY(0);                    /* písmeno dojede na své místo */
  }

  90%{
    opacity: 1;                                  /* většinu času zůstává viditelné */
    transform: translateY(0);                    /* zůstává na místě */
  }

  100%{
    opacity: 0;                                  /* na konci cyklu zmizí */
    transform: translateY(var(--bh-offset-y));   /* a vrátí se dolů pro nový cyklus */
  }
}

/* 6) TABLET
   Nastavení pro zařízení do šířky 1024 px */

@media (max-width: 1024px){
  .bh-title-wrap{
    text-align: center;           /* zarovnání na střed i na tabletu */
    padding: 8px 0 16px 0;        /* mírně menší odsazení */
  }

  .bh-reveal-title{
    --bh-offset-y: 28px;          /* menší posun písmen při animaci */
    font-size: 40px;              /* velikost písma pro tablet */
    line-height: 1.24;            /* výška řádku */
    letter-spacing: 0.015em;      /* menší mezery mezi písmeny */
    justify-content: center;      /* obsah na střed */
    padding-bottom: 0.16em;       /* spodní prostor proti ořezu */
  }
}

/* 7) MOBIL NA VÝŠKU
   Nastavení pro zařízení do šířky 767 px */

@media (max-width: 767px){
  .bh-title-wrap{
    text-align: center;           /* zarovnání na střed i na mobilu */
    padding: 6px 0 14px 0;        /* menší odsazení pro mobil */
  }

  .bh-reveal-title{
    --bh-offset-y: 22px;          /* menší nájezd písmen odspodu */
    font-size: 28px;              /* velikost písma pro mobil */
    line-height: 1.28;            /* vyšší řádek kvůli čitelnosti */
    letter-spacing: 0.01em;       /* jemnější rozestup písmen */
    justify-content: center;      /* obsah doprostřed */
    padding-bottom: 0.18em;       /* spodní prostor proti ořezu */
  }
}

/* 8) PŘÍSTUPNOST
   Pokud má uživatel omezené animace, vše se zobrazí bez pohybu */

@media (prefers-reduced-motion: reduce){
  .bh-reveal-title span{
    animation: none !important;   /* vypnutí animace */
    opacity: 1 !important;        /* písmena budou stále vidět */
    transform: none !important;   /* bez posunu */
  }
}
				
			
Jednoduché úpravy:

Řádek 26:

font-family: inherit; /* přebere font z webu */ můžete změnit na všechna Google Fonts – Roboto, Open Sans, Lato, Montserrat, Poppins atd.

Řádek 27:

color: #020202; /* barva textu */ změna barvy písma.

Řádek 47:

animation-duration: 15s; /* délka celého cyklu */ reset celé animace, můžete nastavit v sekundách.

Proč je výhodné, že řešení nevyužívá JavaScript?

Jednou z hlavních výhod tohoto projektu je to, že efekt funguje čistě přes HTML a CSS. To má několik praktických přínosů.

Nižší zatížení stránky

Není potřeba načítat další skript. Stránka zůstává lehčí a rychlejší.

Jednodušší údržba

HTML a CSS se upravují velmi snadno. Pokud je potřeba změnit text, velikost, rychlost animace nebo zarovnání, stačí upravit několik řádků kódu.

Lepší kompatibilita

Tento způsob dobře funguje i v běžných page builderech, například v Elementor PRO, kde lze HTML vložit do HTML widgetu a CSS přidat samostatně.

Čistší struktura

Oddělení HTML a CSS je přehledné. HTML definuje obsah, CSS vzhled a pohyb. Díky tomu je kód lépe čitelný a lépe se s ním pracuje i v budoucnu.

 
———————————–
Jak funguje samotná animace?

Animace je založená na CSS @keyframes. V praxi to znamená, že pro každé písmeno je přesně určeno:

  • odkud startuje,
  • kdy se má objevit,
  • jak dlouho zůstane viditelné,
  • kdy se vrátí do výchozího stavu.

Písmeno se na začátku nachází níže, než je jeho výsledná pozice. Současně má nulovou viditelnost. Jakmile animace začne, písmeno se plynule zvedne nahoru a zároveň se zobrazí. Díky tomu nevzniká tvrdý skok, ale měkký reveal efekt.

Celý cyklus je nastavený tak, aby se po určité době znovu opakoval. Nadpis tedy nepůsobí staticky, ale pravidelně se znovu „nadechne“ a připomene svou přítomnost.

———————————–
Proč bylo potřeba řešit spodní část písmen?

U některých znaků, například:

  • j
  • g
  • y
  • p

může docházet k tomu, že jejich spodní tah zasahuje níž než běžná výška písma. Pokud je kontejner příliš těsný nebo má nastavené ořezávání obsahu, může spodní část takového písmene vypadat useknutě.

Proto bylo v projektu důležité upravit:

  • spodní odsazení,
  • výšku řádku,
  • přetečení obsahu (overflow),
  • celkový prostor uvnitř nadpisu.

Díky tomu jsou všechna písmena zobrazena správně a nic se dole neztrácí.

Další nastavení je opět jen a jen na Vás…