table border de fix 1px;

Daca ai incercat vreodata sa obtii un table cu border de 1px, primul lucru pe care l-ai facut a fost sa scrii asta: < table border = ” 1 ” bordercolor = ” #000000 ” > etc. Dar daca incerci sa vezi asta intr-un browser, borderul e de fapt intotdeauna de 2px. DE CE? Pentru ca, atunci cand definesti borderul de 1px, el este mostenit automat si de td-uri, si din alaturarea celor 2 pixeli adiacenti (1 de la table si 1 de la td) rezulta borderul ala deranjant de 2px grosime. Ca sa intelegi mai bine ce se intampla, poti folosi la definirea table-ului si proprietatea cellspacing=”5″ – abia atunci o sa vezi cum, de fapt, borderul este de 1px… Cele 2 situatii arata cam asa:

tutorial-7.gif

Ce e de facut, daca vrei totusi sa obtii un border fin, de fix 1px? Folosesti un mic truc:

< table cellspacing = ” 1 ” bgcolor = ” #000000 ” > … urmand ca apoi, din CSS, sa faci in asa fel incat celulele tabelului sa AIBA un background-color. In felul asta, ne-avand un border la tabel, dar avand un cell-spacing de 1px, acel spacing (spatiul dintre celule) va fi exact ceea ce se va vedea in spatele celulelor tabelului, printre ele: adica background-ul tabelului. Care va arata exact ca un border, doar ca de data asta va fi de fix cat ii zicem noi: de 1px.

worst album covers

Tocmai am dat un ochi pe http://www.coverbrowser.com/covers/worst-album-covers
Pentru unii, nu s-ar putea inventa un manual de bun-gust mai eficient decat un site ca asta…

Gates & Windows

Tocmai am realizat o legatura haioasa spre hilara… Cea din titlu…
Hai sa gasim cuvintele-cheie care ar putea fi adaugate la cele 3! Incep eu cu o mica lista:

Doors – (formatia? mai shtim un produs facut parca on crack…)
Knobs (rimeaza cu snobs)
Hinges (in cazul asta, ar cam avea nevoie de…)
Grease (nu filmul, ci vaselina… ca tare greu le mai merg balamalele)
Glasses (de vin, poate, in cinstea comunitatii open-source)
Nails (prea multe asocieri imi vin in minte ca sa ma opresc doar la una aici :D)
Screws (idem…)

Mai bagati si voi, si-o sa completez post-ul pe parcurs 🙂 Nu trebuie sa fie musai logice, ci doar haioase 🙂

Don’t ask, employ!

Cunosc pe cineva care nu viseaza sa faca bani multi, nu viseaza sa aiba 1000 de angajati, viseaza sa aiba un mic studio de creatie, mic dar puternic, nu atat la gym cat ca echipa entuziasta, plina de miez si dornica de actiune. Pe undeva si eu visez cam la fel… Si cum in discutiile noastre pe tema asta de multe ori a venit vorba de motivare, de ce putem face pentru a ajunge “acolo”, intrebarea mi s-a intiparit si mie in minte… Pana acum am gasit un singur raspuns care sa ma satisfaca, cat de cat, aici.

O sa citez esenta, si te las pe tine sa citesti restul:

People ask me, “How can I get our employees to be passionate about the company?” Wrong question. Passion for our employer, manager, current job? Irrelevant. Passion for our profession and the kind of work we do? Crucial. If I own company FOO, I don’t need employees with a passion for FOO. I want those with a passion for the work they’re doing. The company should behave just like a good user interface — support people in doing what they’re trying to do, and stay the hell out of their way.

CLEARFIX – problema si solutia pentru FF si IE (inclusiv IE7)

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:

tutorial-5.gif

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:
tutorial-6.gif

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

BLOGSESSIVE

Ce ignora multa trupa care-si umple gura cu buzz-words ca sa para ca shtie engleza, e ca una din principalele TREBURI MARI pe care le-a adus web2.0 este PERSONALIZAREA. Trecerea dincolo de “Welcome to my home page – About me – My photos – Contact”. Aparitia INDIVIDULUI, ca opus NORMEI. Aparitia VOCII, ca opusa CORULUI.

Ce e paradoxal la fenomenul blogging-ului este ca, devenind atat de popular ca forma de exprimare, a devenit in acelasi timp un fenomen GREGAR-DE-TURMA-LA-GRAMADA (na, uite-un dublu pleonasm, monsherule!). Pana si eu am subscris la el, doar ca sa nu raman in urma. Ca intre timp i-am gasit si-o utilitate, e shpaga mea.

Si mai paradoxal e ca, desi initial era adresat individului, persoanei, BLOG-ul a fost “furat” de firme mici si mari, ca instrument de marketing, preferabil cat mai viral. Ca sursa de vizitatori. Ia orice nume mare din bloggingul romanesc sau de-aiurea, s-o sa vezi ca are in spate o firma, o afacere, un CEVA DE VANDUT.

N-o sa fiu ipocrit, recunosc ca si eu sper sa-mi foloseasca SI la asta. Dar, spre deosebire de unele cazuri deja hilar-triste, inca nu m-am luat in gura cu restul trupei pe teme de genul “ba eu am mai multi unici” etc. Inca nu m-am subjugat ideei. Inca nu sunt un BLOGSESSIVE. Vorba soacra-mei “daca ma vedeti c-ajung asa, sa-mi dati Shoricioaica, mama…” [btw de “shoricioaica” – o fi inscrisa la OSIM? ]

Ce-mi place totusi la treaba cu blogosfera (de ce nu blogocubul?!?) este potentialul de networking pe care-l aduce cu ea. Posibilitatile de a cunoaste trupa noua. Or eu la capitolul “networking” cam tot sufar in ultima vreme, de cand nu mai vad decat un ecran de laptop in fatza ocelilor, toata ziua. Mi-e dor sa mai vad lume. Chiar si lume noua. Taaare-s curios dac-oi putea sa fructific ceva din treaba asta… Ar fi frumos.

… vad ca ma cam ia BLOGOREEA pe dinainte, o fi de la ora cretina la care scriu. mai bine ma opresc aici.

Daca simti c-am aberat, da-mi peste bot, dar fa-o inteligent. Daca-mi dai dreptate, ma bucur. Mai pofteste…

MaiDanezule!

Acum cativa ani, cand sor-mea s-a intors impreuna cu omul ei din Danemarca, dintr-o vizita la niste prieteni, le-am facut un surpraiz party ca la carte, iar cuvantul de ordine al zilei a fost “bine te-ai intors, maidanezule”. Glume de autobaza, deh 🙂

Acum cateva minute, dand un ochi pe catastif, am gasit o harta veche a nord-vestului Europei, si, curios, am descarcat-o ca s-o vad completa. Si nu stiu cum, cu coada ochiului, din tot hatzishul ala de nonsensuri am “prins” pe harta aia un cuvant complet out-of-place: DACIA. Unde? Fix in Danemarca! Deci o parte din Danezi sunt Daci? Aia sigur trebuie sa fie maidanezi 🙂 .

Uite si imaginea cu pricina, cu zona respectiva patriotic evidentiata 😀

dacia.jpg

Guitar Drifting

Incredibil ce frumos si original calareste baiatul asta chitara… Pentru cine a tinut vreodata o chitara in mana, tipul e ori geniu ori eretic.

TABLE din DIV-uri

Exista unele situatii cand ai nevoie de o structura tabelara, dar esti obligat s-o faci din DIV-uri (a lucra pentru un tip ca mine poate impune uneori si situatii de-astea aparent absurde 😀 ). Ce faci atunci?

Poi… DACA FOLOSESTI FF, atunci poti sa reproduci structura tabelului, doar ca in loc de

< table >
  < tr >
    < td >
    < / td >
    < td >
    < / td >
  < / tr>
  < tr>
    < td >
    < / td >
    < td >
    < / td >
  < / tr>
< table >

o sa scrii ceva de genul

< div class = " table " >
  < div class = " tr " >
    < div class = " td " > < / div >
    < div class = " td " > < / div >
  < / div >
  < div class = " tr " >
    < div class = " td " > < / div >
    < div class = " td " > < / div >
  < / div >
< / div >

…iar mai departe o sa te asiguri ca definitiile celor trei noi clase vor contine urmatoarele proprietati:

.table { display: table; }
.tr { display: table-row; }
.td { display: table-cell; }
De ce? Pentru ca, setand proprietatile astea, latimile coloanelor se vor transmite in sus/jos exact ca intr-un tabel normal.
Dezavantaje:
1. treaba asta nu permite merging-ul (lipirea) de celule… cu alte cuvinte, colspan si rowspan ies din joc la abordarea asta.
2. codul html in mod cert rezulta mai lung
3. alinierea pe verticala este specifica doar celulelor de tabel real, cu abordarea asta deci o sa ai ca default numai valign=top;
4. proprietatile CSS din exemplul asta NU sunt suportate de IEx… nici nu stiu daca asta e un dezavantaj sau un avantaj 😀
Avantaje:
1. un mai bun control asupra celorlalte aspecte de design, prin CSS (nu mai e nevoie sa setezi float-left-uri ca la balamuc pentru div-urile astea, si nu-ti vor mai “sari” din rand din cauza continutului)
2. folosind abordarea cu DIV-uri poti implementa apoi lejer tot felul de minunatii drag&drop din familia AJAX.
O lista completa a proprietatilor CSS din familia TABLE-lor gasesti aici:

TABLE    { display: table }
TR       { display: table-row }
THEAD    { display: table-header-group }
TBODY    { display: table-row-group }
TFOOT    { display: table-footer-group }
COL      { display: table-column }
COLGROUP { display: table-column-group }
TD, TH   { display: table-cell }
CAPTION  { display: table-caption }

Pentru o documentare completa, mergi aici.

DIV centrat in pagina – fara tabele

Pe vremea tabelelor era relativ usor sa obtii un layout centrat relativ in pagina: faceai un tabel cu un rand si o celula, setai celula respectiva sa fie aliniata centrat si pe orizontala si pe verticala, si in ea mai bagai un al doilea tabel in care faceai apoi varza cu carne. Usor si frumos. Dar treaba asta niciodata nu mergea in NS, pentru simplul motiv ca NS accepta 100% ca inaltime doar pentru primul nivel de tabelare. De la al doi-lea nivel de tabelare in jos NS o ia razna cu totul in ceea ce priveste inaltimea tabelelor. Ma rog, asta se intampla pe vremea cand maai existau oameni care sa foloseasca NS, si cand se facea caz pe seama lor. Not anymore.

Dar problema ramane. De ce? Pentru ca alinierea pe verticala este o proprietate specifica NUMAI anumitor elemente HTML. DIV-ul NU e unul din ele. Ce te faci atunci?

Pai… depinde. Ai nu una ci doua solutii, in functie daca vrei ca div-ul tau sa aiba inaltime fixa sau relativa la inaltimea paginii. Indiferent cum vine cazul, principiul de baza e ca div-ul cu pricina trebuie sa-l bagi intr-un context clar definit ca position, indiferent ca e relative sau absolute. Sa le luam pe rand…


1. DIV centrat vertical in pagina, cu inaltime relativa la inaltimea paginii.

cam simplu 🙂 Se seteaza div-ul din css, cu urmatorii parametri:

position: absolute; height: x%; top: ((100-x)/2)%;

tutorial-3.gif

Bine, ce am scris eu aici e un EXEMPLU, fratilor. NU incerca asa ceva acasa, ca n-o sa mearga. Ca sa vezi cam cum ar arata ceva de genul asta in rea-l live, uite un exemplu mai exemplificator:

position: absolute; height: 40%; top: 30%;

Daca ai nelamuriri, baga un comentariu si le lamurim.


2. DIV centrat vertical in pagina, cu inaltime fixa.

Asta poate sa para mai tricky… dar e rezolvabil. Inainte de toate, cream un DIV “dummy”, pe care-l definim in modul urmator:

.dummy {position: absolute; top: 50%;}

Div-ul asta, in mod clar, va sta (va avea originea) exact la mijlocul verticalei paginii. Pasul doi este sa cream in interiorul lui dummy DIV-ul care ne intereseaza pe noi, si care sa zicem ca vrem sa aiba inaltimea X. Parametrii lui in CSS vor arata asa:

position: absolute; height: Xpx; top: (-X/2)px;

tutorial-4.gif

Repet, pentru ca mai sus: asta e un exemplu de tip formula. Acelasi lucru, exemplificat mai concret, ar arata cam asa:

position: absolute; height: 300px; top: -150px;

Problema rezolvata!

Nota 1: Pentru cine nu intelege cum merge treaba cu position:absolute si cam ce presupune aceeasi treaba, recomand cu caldura articolul Elemente pozitionate ABSOLUTE in context RELATIVE.
Nota 2: Pentru cine se loveste de probleme legate de alinierea pe orizontala sau de width, ia cu paine de-aici: DIV-uri centrate in pagina: atentie la MARGIN.
Nota finala: Parametrii pe care i-am dat in exemplele de mai sus reprezinta STRICTUL NECESAR functionarii trebii respective. Evident ca esti liber sa adaugi de la tine orice si oricati parametri suplimentari vrei, pornind de la banalul width si mergand pana la cele mai rele hackuri CSS pe care le stii tu. Evident, restul nu ma mai priveste si e treaba ta. 🙂