Animace zobrazení obrázku na pozadí

Obrázek v pozadí prvku lze použít jako náhražku obyčejného obrázku (image) na celou řadu věcí, s jednou výjimkou – zobrazení nebo skrytí obrázku na pozadí není možno animovat pomocí transition (podle W3C je možno animovat pouze barvu a pozici).

Nebo existuje nějaký způsob, jak dát prvku obrázek do pozadí (např. sprite) a zároveň animovat jeho zobrazení? Samozřejmě bez použití JS.

Animovat pozadí opravdu nejde?

Webkit umožňuje animovat všechny background vlastnosti včetně background-image (zobrazení, skrytí nebo změna). Ostatní prohlížeče umí animovat i jiné vlastnosti než uvádí W3C, jako třeba background-size, ale v případě background-image jakékoliv přechody ignorují.

Pozadí v dodaném prvku

Z výše uvedeného je jasné, že bude potřeba prohlížeč nějak obejít a zobrazit obrázek jinak nebo jinde.

Zkušenější webaře jistě napadne přidat do HTML další prvek, kterému budete měnit jeho průhlednost (opacity), která animovat jde (a použila by se v případě normálního obrázku). Problém tohoto řešení je v tom, že vyžaduje změnu HTML, která se někomu nemusí líbit.

Prvky ale můžete přidávat i pomocí CSS selektorů :before a :after.

#el { position: relative; } 
#el:after {
   content: "";
   position: absolute;
   left: 0;
   top: 0;
   width: 100%;
   height: 100%;
}

Nejprve původnímu prvky #el nastavíme relativní pozicování, čímž umožníme vnořeným prvkům (a tedy i těm :before a :after) pozicovat se v rámci jeho rozměrů.

Pak už můžeme přidat :before nebo :after prvek, kterým pomocí absolutního pozicování překryjeme původní prvek. Samozřejmě nesmíme zapomenou na definici content, bez které prohlížeč další prvek nevytvoří.

Přidanému prvku nastavíme pozadí, kterým prvek vyplníme:

#el:after {
    /* ... */
    background: transparent
                url('bg.jpg')
                no-repeat center center;
    background-size: contain;
}

Pokud naopak chcete využít sprite obrázku, stačí správně nastavit velikost a pozice pro ikonky:

#el.icon_4x4:after {
    /* ... */
    background: transparent
                url('sprites.png')
                no-repeat 0 0;
    background-size: 400%;
}
#el.icon_4x4_1x1 {
    background-position: 0 0;
}
#el.icon_4x4_2x3 {
    background-position:
         calc(100% / 3) calc(200% / 3);
}
/* apod. */

Animace zobrazení

Následně už stačí přidat požadovaný přechod:

#el:after {
    /* ... */
    transition: opacity 1s ease 0s;
    opacity: 0;
}
#el.show:after,
#el:hover:after {
    opacity: 1;
}

V ukázce vidíte, jak zobrazit pozadí buď pomocí změny třídy (pomocí JS) nebo automaticky po najetí myší.

Hledání chyb

Pokud nastavené pozadí nevidíte, zkuste prvkům přidat nějaké jednolité pozadí a okraj:

/* Pro hledání chyb: */
#el {
    background: blue;
    border: 1px solid green;
    outline: 1px solid green;
}
#el:after {
    /* ... */
    background: yellow;
    border: 1px solid red;
    outline: 1px solid red;
    opacity: 1;
    display: block;
    visibility: visible;
}

Pomocí pozadí a okraje (border nebo outline) zajistíte, že budou prvky dobře vidět (protože většina debuggerů dokáže označit daný prvek, ale již ne jeho :before a :after elementy). Samozřejmě nezapomeňte zkusit nastavit dodanému prvku vlastnosti, které ho činí viditelným, jako display, visibility a opacity… prostě pro jistotu.

Pokud stále prvek nevidíte, uvědomte si, že pro některé prvky nelze v některých prohlížečích :before a :after nastavit. Většinou jde o prvky, které sami nemohou obsahovat žádné jiné prvky (tzn. nejsou to kontejnery) jako input, img, br, hr a další tzv. self-closing prvky, které můžete zapsat jako <element />. Jiné prohlížeče zase ignorují definice pro tzv. nahrazované prvky, které jsou ve výsledné stránce zobrazeny jako něco jiného – hlavně jde o obrázky (img a svg), kde je prvek nahrazen vlastní grafikou, a formulářové prvky (input, select, button apod.), jejichž vzhled určuje operační systém.

Pro ověření funkčnosti vašeho CSS zkuste původní prvek změnit na DIV nebo SPAN, které zaručeně ve všech prohlížečích zpracují :before a :after.

Pokud potřebujete podporu i v IE8, je potřeba nastavit do content nějakou skutečnou hodnotu (text nebo url()). IE7 a starší tohle nepodporují vůbec.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *