Tantek Celik IE box model hack lépe

Asi každý zná, a bohužel i používá, IE voice-family hack pro jeho chybný box model, který původně navrhl Tantek Celik. Nicméně, problém tohoto hacku je v jeho nevaliditě, nepřehlednosti, a rozsahu nutného psaní CSS kódu.

Původní Tantek Celik hack je následující:

.content { 
width:400px; /* pro Mozillu, Opera 6.x, 7.x */
border:20px solid;
padding:30px;
voice-family: ""}""; 
voice-family:inherit;
width:300px; } /* pro IE  */
html>body .content { width:300px;} /* pro Operu 5.x, se stejnou chybou jako IE */

Toto řešení ovšem zjevně není moc elegantní.

Jiné řešení je pochopitelně "matrjoška", tedy obalit daný "content" do dalšího boxu. To sice je pro změnu v CSS validní, ale zase to má nevýhodu ve zbytečných DIVech v XHTML kódu navíc.

Příklad:

.matrjoska{ width:400px; }
.content { 
border:20px solid;
padding:30px;}  

A v XHTML kódu:

<div class='matrjoska'>
  <div class='content'>
  </div>
</div>

Je to sice elegantnější řešení, ale… zase markup v CSS i XHTML navíc.

Nejlepší řešení je zřejmě následující, které je validní, a vyžaduje jen minimální CSS markup a žádný v XHTML! Toto řešení využívá jiné chyby ve všech verzích IE (kterou jiné browsery nemají), a to sice v selektoru * html, popřípadě * html body (tomu by neměl odpovídat žádný prvek, protože html element je úplně první, nic nemůže být před ním, nicméně IE selektor * ignoruje a chápe to jako html, popřípadě html body).

Jak toto využít? Takto:

 .content { width:400px;
  border:20px solid;
  padding: 30px;} 
* html body .content {width:300px} /* toto vezme pouze IE! */

Je to skutečně mimořádně elegantní řešení, vyžaduje minimální markup v CSS a žádné změny v XHTML!

Komentáře 16

  1. #1 jm

    A co hack typu: _width: 400px /* toto IE nevezme */

  2. #2 Petr Weida

    Znám a používám, psal jsem o tom tady:

    http://www.zpravy.net/weblo...

  3. #3 Radek Hulán autor webu ▲10 ▼0

    [1] rozhodně není doporučeno v CSS používat podtržítka, preferuji tu posledně uvedenou variantu s *html body

  4. #4 jm

    Proč to není doporučeno? Specifikace CSS to prý nezakazuje (sám jsem jí nestudoval).[3]

  5. #5 Radek Hulán autor webu ▲10 ▼0

    [4] protože IE5+ sice ignoruje hodnoty s _abcd, ale to se může změnit.. předchozí řešení, když je Microsoft někdy opraví, nebude mít žádné následky, nebudou nutné úpravy CSS souborů..

  6. #6 Pavel Kout

    IE6 má dva různé renderovací módy - chová se tento hack v obou z nich korektně?

  7. #7 jm

    Dobrá, ale tyto hacky používáme ke kompenzaci chybných "box-modelů" u IE5 a IE5.5, kde metoda _abcd funguje. Novější IE už počítá šířky správně, a tak nám může být celkem jedno, jestli vlastnost s podtržítkem rozpozná.

  8. #8 Radek Hulán autor webu ▲10 ▼0

    [6] zkoušel jsem jen XHTML 1.0 STRICT, a tam se tento hack chová tak, jak potřebuji

    více info: http://www.info.com.ph/~eta...

  9. #9 pepi

    💡 Nejlepším řešením je matrjoška - neodporuje sttandardům a nevyužívá žádných chyb v prohlížečích!

  10. #10 Radek Hulán autor webu ▲10 ▼0

    [9] není tomu tak, matrjošku nelze použít vždy, navíc, tímto prezentovaných * html body trikem, validním, i v budoucnu fnukčním, můžete dělat i jiné věci než jen width:...

  11. #11 jm

    Problém matrjošky spočívá v dalším zbytečném divu v (X)HTML dokumentu, čímž zvětšujeme datový objem dokumentu a zdrojový kód se stává méně přehledným.

  12. #12 dgx

    "Hackovat" CSS pridavanim zbytecneho kodu do HTML? To je mi pripada jako ta nejhorsi varianta - toliko k Matrojsce. Ano, neni to spatna vec, ale pouzivam na zcela jine veci.

    Na box model se mi osvedcilo nasledujici reseni:

    div {

    padding: 10px;

    width: 100px;

    width: 80px;

    }

    je to zcela cisty, validni kod. Moderni browsery (Opera, Mozilla, IE 6 v CSSCompat rezimu), ktere pouzivaji standardni box-mod, zaroven akceptuji width, starsi IE si width neberou. Funguje to naprosto bezvadne, je to jednoduche, ne?

    (pro IE6 je treba CSSCompat rezimu, ale to by melo byt samozrejmosti).

    Jinak pouziti _width je zcela v souladu se standardem CSS. Validator na to ale upozornuje. To je ovsem jeho problem.

  13. #13 jm

    [12] width není špatné. Pokud je to v souladu se specifikací a validator na to navíc neupozorňuje, tak se zdá, že se jedná zatím o nejlepší a nejjednodušší řešení. Díky za tip. Jedná se o Váš vlastní vynález nebo je to již všeobecně známé?

  14. #14 Petr Weida

    [13] Viz třeba u Pixyho:

    http://www.pixy.cz/blog-blo...

    je pěkné řešení:

    width: 80px; /*nie-IE browsers*/

    _width: 100px; /*IE 5.x*/

    _width: 80px; /*IE 6*/

  15. #15 hurvajs

    [12] zbytečný html kód... hm to je fakt, ale co ten zbytečný CSS?

    [10] Kdy nejde použít?

  16. #16 dgx

    [13] pokud dnes nazvete nejaky postup vlastnim vynalezem, musim zvolat ono zname "TED TU BYL...." Takze ano, jde o vlastni vynalez, ktery uz napadl jiste celou radu kouzelniku predemnou, aniz bych to tusil 🙂

    Viz napriklad veleslavne Pixyho rollovery bez preloadu z roku 2003, a zcela totozne reseni z roku 1998 http://www.webreference.com...

    [14] Ano, jde temer o totez s tim rozdilem, ze ma o radek vic a je nevalidni 🙂