...příklad pro šestou část...
V předchozím dílu jsme se vydali na nejistou půdu novinek, které jsou
podporovány pouze novější generací klientů. Dnes na ní ještě zůstaneme, ba
dokonce se budeme věnovat konstrukci, která není ani součástí návrhu HTML
verze 3.2. Pochází od návrhářů firmy Netscape Communications. Bylo navrženo
(ale zatím nikoli realizováno) její začlenění do HTML.

Skutečnost, že HTML stránka zabírá celou plochu okna, lze chápat jako jisté
omezení. I začaly se hledat metody, jejichž pomocí by autor stránky mohl okno
rozdělit na několik nezávislých, leč spolupracujících oblastí, případně
navzájem provázat několik oken. Výsledkem těchto snah je mechanismus rámů.
Při jeho použití se stránka dělí na několik částí, z nichž každá čerpá svůj
obsah z jiného souboru. Zdrojový text pro stránku definuje pouze vzájemné
uspořádání jednotlivých částí a soubory s jejich obsahem. Vychází z párové
značky <FRAMESET>. Ta oznamuje, že okno má být rozděleno na
několik částí ve směru svislém či vodorovném. Musíte použít právě jeden z
jejích dvou atributů - ROWS nebo COLS. První zajistí
rozdělení stránky na části, uložené nad sebou ("řádky"). Použijete-li
COLS, budou rámy uloženy vedle sebe.
Hodnota atributu ROWS nebo COLS určuje počet a velikost
jednotlivých rámů. Zadává se jako seznam čísel, udávajících rozměry rámů. Ke
každému číslu můžete připojit znak procento nebo hvězdička. Jejich význam
shrnuje tabulka 1.
Tabulka 1:
Zadávání hodnot pro atribut ROWS (COLS)
30 |
rám vysoký 30 obrazovkových bodů |
30% |
rám zabere 30% z celkové výšky okna |
30* |
ze zbývající výšky dostane tento rám 30 jednotek |
|
Hodnoty N a N% jsou jednoznačné, odpovídá jim určitý pevný
počet obrazovkových bodů. Takto stanovené rozměry klient přiděluje jako první.
Poté rozdělí zbývající místo pro všechny ostatní rámy (zadávané ve formě
N*) v poměru hodnot N. Například
<FRAMESET COLS="25%,75%">
rozdělí stránku na dva rámy, umístěné vedle sebe. První obsadí čtvrtinu šířky
okna, druhý tři čtvrtiny. Značka
<FRAMESET ROWS="50,3*,1*">
vytvoří tři rámy nad sebou. První bude vysoký 50 obrazovkových bodů. Zbývající
výška okna bude rozdělena mezi druhý a třetí rám v poměru 3:1. "Pružné"
jednotky (zadávané číslem s hvězdičkou) hrají velmi důležitou úlohu. Umožňují
přizpůsobit se momentálním rozměrům okna.
Držte se následujícího pravidla: kdykoli se v definici rámů objeví absolutní
počet obrazovkových bodů, měl by být alespoň jeden rám zadán v pružných
jednotkách.

Značka <FRAMESET> určuje počet a rozměry rámů. V jejím těle je
třeba definovat vlastnosti a především obsah jednotlivých rámů. K tomu slouží
<FRAME>. Jedná se o značku nepárovou, která veškeré vlastnosti
rámu stanoví prostřednictvím svých atributů. Tím nejdůležitějším a jediným
povinným je SRC. Jeho hodnotou je URL souboru, tvořícího obsah rámu.
Mělo by se vždy jednat o HTML soubor. V principu sice můžete do rámu vložit
obrázek, výsledný efekt však záleží na konfiguraci klienta. Pokud má
definováno, že pro zobrazování GIF a JPEG grafiky volá externí program, zůstane
dotyčný rám prázdný a kdesi na obrazovce se otevře okno s příslušným obrázkem.
Na soubor, vkládaný do rámu, nejsou kladeny žádné speciální nároky. Jedná se o
naprosto běžnou stránku. Skutečnost, že byla použita jako obsah rámu se projeví
jen v tom, že nebude zobrazena v celém okně, ale pouze v příslušné části.
Skupina dalších atributů ovlivňuje různé vlastnosti. Zajímavý je
SCROLLING, který ovlivňuje posuvník na okraji rámu. Přípustné hodnoty
jsou AUTO (posuvník se objeví, pokud se obsah nevejde celý do rámu),
YES (posuvník vždy zobrazen) a NO (zobrazení posuvníku
zakázáno). Uvedete-li mezi atributy NORESIZE, zakážete klientovi měnit
velikost příslušného rámu. Standardně totiž uživatel může myší upravit rozměry
rámů tak, jak mu to vyhovuje. Mějte na paměti, že NORESIZE zmrazí
všechny hrany obklopující daný rám.
Pomocí MARGINWIDTH a MARGINHEIGHT můžete stanovit velikost
mezery mezi okrajem textu a hranicí rámu. První atribut se týká vodorovného
směru, druhý svislého. Dost důležitou roli hraje atribut NAME,
pojmenovávající daný rám. Pomocí něj lze zařídit, aby rámy navzájem měnily svůj
obsah (o tom za chvíli).
Značky <FRAMESET> a <FRAME> navzájem těsně
spolupracují. Při zahájení <FRAMESET> stanovíte počet a rozměry
rámů. V jejím těle se pak musí objevit odpovídající počet
<FRAME>, definujících jejich obsah a vlastnosti - asi takto
<FRAMESET COLS="50,1*">
<FRAME SRC="menu.html" NORESIZE>
<FRAME SRC="uvod.html" SCROLLING=YES NAME="main">
</FRAMESET>
Aby věc nebyla tak jednoduchá, může se na místě <FRAME> objevit
další <FRAMESET>. Rám tedy může být rozdělen na další rámy.
Tento postup se používá, pokud potřebujete kombinovat vodorovné a svislé
členění stránky. Teoreticky není počet úrovní rámování omezen, stránka však
rychle ztrácí na přehlednosti. V praxi budete těžko hledat situaci, kdy je
rozumné použít více než dvě úrovně. Ukázku takto strukturované stránky najdete
v dnešním příkladu.

Celý mechanismus by ztratil polovinu krásy, kdyby jednotlivé rámy byly zcela
oddělené a navzájem nezávislé. Naštěstí tomu tak není. Autor stránky může
zajistit jejich součinnost. Když pak uživatel zvolí odkaz v některém z rámů,
změní se obsah jiného a nebo dokonce celé stránky.
Základním kamenem této spolupráce je atribut TARGET, kterým může být
opatřena značka <A>. Jeho hodnotou je jméno rámu nebo okna, ve
kterém má být zobrazen dokument, k němuž odkaz vede.
Podívejme se na zoubek dnešnímu příkladu, který tento mechanismus dobře
ilustruje. Stránka je rozdělena do čtyř rámů. Horní pruh obsahuje logo firmy a
dolní hlavní menu. Jejich obsah se nemění, proto není třeba rámy pojmenovávat.
Střední část okna je rozdělena svisle na hlavní textový rám (pojmenovaný
"hlavni") a napravo od něj ležící menu druhé úrovně (rám z názvem "menu").
Zdrojový text hlavního menu obsahuje položky ve tvaru
<A HREF="pocitace.html" TARGET="menu">Počítače</A>
Když si uživatel některou z nich vybere, změní se obsah dílčího menu (rámu
"menu"). Analogicky je v tomto menu řešena změna obsahu informačního rámu
pomocí odkazů ve tvaru <A ... TARGET="hlavni">.
Bohužel nelze jednoduchým způsobem zajistit, aby volba odkazu způsobila změnu
více než jednoho rámu. Potřebujete-li takové chování, musíte sáhnout po
složitějším řešení - například načíst jinou definici rámů pro celé okno
klienta, v níž budou obsahy jednotlivých rámů patřičně změněny.
Předchozí věta ve vás možná vyvolala otázku "Jak ale změnit definici celého
okna?" Odpověď vám poskytne tabulka 2. Najdete v ní předdefinované speciální
hodnoty pro atribut TARGET, které umožňují, aby odkaz ovlivnil třeba i
celé okno.
Tabulka 2: Speciální hodnoty atributu TARGET
_blank |
otevřít vždy nové okno |
_top |
zobrazit v celém okně - kompletně zruší veškeré rámování |
_parent |
zrušit jednu úroveň rámování (nejbližší <FRAMESET>,
obalující dotyčný odkaz) a výsledek zobrazit v příslušném
místě |
_self |
zobrazit v tomto rámu (okně) |
|
Pokud by se v textu, tvořícím obsah hlavního informačního okna, objevil odkaz
<A ... TARGET="_top">, způsobil by likvidaci celé rámové
struktury a zobrazení dokumentu v celém okně klienta. To je vhodné, pokud
přeskakujete na jiný server (je vždy hloupé, když se ve vaší rámové struktuře
objeví obsah z jiného serveru) nebo když chcete zcela změnit strukturu rámů.
Použití odkazu <A ... TARGET="_parent"> by zrušilo rozdělení
prostředního pruhu okna a příslušný dokument by byl zobrazen ve vzniklém rámu.
Naproti tomu v okně s hlavním menu by byl účinek _top i
_parent shodný - v obou případech by došlo ke změně celého okna.

Přiznejme otevřeně, že rámy patří mezi problematické konstrukce. Tu a tam
proběhne v diskusních skupinách zuřivá šavlovačka, zda jsou ku prospěchu věci
či právě naopak. Já osobně jsem toho názoru, že v některých situacích rámy
ulehčují uživateli život a přispívají ke snadnější orientaci na stránkách. Na
druhé straně jsem přesvědčen, že je jich v současné době nadužíváno a v mnoha
případech odvádějí spíše medvědí službu.
Obecně bývají rámy zpravidla používány k trvalému zobrazení jakýchsi nabídek či
orientačních pomůcek. Náš dnešní příklad - katalog produktů - je poměrně dobrou
ukázkou situace, kdy rámy mají rozumnou šanci na dobré využití. Uživatel vidí v
hlavním rámu informace o produktu a zároveň mu nabídky v okolních částech okna
umožňují rychlý přeskok na jiný výrobek. Skutečnost, že tyto nabídky zůstávají
celkem neměnné, usnadňuje čtenáři orientaci. Nutno však dbát na to, aby nabídky
příliš nepřekročily rozsah rámu. Uvidí-li uživatel pouhý zlomek z menu a bude
muset opakovaně posouvat obsah rámu, než se dostane ke kýženému odkazu, bude
naopak efektivně dezorientován. V takovém případě je vhodnější řešit nabídku
konvenční stránkou, na které je mnohem více prostoru (rám s nabídkou musí být
malý, aby zbyl dostatek místa na hlavní informace) pro srozumitelné uspořádání.
Použití rámů skrývá nejedno další úskalí. Především je třeba počítat s tím, že
rámy ukusují prostor okna. Pokud má uživatel obrazovku s rozlišením 640x480
bodů, mohou mít výsledné rámy velmi malou kapacitu a v důsledku toho se stanou
nepřehlednými. Nezapomínejte také na uživatele starších klientů, kteří rámy
nepodporují. Jelikož značka <FRAMESET> nahrazuje
<BODY> a stránka s definicí rámů neobsahuje žádný viditelný
text, zůstane pro ně obrazovka prázdná.
Naštěstí existují zadní kolečka pro tuto situaci - značka
<NOFRAMES>. Měla by vždy doprovázet <FRAMESET>.
Jejím tělem je text, tvořící obsah stránky pro rámů neznalé klienty. Ti nemají
v repertoáru žádnou z výše zmiňovaných značek a budou je tudíž ignorovat. Ke
zpracování jim zbyde jen text, který nalezli uvnitř <NOFRAMES>.
Naproti tomu klient podporující rámy značku <NOFRAMES> i s celým
jejím tělem ignoruje. Zpravidla je vhodné, aby se text uvnitř
<NOFRAMES> zhruba shodoval s obsahem rámu, nabízejícího hlavní
menu.
|