Cand lucrezi cu DIV-uri (cum fac eu de ceva vreme), daca vrei sa obtii un layout care sa se lungeasca in jos atat cat il forteaza continutul, esti obligat sa lucrezi cu FLOAT-s. Adica cu DIV-uri pozitionate RELATIVE si care au setat float:left sau float:right.
Problema
Problema este ca modelul de redare vizuala al FLOAT-ului este unul arhaic, de pre vremea cand un float se limita la proprietatea align:left / align:right pentru < IMG >-uri, care permitea textului sa curga pe langa o imagine (sa faca “text-wrap”). In perioada aceea, notiunea de float se limita la < IMG > si < P >. Ce rezulta din modelul gandit atunci? Ceva cam ca in urmatoarea imagine:

Daca te uiti atent, vezi ca imaginea inclusa in primul < P > (figurata cu magenta in desen) are align = ” left ” (echivalentul functional al lui float: left; in CSS), ceea ce face ca < P > -urile (inclusiv cele ulterioare) sa curga fluent pe langa ea. Foarte bine si frumos.
Dar ce te faci cand vrei ca imaginea/floatul respectiv sa “forteze” inaltimea holderului in care se afla? Ce te faci daca vrei ca < P > -ul care contine imaginea sa se intinda in jos in asa fel incat sa includa complet imaginea? Asta la un tabel era usor, dar la un DIV nu mai e la fel de usor.
De ce? Poi, am zis mai devreme: pentru ca, atunci cand au conceput si creat specificatia pentru modelul de FLOAT, dragii de baieti de la W3C asa au considerat ca e mai natural si firesc comportamentul de mai sus. Ce rezulta pentru coder? Durere de cap, pentru ca nu numai ca e o problema destul de serioasa, dar trebuie rezolvata si cross-browser…
Solutia?
In urma testarii a tot felul de nebunii, s-au observat diverse solutii pentru diverse browsere.
De pilda, in IE era suficient sa setezi un height al DIV-ului, ca s-o rezolvi. Si, ca sa nu afectezi layoutul, cel mai bine era sa setezi height-ul respectiv la 1% – ca oricum IE isi intindea DIV-urile cat ii trebuia, trecand peste acel height ca prin branza.
Dar asta nu mergea in FF – ba, mai mult, nu avea nici un efect. In schimb in FF era swuficient sa itroduci de mana, la sfarsitul DIV-ului cu pricina, un element care sa aiba proprietatea CSS clear:both. Asta forta DIV-ul sa se intinda dincolo de acel element bagat cu forta, pentru ca clear-both nu permite nici unui alt element sa se gaseasca pe linie cu el, si deci forta DIV-ul sa se intinda dedesupt. Ca sa intelegi mai bine, am mai prestat un desen:

(borderul acela albastru din jurul acelui punct semnifica efectul lui clear-both;)
Dar cum e destul de ne-elegant sa te apuci sa inserezi cod de mana in HTML doar ca sa rezolvi o problema, atunci s-a gasit o alta solutie: sa se profite de o proprietate CSS specifica FF-ului, si anume content: “”;. Ce face asta? poi iti permite sa bagi in HTML cod din CSS. Evident, merge doar in FF, dar e foarte utila.
Cum putem aplica cele 2 solutii de pana acum, aici?
FF:
.clearfix:after {content: "."; display: block; height: 0;
clear: both; visibility: hidden;}
IE:
* html .clearfix {height: 1%;}
Dupa care, in HTML, ii adaugam DIV-ului pe care vrem sa-l extindem clasa clearfix. Si asa ajungem la vestita solutie “CLEARFIX”, care a scos multi html-isti din cacao pana acum:
.clearfix:after {content: "."; display: block; height: 0;
clear: both; visibility: hidden;}
/* Hides from IE-mac */
* html .clearfix {height: 1%;}
/* End hide from IE-mac */
Dar ce te faci ca a aparut IE7 pe piata… Care IE7 nu se mai intelege bine cu CLEARFIX… Ce te faci? Iei toate site-urile facute pana acum la mana si le re-codezi doar pentru ca au inceput sa apara clienti care “nu vad bine sinte-ul pe IE7”???? MULTA carne si-a mai luat in gura, in frigider, in congelator si in familie nenea gates cu porcaria asta de ultima versiune… Asta dupa ce-au mai avut si tupeul sa anunte ca e versiunea finala, ca dupa asta – gataa! – nu vor mai implementa nimic nou in materie de suport CSS.
Noroc ca s-au gasit (IAR) testeri de bine care au calarit problema pe toate fetele, si-au descoperit solutia: modifici DOAR CSS-ul, si de-acolo DOAR sectiunea de CLEARFIX, dupa cum urmeaza:
.clearfix:after {content:"."; display:block; height:0;
clear:both; visibility:hidden; }
.clearfix {display:inline-block;}
/* Hide from IE Mac */
.clearfix {display:block;}
/* End hide from IE Mac */
Odata re-definita doar bucatica asta de cod CSS, totul revine la normal si functioneaza OK in IE, IE7 si FF. Bravo, baieti! M-ati salvat de MULTE transpiratii inutile.
Salut
Wow ce veste:))Cand ne vedem 🙂
LOL care e vestea, Alexu’?
sa se profite de o proprietate CSS specifica FF-ului, si anume content: “â€;
Content nu este o proprietate specifica FF-ului… este in CSS Level 2 si, probabil, doar FF-ul a implementat aceasta proprietate.
[http://www.w3.org/TR/CSS2/generate.html#content]
.clearfix {display:inline-block;}
inline-block apare de abia in CSS Level 2 Revision 1 … care este inca Working Draft…
[CSS L2 – http://www.w3.org/TR/CSS2/visuren.html#display-prop%5D
[CSS L2r1 – http://www.w3.org/TR/CSS21/visuren.html#display-prop%5D
Din cate am observat se ‘jongleaza’ si cu felul in care browserele interpreteaza CSS-ul… probabil ca un browser incearca sa inteleaga ce ai vrut sa zici cu o proprietate sau o valoare a unei propietati… pe cand altul ignora complet declaratiile neconforme !!!
Mult spor !
Salve, Radical,
Da, ai dreptate, nu e vorba de ceva specific FF sau, mai mult, inventat de FF… In context vroiam sa spun ca e o proprietate care functioneaza in FF, dar nu si in IE.
dar cand ai 2 div-uri (a si b), pe acelasi nivel, intr-un alt div (c), cum reusesti sa-l convingi? clear arunca jos al doilea div (b).
ps: clearfix-ul se aplica in general HOLDERULUI, nu celulelor DIN EL. Cam asta si era ideea articolului – ai cetit bine?
Sau, daca n-am inteles eu bine, incearca sa reformulezi intrebarea, un pic mai detaliat, si vedem ce-i facem 🙂