HTML v příkladech

6

Rámy

 
Obsah

Rejstřík

Hledat

Dopis autorovi

...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.

Struktura rámů

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.

Obsah rámů

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.

Vzájemná spolupráce

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.

Rámovat či nerámovat

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.


Pavel Satrapa
Článek byl otištěn v časopise
Softwarové noviny číslo 1/97
 
<--- --->