VândPupăză

Icon

Bine o zis cine o zis cand o zis ce o zis

Detectie de proprietati CSS cu JavaScript

Problema

Aveam nevoie de o metoda prin care sa carpesc pentru IE6 si alte browsere incapabile de a folosi un atribut CSS.

Solutia

Pentru ca “browser sniffing” e o metoda gresita de a aborda astfel de probleme, mi-am scris o mica functie in JavaScript care detecteaza capabilitatile CSS ale unui browser. Functia returneaza true daca proprietatea este implementata de browser si false in caz contrar.

Mod de utilizare

browser.hasCssProperty("max-height")

Implementare

Metoda e simpla: orice propietate CSS are un corespondent in DOM via style. Ca sa verifici daca browserul implementeaza o proprietate CSS e suficient sa intrebi un element DOM daca style-ul sau accepta acea proprietate.

Diferenta in DOM este ca numele compuse ale proprietatilor sunt camel case (maxHeight) in timp ce in CSS ele sunt separate prin cratima (max-height). Pentru asta a trebuit sa fac o conversie din dash-separated in camelCase.

E important de stiut ca proprietatile pot avea nume compuse din mai mult de doua elemente, de exemplu border-bottom-style. CSS3 aduce multe astfel de nume compuse, chiar cu patru elemente.

Codul e pe github si poate fi imbunatatit. Intentia e sa abstractizez si mai mult implementarea ca sa fac atat object detection cat si css property detection.

Stiu ca acum nu refolosesc elementul de test.
Ar trebui sa fac un singleton.

CSS Image Sprites

In ultima vreme am acordat o atentie deosebita pentru CSS Image Sprites incercand sa gasesc solutia optima pentru proiectul la care lucrez. Pe drum am descoperit niste resurse interesante:

  • Am gasit pe blogul Mozilla Webdev un articol foarte bun referitor la pozitia si logica aranjarii imaginilor intr-un sprite – foarte informativ, il recomand.
  • In libraria imagemagick exista functia montage care permite imbinarea automatizata de surse intr-o singura imagine; are multe moduri de customizare si o gasesc foarte utila atunci cand lucrezi cu multe spre foarte multe imagini de acelasi dimensiuni (icons) iar sprite-ul evolueaza des prin adaugarea sau eliminarea de imagini.
  • Google e foarte nazist in materie de CSS Image Sprites in sensul ca optimizeaza la maxim spatiul utilizat dar foloseste niste metode “nu-prea-web-standards” pentru a afisa continutul imaginii: elemente <span> in scop decorativ, goale, fara continut:
    
    <span class="csb ch" style="background-position:-76px 0;
    margin-right:34px;width:66px"></span>
    

    Folosind aceasta metoda developer-ul nu isi mai face griji pentru imagini care apar din greseala ca background din cauza supradimensionarii elementului caruia ii este atasat sprite-ul. Asta se intampla fiindca are control fin asupra dimensiunilor acelui <span> decorativ.

    <flame> Nu sunt neaparat impotriva acestei metode dar cred ca trebuie sa echilibrezi performanta si usurinta in mentenanta a template-ului cu izbucnirile iubitorilor inflacarati ai standardelor web care vor spune ca trebuie sa scrii markup semantic, iar un span gol, cu scop pur decorativ, este o incalcare flagranta a tot ceea ce este sfant si pur in HTML. </flame>

Naming reutilizabil in CSS

Denumirea claselor sau id-urilor in CSS dupa proprietatile elementului este improprie. Exemple de denumire gresita sunt:

#rounded-menu sau .blueLink

Argumentul cel mai comun adus impotriva acestor denumiri este ca face dificila mentenanta codului in sensul ca proprietatile elementelor se vor schimba in timp ce numele de clasa / id raman aceleasi. Pe termen lung denumirile de acest gen isi pierd relevanta si fac debugging-ul dificil.

Un aspect care mi se pare des pierdut din vedere este ca aceste denumiri impiedica reutilizarea usoara a codului.
De multe ori te vezi construind componente similare in structura: meniuri liniare, box-uri de search, butoane proeminente.

Daca meniul tau se cheama #rounded-menu sau #top-menu implementarea sa intr-un alt site necesita niste renaming pentru a-i da ceva relevanta daca proprietatile nu raman similare.

OOCSS este un concept foarte bun in care iti construiesti componente generice pe care le poti extinde apoi in site-urile in care le implmenetezi.

.pipe-menu sau .tab-menu mi se par mai usor de reutilizat.

.box, .box-header, .box-footer, si .box-content pot fi niste componente foarte utile pe termen lung.

Cum am facut un zar pentru Monopoly

Am incercat sa ies cu prietenii la o bere alba nefiltrata in Bucuresti dar cum rezervarile in capitala se fac inca de pe la jumatatea saptamanii am sfarsit prin a ne aduna la iLL acasa.

IMG_9108
Monopoly fara un zar

La om acasa ne-am pus sa jucam un Monopoly dar oroarea de pe lume a facut sa avem doar un zar fizic. Aici ne-a lovit problema existentiala:

  • facem inca un zar din miez de paine?
  • coboram si cumparam un zar de la o benzinarie?
  • dam cu zarul de doua ori?

Painea ar fi durat mult pana se intarea, nimeni nu avea chef sa coboare la vanatoare iar datul de 2 ori cu zarul nu ar fi fost practic.

Geeks unite!

Vlad a fost scanteia si s-a pus sa faca un script ce imita functionalitatea a doua zaruri in JavaScript pentru Monopoly, acolo la fata locului. Stiu ca iLL si Mimoza ne implorau sa cautam pe net un script de zaruri dar nu ar mai fi fost distractiv.

Vlad a scris primele linii, neoptimizat desigur + bug de random. Eu am intervenit, i-am fixat bug-ul, i-am wrap-uit codul duplicat intr-o singura metoda explicand ca se face mult mai usor debugging-ul asa (avea doar 3 linii), am bagat un total, putin markup HTML si am introdus un alt bug :)

Ne-am invartit in jurul cozii putin din caza bug-urilor, iar Vlad a fost revelatia: JS-ul il punem la capat ca sa nu mai facem event listener pe window.onload. Dracovenie!

Jamayk a intervenit si a dat personalitate paginii anoste cu niste CSS, iar eu am adaugat coltul norocos.

In incercarea de a pastra experienta zarurilor cat mai naturala, in loc sa sufli in zaruri am rezervat un colt de ecran unde poti scuipa pentru noroc. iLL nu ne-a lasat sa ii scuipam pe televizor.

IMG_9040
Coltul norocos – televizorul e in continuare curat

Vlad a adus cireasa de pe tort si a programat “datul cu zarul” la click asa ca am folosit mouse-ul wireless pe post de trigger pentru zar pe care l-am plimbat apoi din mana in mana in jurul tablei de joc. iLL nu s-a sinchisit sa isi mute senzorul de la mouse intr-un loc mai vizibil asa ca am avut ocazia sa vedem multe acrobatii pentru a “da cu zarul”. In final a imitat efortul fizic al datului cu zarul.

IMG_9082
Jamayk cu mouse-ul pentru zarul digial

Jocul a fost distractiv, iar Jamayk a fost un latifundiar pana la capat si ne-a lasat fara bani dupa ce am jucat 1/2 din joc dupa o regula care i-a permis sa ne usuce financiar.

IMG_9156
Sa il ingropam in bani pe Jamayk

Demo zaruri pentru Monopoly

Rezultatul se alfa hostat la iLL si puteti apela cu incredere la radomness-ul zarului.
Scriptul arata totalul celor 2 zaruri si daca s-a dat dubla (valorile zarurilor aruncate sunt identice).

Nu este cel mai bun/optim/curat cod pe care l-am putea scrie dar ne-a rezolvat problema si a fost interesant sa ne vedem lucrand impreuna la acelasi lucru.

Da, a fost si foarte fun! Uite un slideshow cu niste poze de la Monopoly la iLL:

Urmeaza sa construim si o versiune masluita pentru a ne face putred de bogati de pe urma celor care vor rezultate preferentiale.

A scris si iLL despre seara noastra la Monopoly.

Morala

Nu pleca niciodata la jocuri de societate fara tocilarii de serviciu.

Object Oriented CSS

Suna profan in lumea CSS dar Nicole Sullivan propune ceva foarte sanatos: sa iei conceptele din programarea orientata pe obiecte si sa le aplici in dezvoltarea fisierelor tale de CSS.

In termeni simpli propunerea consta in a-ti scrie module generice pe care le vei reutiliza in paginile tale. Aceste module generice se vor extinde prin adaugarea mai multor clase.

Necesitatea OOCSS o vei simti atunci cand lucrezi la site-uri de talie mare cu multe pagini. Desi un site simplu poate beneficia de principiile OOCSS, atunci cand ai de intretinut zeci, sute de pagini suna mult mai rational sa iti standardizezi CSS-ul.

Prin standardizare nu ma refer la validare ci la construirea de elemente cu aspect general similar peste tot in paginile site-ului tau. In principiu nu ar trebui sa scrii CSS suplimentar pentru fiecare modul nou pe care il adaugi decat daca acesta este radical diferit de ceea ce ai deja la dispozitie.

In general developerii de front-end nu au incredere si prefera sa nu foloseasca din codul scris de ceilalti inaintea lor.

Nicole propune un framework (4kb !) construit pentru a ilustra principiile OOCSS pe care le sustine in aceasta prezentare:

Poti sa iti iei framework-ul OOCSS de pe github

Nicole Sullivan este un Perfomance Engineer de la Yahoo! care se ocupa si de tool-urile de la Exceptional Performance