ipsace i tiskace

roj.bloguje.czesky!

25.06.2007

Chyba gecka - overflow:hidden

Rubrika tiskace
Známka 0 (0)
Milé webdesignérky, dnes to bude jen a jen pro vás. A uvítám vaši pomoc.

Příklad je v poctatě triviální, ale nevím, jestli jsem jen objevil chybu gecka nebo je to nějaká CSS zapeklitost.

Věc se má tak. Jak všechny víte, jsem ortodoxní zastánce flexi šířky blogu. Při této příležitosti jsem na vlastní oči zjistil, že jsou i zoufalci, kteří můj bložínexledují v okně šířky 1600px!! A tak ve mě uzrálo rozhodnutí, že těmto úchylákům vyhovím a začal jsem pracovat na novém stylu. Pokud jste dočetly až sem, mám pro vás bonus. Nový styl se bude jmenovat kuličky.

A při experimentech jsem objevil dále zmíněný jev. Vezměme si modelový příklad. Máme stránku s boxíky ve stylu "fotogalerie". Každý boxík má pevně stanovené rozměry. Pokud uživatelka zadá text do boxíku delší, než by se vešel, musíme nadbytečnou část textu oříznout. K tomu běžně slouží CSS vlastnost overflow: hidden

Všechny neobarvené divy jsou pro názornost opatřeny rámečkem (border). Ostatně trik s borderem používám vždy, když vytvářím jakýkoliv lejout. Na začátek stylopisu dám pravidlo

div {border: 1px solid #888}

v určité fási ho pak zruším.

Vnější div (široký světlešedý rámeček) to celé obaluje a pevně určuje prostor celku. Dále následuje (šedý) div, který bude později obtékán, div s hlavním textem (červený rámeček) a patička (žlutý rámeček ), která by měla být v každém případě viditelná.

Příklad bez lejoutu a posicování

Žádný float, pouze rozměry obalového divu. Výška má být 11em.

Malý boxík (foto) bude obtékán.
Toto je hlavní text, který bude obtékat ten menší boxík vpravo. Text musí být dostatečně dlouhý, aby se efekt projevil. Ovšem kdyby tento text byl dlouhý příliš, mohlo by se stát, že se do svého vymezeného místa nevejde.

Potom je třeba jej oříznout. K tomuto případu dochází, pokud máme lejout dán předem, a uživatelky do něj vkládají obsah průběžně. Typickým příkladem je fotogalerie s delšími popisky, popřípadě galerie krátkých zpráviček.

Tento poslední octavec již neobsahuje žádnou informaci, proto bude nejlepší jej oříznout.

Toto je patička, která by neměla být překryta.

Vidíme, že žádná informace nezůstala skryta, ale požadovaná výška 11em nebyla dodržena. Octavec, který právě čtete, by začínal hned pod vodorovným oddělovačem a oba texty by tak šly "přes sebe", což by způsobovalo nečitelnot jak pokusného textu, tak tohoto vysvětlujícího octavce. Proto jsem zde v textu blogu musel udělat horní margin 10em.

Příklad s danými rozměry

Aby se nám patička neschovala, musíme omezit výšku hlavního textu. Patička zabere výšku asi 1.7em, proto zvolíme výšku vnitřního textu 9.5em. A obrázek necháme obtékat, což bude vidět na živé ukázce.

Malý boxík (foto) bude obtékán.
Toto je hlavní text, který bude obtékat ten menší boxík vpravo. Text musí být dostatečně dlouhý, aby se efekt projevil. Ovšem kdyby tento text byl dlouhý příliš, mohlo by se stát, že se do svého vymezeného místa nevejde.

Potom je třeba jej oříznout. K tomuto případu dochází, pokud máme lejout dán předem, a uživatelky do něj vkládají obsah průběžně. Typickým příkladem je fotogalerie s delšími popisky, popřípadě galerie krátkých zpráviček.

Tento poslední octavec již neobsahuje žádnou informaci, proto bude nejlepší jej oříznout.

Toto je patička, která by neměla být překryta.

Text sice správně obtéká, ale překrývá patičku a vytéká z přiděleného místa.

Přidáme vlastnost overflow:hidden

Úplně stejný příklad, ale div s hlavním textem (červeně orámovaný) má navíc jedinou vlastnost overflow:hidden.

Malý boxík (foto) bude obtékán.
Toto je hlavní text, který bude obtékat ten menší boxík vpravo. Text musí být dostatečně dlouhý, aby se efekt projevil. Ovšem kdyby tento text byl dlouhý příliš, mohlo by se stát, že se do svého vymezeného místa nevejde.

Potom je třeba jej oříznout. K tomuto případu dochází, pokud máme lejout dán předem, a uživatelky do něj vkládají obsah průběžně. Typickým příkladem je fotogalerie s delšími popisky, popřípadě galerie krátkých zpráviček.

Tento poslední octavec již neobsahuje žádnou informaci, proto bude nejlepší jej oříznout.

Toto je patička, která by neměla být překryta.

Dosáhli jsme toho, že text sice nikam nepřetéká, patička je viditelná, ale zpotvořilo se obtékání! Pravý okraj textu se natvrdo nastavil vedle obrázku a pod ním teď zeje prázdné místo. Červený rámeček je nyní vlevo od tohoto místa.

Alespoň v gecku (seamonkey 1.1) tam to prázdné místo je. Co u vás v jiných prohlížečích?

Řešení

Zkoušel jsem všechno možné, ale pomocí pouze zásahů do CSS se mi problém vyřešit nepovedlo. Pomohlo až přestrukturovaní dokumentu. Změna spočívá v tom, že div s hlavním textem nebude ležet za obtékaným obrázkem, ale pohltí ho, tedy plovoucí obrázek bude uvnitř (nikoliv před) tím červeně orámovaným blokem.

Jednoduché a účinné, ovšem jen potud, pokud si můžete dovolit přestrukturovat HTML. Což já v konkrétním příkladě nemohu. Ale aspoň se se mnou pokochejte fukčním příkladem.

Malý boxík (foto) bude obtékán.
Toto je hlavní text, který bude obtékat ten menší boxík vpravo. Text musí být dostatečně dlouhý, aby se efekt projevil. Ovšem kdyby tento text byl dlouhý příliš, mohlo by se stát, že se do svého vymezeného místa nevejde.

Potom je třeba jej oříznout. K tomuto případu dochází, pokud máme lejout dán předem, a uživatelky do něj vkládají obsah průběžně. Typickým příkladem je fotogalerie s delšími popisky, popřípadě galerie krátkých zpráviček.

Tento poslední octavec již neobsahuje žádnou informaci, proto bude nejlepší jej oříznout.

Toto je patička, která by neměla být překryta.

ZdRojovy kódy každého příkladu si můžete prohlédnout, když si ho označíte do bloku a kliknete na něm pravým myšítkem. V objevivším se kontektovém menu vyberete Zobrazit zdrojový kód výběru a je to. Enjoy!

roj, 25.06.2007, 0:08:00, trvalý odkaz,

Komentáře (15)

Varování:
Budu zde nechávat jen komentáře, které se mi líbí. Demokracie je sen. Nechte si o ní zdát :-)
1 zirafka WWW 25.06.2007, 03:13:48
Dela to to stejne i Opere, Firefoxu a Konqueroru. Takze to nebude bug, ale mozna to bude mit neco spolecneho s principem obtekani plovoucich bloku. Kazdopadne zajimave.
2 dgx WWW 25.06.2007, 07:59:37
Nastavení overflow na cokoliv kromě visible vytvoří nový formátovací blok - to je ten červený rámeček. Každý blok má svůj vlastní tok dokumentu, takže text uvnitř obtéká jen plovoucí bloky, co jsou také uvnitř. Takže jediná možnost je buď upravit HTML, nebo ponechat overflow na výchozí hodnotě.
3 frettie 25.06.2007, 09:29:45
Jo, "bložínexledují", je hezký slovo. :)

Co zkusit nejaky kouzla s z-position?
4 Roj WWW 25.06.2007, 10:45:29
[1] Spatna zprava, nakonec bude nejlepsi IE :-)
[2] To jen jinymi slovy popisujes efekt, nebo citujes specifikaci, nebo mas nejake logicke vysvetleni tohoto jevu? Me skutecne nenapada duvod, proc by overflow melo preformatovat blok.
[3] Nejedna se o absolutni posicovani, takze "Z" na to nema vliv.
5 dgx WWW 25.06.2007, 13:57:54
[2] tak praví přímo specifikace. Teď zrovna nestíhám, abych to dohledal, ale nejspíš to najdeš přímo o vlastnosti "overflow" nebo u popisu "normal flow" nebo tak něco ;)
6 pixy 25.06.2007, 17:49:20
Gecko i Safari stejně. A nejspíš správně:

> The margin box of an element in the normal flow that establishes a new block formatting context (such as a table, or element with ’overflow’ other than ’visible’) must not overlap any floats in the same block formatting context as the element itself. If necessary, implementations should clear the said element by placing it below any preceding floats, but may place it adjacent to such floats if there is sufficient space. [CSS 2.1, Visual formatting model]
7 Lot 25.06.2007, 18:00:41
[4] z-index se nedá použít u relativního pozicování? Co mě napadlo - zkusil jsem hlavnímu boxu nestavit overflow:hidden, patičce jsem dal relativní pozici a z-index.
Ve Firefoxu, Konqueroru a Opeře to vypadá dle tvé přestavy. Teď se mi nechce přecházet do windows kde mám funkční IE, takže jak to vypadá v něm neověřeno...
8 Lot 25.06.2007, 18:02:39
[7] Ještě doplním - patičce jsem musel nastavit pozadí, jinaky by skrz ni byl vidět hlavní text.
9 Lot 25.06.2007, 18:23:50
Beru z5. V IE6 (a starších) to samozřejmě fungovat nebude... Šlo by to napravit tím, že by se relativně pozicoval hlavní blok a patička by se pozicovala absolutně... ale to už by na můj vkus bylo poněkud přepozicováno...
10 Roj WWW 25.06.2007, 22:46:58
[6] Hmm, tak to je neprustrelny. Diky vsem!
[7] Samozrejme se to da vyresit i v puvodnim prikladu definovanim pozadi u paticky. Ale kdyz ja chci, aby to pozadi bylo videt zkrz paticku. Je tam obrazek. A nejde to rozseknout a navazat, pac jednotky vseho jsou "em".
11 uživatelka 26.06.2007, 23:18:20
Tak to už jsem taky řešila. Mam jinou hádanku: jak zařídit, aby se tyto objekty s nastaveným float:left pěkně rovnaly do maximálního volného prostoru strany? Ovšem celá stránka by neměla být uzavřená v divu ani tabulce, aby se nemuselo v Exploderu čekat až se načte všechno. Strana ještě bude mít pravý sloupec, taknějak jako na Rojově bložínku. A ještě podmínka. Ten pravý sloupec by se měl načíst jako poslední, protože nejvíc zdržuje. Nějak mi uniká, jak bych to měla napozicovat, protože pokud dám pravému sloupci z-position, tak se budou objekty štosovat pod ním, nebo nad ním.
Jsem z toho celá zpocená!
12 Roj WWW 26.06.2007, 23:26:22
[11] Premejslim, k jakymu uniku informaci mohlo dojit a dochazim k zaveru, ze je to nemozne. Vis, co, pockej si na avizovane "kulicky" asi k nim napisu vysvětlivky :-)
13 uživatelka 27.06.2007, 01:56:07
Roji, je to spíš prosté. Prostě plánuješ to, co už někdo dávno má na svém bložínku :)
Já si tedy pičkám na ty tvoje kouličky.
14 uživatelka 27.06.2007, 02:06:30
Taky bys mohl ten svůj styl pojmout jako pičítadélko.
Mimochodem, abys věděl, o čem jem mluvila ;)
http://spotter.bloguje.cz/img/spotter.tv.gif
15 Roj WWW 27.06.2007, 02:23:51
[14] je to slozitejsi, ale media je bohuzel zaheslovane. Autorka se tomu asi moc nevenuje, kdyz ji uniklo, ze den zaheslovanych blogu davno skoncil :-)

Přidání komentáře...

zde vpište
bloguje.cz
Získejte Seamonkey!
Valid XHTML 1.0 Strict