Linux E X P R E S

Facebook

jQuery (8) – rozměry a pozice

jquery.png

Práce s rozměry vizuálních objektů a jejich pozicemi je řešitelná přímo přes CSS. Existuje však jednodušší a pohodlnější cesta – využít speciální metody určené přímo k tomuto účelu.


Proč nepoužít metodu css()?

Mějme následující kus HTML kódu:

<div id="blok" style="width: 160px; height: 100px>
...
</div>

Každý jistě hned vidí, že to je blok o rozměrech 160 x 100 pixelů, v němž je nějaký obsah. Teď budeme potřebovat blok o něco rozšířit, přičemž nebudeme moci vycházet z původní šířky, nýbrž z té aktuální. Jednou z možností je použít již dobře známou metodu css():

$('#blok').css('width', (Number($('#blok').css('width').replace('px', '')) + 40) + 'px');

Takový kód je poměrně dlouhý, špatně srozumitelný a navíc výkonově neefektivní. Co totiž dělá? Získá hodnotu v pixelech, která je vyjádřena včetně jednotek a tedy jako řetězec. Ten se musí zbavit jednotek, převést na číslo, přičíst požadované rozšíření, převést zpět na řetězec a připojit jednotky (poslední dva kroky lze i vynechat, proběhnou automaticky).

Novější verze jQuery (od 1.6) to umožňují zapsat podstatně jednodušeji. Metoda css() přijímá „relativní hodnoty“ a lze tedy příklad přepsat do této podoby:

$('#blok').css('width', '+=40');

To už je výrazně příjemnější, ale jen v případě, že se přidává pevně definovaná hodnota, kterou lze zapsat přímo do řetězce. Získáme-li však tuto hodnotu odjinud, řetězec by se musel „lepit“ dohromady. Především je tu ale pořád problém s výkonem, protože se nelze obejít bez zpracování řetězce.

Metody pro práci s rozměry

Pokud potřebujeme s rozměry provádět nějaké výpočty, nejlepší bývá používat k tomu určené metody – tedy width()height(). Slouží jak ke zjišťování rozměrů, tak k jejich nastavování. Pracuje se s čísly bez jednotek, rozměry jsou vyjádřeny v pixelech. Výše uvedený příklad by se přepsal do této podoby:

var b = $('#blok');
b.width(b.width() + 40);

Při použití pro zjištění šířky se pracuje pouze s prvním objektem v instanci jQuery (pokud by jich tam bylo víc), při nastavování se nová šířka nastaví všem.

Při zjišťování šířky může metoda vrátit i desetinné číslo. Obvykle to není nijak na závadu, ale je dobré s tím počítat.

Při nastavování není hodnota omezena jen na číslo – lze použít i jednotky, resp. cokoli, co by se použilo při volání metody css() – například i řetězec „auto“. V případě pixelů je to samozřejmě zbytečné.

Podobně jako se pro šířku používá metoda width(), pro výšku je tu height(). Pracuje se s ní úplně stejně, takže k ní není v podstatě co dodat. Snad jen to, že lze při nastavování rozměrů metody řetězit, protože vracejí příslušnou instanci jQuery:

$('#blok').width(300).height(200);

Příklad je zcela zřejmý, nastaví šířku výše popsaného bloku na 300 a výšku na 200 pixelů.

Pozor ještě na jednu významnou odlišnost oproti css(). Metody width()height() vždy vracejí rozměry obsahu, tedy bez vnitřního odsazení (padding) a ohraničení (border). Naopak css('width'), resp. css('height') vrací rozměry podle aktuálního nastavení box-sizing, která při hodnotě border-boxpadding-box znamená připočtení odsazení i ohraničení, resp. jen odsazení. Je třeba to mít na paměti.

Další rozměrové metody

Někdy potřebujeme velikost včetně vnitřního odsazení, případně i ohraničení (viz další informace výše). Pak využijeme další dvojice metod, které jQuery nabízí. Jsou to innerWidth()innerHeight(), resp. outerWidth()outerHeight(). První dvě připočtou k rozměrům i vnitřní odsazení (padding), druhé dvě navíc ještě ohraničení (border) a případně i vnější odsazení (margin).

Všechny z uvedených metod lze použít i k nastavování a platí pro ně stejná pravidla jako pro width()height(). Ovlivňují vždy jen rozměry obsahu, do ostatních parametrů nezasahují (fungují, jako kdyby odečetly příslušné „okraje“ a pak zavolaly metodu pro nastavení čisté velikosti).

Metody pro práci s pozicemi

Podobná situace jako u rozměrů je také u pozic. Je to ale trochu složitější – může nás totiž zajímat hned vícero druhů pozicování. Běžně (v CSS) se pozice počítají vzhledem k tzv. obsahujícímu bloku, jehož určení nemusí být úplně jednoduché. Proto se mnohdy hodí pracovat raději s pozicováním v rámci celého dokumentu.

Pozice vůči obsahujícímu bloku

Toto je pozice, jakou známe z CSS (vlastnosti left, right, topbottom). Počítá se vůči obsahujícímu bloku, což je – zjednodušeně řečeno – nejbližší nadřazený blok, který má vlastnost position nastavenou na absolute, relative nebo fixed. Pokud takový blok na cestě vzhůru není, počítá se pozice vůči celému dokumentu (v případě pozicování fixed vůči obrazovce, resp. u stránkovaného tisku vůči stránce).

Je to tedy podobné, jako když zjišťujeme rozměry – místo metody css(), která by zde šla použít, použijeme speciální metodu určenou jen pro pozice: position(). Tady je však jiné to, že se pozice nezjišťuje po jednotlivých složkách, nýbrž celá v jediném volání. Návratovou hodnotou je objekt obsahující složky lefttop.

var pos = $('#blok').position();
alert('Pozice: ' + pos.left + ', ' + pos.top);

Příklad zjistí aktuální pozici bloku a vypíše ji do notifikačního dialogu. Čísla neobsahují jednotky, jsou v pixelech a opět mohou být i desetinná. Přepsáno pro metodu css() by to vypadalo nějak takto:

var l = $('#blok').css('left').replace('px', '');
var t = $('#blok').css('top').replace('px', '');
alert('Pozice: ' + l + ', ' + t);

Je to samozřejmě pomalejší a těžkopádnější, na druhou stranu lze získat i pozice z opačných stran (tj. rightbottom), což metoda position() neumožňuje. Tato metoda neumožňuje ani nastavování pozice. Potřebujeme-li ji nastavit vůči obsahujícímu bloku, nezbude než sáhnout po metodě css():

var pos = $('#blok').position();
$('#blok').css('left', pos + 40);

Netřeba snad připomínat, že pokud by se tento kód použil přímo na objekt z HTML fragmentu na začátku článku, nic by se nestalo – výchozí pozicování je totiž „statické“ a s objektem proto nelze hýbat. Muselo by se, ať už jakýmkoli způsobem, nejprve změnit například na absolute nebo relative.

Pozice vůči dokumentu

Tohle nejspíš využijeme častěji. Pozice vůči dokumentu je nezávislá na tom, přes jaké bloky k objektu vede cesta. Máme k dispozici metodu offset(), jež vrací úplně stejný objekt jako position(), jen samozřejmě často s jinými hodnotami. Příklad pro zjištění pozice tedy můžeme přepsat:

var pos = $('#blok').offset();
alert('Pozice: ' + pos.left + ', ' + pos.top);

Změní se jen název metody, jinak je vše stejné. Skutečně „zábavné“ to ale začíná být až v okamžiku, kdy tutéž metodu použijeme pro nastavení pozice:

var pos = $('#blok').offset();
pos.left += 40;
$('#blok').offset(pos);

Jak vidíte, objekt se souřadnicemi se použije i pro nastavení nové pozice. Tady ale navíc proběhne „kouzlo“, které posune i blok, u kterého to „nejde“, tedy třeba ten z výše uvedeného HTML kódu. Pokud je totiž blok pozicován staticky, metoda to automaticky přehodí na relativní pozicování. Pak už samozřejmě pozici změnit lze.

Funkce jako parametr

Mnohé z dosud popsaných metod (a řada dalších) přijímá jako parametr nejen nějakou konkrétní hodnotu, ale také funkci. K čemu je to dobré a jak se s tím pracuje, se podíváme v příštím dílu seriálu.

Diskuze (0) Nahoru