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.