SlideShare a Scribd company logo
Dobre i złe praktykiDobre i złe praktyki
kodowania w CSSkodowania w CSS
czyli...czyli...
*satysfakcja z udziału w prezentacji ani zwrot pieniędzy nie są gwarantowane*satysfakcja z udziału w prezentacji ani zwrot pieniędzy nie są gwarantowane
zostań nindżą CSS już dziś*!zostań nindżą CSS już dziś*!
Kuba Wiśniewski, DevTank S02E07, 19.03.2013Kuba Wiśniewski, DevTank S02E07, 19.03.2013
Krótka ankietaKrótka ankieta
●
Ilu na sali mamy frontendowców?Ilu na sali mamy frontendowców?
●
Raczej “koder” czy ”programista”?Raczej “koder” czy ”programista”?
O czym dzisiaj?O czym dzisiaj?
Umiejętności dobrego kodera CSSUmiejętności dobrego kodera CSS
●
Konsekwencje stosowania złej architekturyKonsekwencje stosowania złej architektury
CSSCSS
●
Cechy dobrej architektury CSSCechy dobrej architektury CSS
●
Przykłady złych praktykPrzykłady złych praktyk
●
Sedno problemu i jego rozwiązanieSedno problemu i jego rozwiązanie
●
Dobre praktykiDobre praktyki
●
ZaleceniaZalecenia
Jakie umiejętności powinienJakie umiejętności powinien
posiadać koder CSS?posiadać koder CSS?
● Mieć sprawne palce?
● Powinien nie okazywać strachu?
Jakie umiejętności powinienJakie umiejętności powinien
posiadać dobry koder CSS?posiadać dobry koder CSS?
●
Wierne dzwierciedlanie wyglądu z pliku .psdWierne dzwierciedlanie wyglądu z pliku .psd
●
Kodowanie bez użycia tabelekKodowanie bez użycia tabelek
●
Stosowanie jak najmniejszej ilości obrazkówStosowanie jak najmniejszej ilości obrazków
●
Stosowanie @mediaStosowanie @media
●
Znajomość CSS3/HTML5Znajomość CSS3/HTML5
Jakie umiejętności powinienJakie umiejętności powinien
posiadać programista PHP?posiadać programista PHP?
●
Kodowanie zgodne ze specyfikacjąKodowanie zgodne ze specyfikacją
●
Znajomość zasad OOPZnajomość zasad OOP
●
Znajomość wzorców projektowychZnajomość wzorców projektowych
●
Tworzenie kodu łatwego do zarządzaniaTworzenie kodu łatwego do zarządzania
●
Znajomość namespaces, traitsZnajomość namespaces, traits
Dobry dev CSS PHP devDobry dev CSS PHP dev
Wierne dzwierciedlanie wyglądu z pliku .psdWierne dzwierciedlanie wyglądu z pliku .psd
Kodowanie bez użycia tabelekKodowanie bez użycia tabelek
Stosowanie jak najmniejszej ilości obrazkówStosowanie jak najmniejszej ilości obrazków
Stosowanie @mediaStosowanie @media
Znajomość CSS3/HTML5Znajomość CSS3/HTML5
Kodowanie zgodne ze specyfikacjąKodowanie zgodne ze specyfikacją
Znajomość zasad OOPZnajomość zasad OOP
Znajomość wzorców projektowychZnajomość wzorców projektowych
Tworzenie kodu łatwego do zarządzaniaTworzenie kodu łatwego do zarządzania
Znajomość namespaces, traitsZnajomość namespaces, traits
Analogia #1: CSS a PHPAnalogia #1: CSS a PHP
Konsekwencja stosowaniaKonsekwencja stosowania
złej architektury CSSzłej architektury CSS
●
Spowolnienie rozwoju aplikacjiSpowolnienie rozwoju aplikacji
●
CSS to ważny element każdej aplikacji WEBCSS to ważny element każdej aplikacji WEB
●
ProjektProjekt kodu CSS powinien być tak samokodu CSS powinien być tak samo
ważny jakważny jak projektprojekt graficzny,graficzny, projektprojekt strukturstruktur
danych, czydanych, czy projektprojekt architektury serwerówarchitektury serwerów
Cechy dobrej architektury CSSCechy dobrej architektury CSS
●
przewidywlnaprzewidywlna
●
wielokrotnego użytkuwielokrotnego użytku
●
łatwa w utrzymaniułatwa w utrzymaniu
●
skalowalnaskalowalna
Przykłady złych praktykPrzykłady złych praktyk
Modyfikowanie komponentów naModyfikowanie komponentów na
podstawie tego, kim są ich rodzicepodstawie tego, kim są ich rodzice
●
przewidywalny?przewidywalny?
●
wielokrotnego użytku?wielokrotnego użytku?
●
łatwy w utrzymaniu?łatwy w utrzymaniu?
.widget {
background: yellow;
border: 1px solid black;
color: black;
width: 50%;
}
#sidebar .widget {
width: 200px;
}
body.homepage .widget {
background: white;
}
A co jeśli...A co jeśli...
A co jeśli... białe tło będzie potrzebne też naA co jeśli... białe tło będzie potrzebne też na
nowej stronie?nowej stronie?
.widget {
background: yellow;
border: 1px solid black;
color: black;
width: 50%;
}
#sidebar .widget {
width: 200px;
}
body.homepage .widget,
body.anotherpage .widget {
background: white;
}
A co jeśli... obrazek będzie w tle?A co jeśli... obrazek będzie w tle?
.widget {
background: url(...);
border: 1px solid black;
color: black;
width: 50%;
}
#sidebar .widget {
width: 200px;
}
body.homepage .widget {
background: url(...);
}
A co jeśli... obrazek będzie w tle?A co jeśli... obrazek będzie w tle?
/s/skin/classic.css
.widget {
background: url(...);
border: 1px solid black;
color: black;
width: 50%;
}
/s/skin/z-zupelnie-innej-beczki-dolaczany-tylko-na-jednej-podstronie.css
body.homepage .widget {
background: white;
}
Modyfikowanie komponentów naModyfikowanie komponentów na
podstawie tego, kim są ich rodzicepodstawie tego, kim są ich rodzice
nieprzewidywalnynieprzewidywalny
jednokrotnego użytkujednokrotnego użytku
trudny w utrzymaniutrudny w utrzymaniu
.widget {
background: yellow;
border: 1px solid black;
color: black;
width: 50%;
}
#sidebar .widget {
width: 200px;
}
body.homepage .widget {
background: white;
}
Analogia #2: CSS a PHPAnalogia #2: CSS a PHP
““.widget” to klasa, którą zmieniamy na potrzeby.widget” to klasa, którą zmieniamy na potrzeby
tylko jednego konkretnego przypadku użyciatylko jednego konkretnego przypadku użycia
Analogia #2: CSS a PHPAnalogia #2: CSS a PHP
●
““.widget” to klasa, którą zmieniamy na potrzeby.widget” to klasa, którą zmieniamy na potrzeby
jednego konkretnego przypadku użyciajednego konkretnego przypadku użycia
open / closed
principle
Zbyt skomplikowane selektoryZbyt skomplikowane selektory
●
przewidywalny?przewidywalny?
●
wielokrotnego użytku?wielokrotnego użytku?
●
łatwy w utrzymaniu?łatwy w utrzymaniu?
#main-nav ul li ul li div { }
#sidebar > div > h3 + p { }
A co jeśli... zmieni się struktura HTML?A co jeśli... zmieni się struktura HTML?
#sidebar > div > h3 + p { }
#sidebar > section > h3 + p { }
nieprzewidywalny
trudny w utrzymaniu
A co jeśli... chcemy dodać drugie menu w stopce?A co jeśli... chcemy dodać drugie menu w stopce?
#main-nav ul li ul li div { }
#main-nav ul li ul li div,
#footer-nav ul li ul li div { }
trudny w utrzymaniu
jednokrotnego użytku
Zbyt ogólne nazwy klasZbyt ogólne nazwy klas
<div class="widget">
<h3 class="title">...</h3>
<div class="contents">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
In condimentum justo et est dapibus sit amet euismod ligula ornare.
Vivamus elementum accumsan dignissim.
<button class="action">Click Me!</button>
</div>
</div>
.widget {}
.widget .title {}
.widget .contents {}
.widget .action {}
A co jeśli... na innej stronie będzie już klasa .title?A co jeśli... na innej stronie będzie już klasa .title?
nieprzewidywalnynieprzewidywalny
moj-plik.css
.widget {}
.widget .title {foo: bar;}
.widget .contents {}
.widget .action {}
plik-innego-deva.css
.title {abc: xyz;}
<div class="widget">
<h3 class="title">foo: bar; abc: xyz;</h3>
<div class="contents">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
In condimentum justo et est dapibus sit amet euismod ligula ornare.
Vivamus elementum accumsan dignissim.
<button class="action">Click Me!</button>
</div>
</div>
Sprawianie, by jedna reguła CSSSprawianie, by jedna reguła CSS
robiła zbyt wiele narazrobiła zbyt wiele naraz
.widget {
position: absolute;
top: 20px;
left: 20px;
background-color: red;
font-size: 1.5em;
text-transform: uppercase;
}
wielokrotnego użytku?wielokrotnego użytku?
A co jeśli... potrzebny będzie taki sam blok w innymA co jeśli... potrzebny będzie taki sam blok w innym
miejscu na stronie?miejscu na stronie?
.widget {
position: absolute;
top: 20px;
left: 20px;
background-color: red;
font-size: 1.5em;
text-transform: uppercase;
}
.widget2 {
position: absolute;
bottom: 20px;
right: 20px;
background-color: red;
font-size: 1.5em;
text-transform: uppercase;
}
Sprawianie, by reguła robiła zbytSprawianie, by reguła robiła zbyt
wiele narazwiele naraz
.widget {
position: absolute;
top: 20px;
left: 20px;
background-color: red;
font-size: 1.5em;
text-transform: uppercase;
}
wielokrotnego użytku?wielokrotnego użytku?
.widget {
position: absolute;
top: 20px;
left: 20px;
background-color: red;background-color: red;
font-size: 1.5em;font-size: 1.5em;
text-transform: uppercase;text-transform: uppercase;
}
layout - nielayout - nie
look n' feel - taklook n' feel - tak
Sedno problemuSedno problemu
●
Zbyt wiele odpowiedzialności za wyglądZbyt wiele odpowiedzialności za wygląd
pokładamy w CSSpokładamy w CSS
●
CSS oddzielony od HTML nie oznacza, żeCSS oddzielony od HTML nie oznacza, że
warstwa treści oddzielona jest od warstwywarstwa treści oddzielona jest od warstwy
prezentacjiprezentacji
……i jego rozwiązaniei jego rozwiązanie
●
CSS powinien mieć jak najmniej odwołań doCSS powinien mieć jak najmniej odwołań do
struktury HTMLstruktury HTML
●
CSS powinien definiować wygląd elementówCSS powinien definiować wygląd elementów
niezależnie od miejsca, gdzie zostaną oneniezależnie od miejsca, gdzie zostaną one
użyteużyte
●
Jeśli dany komponent ma wyglądać inaczej wJeśli dany komponent ma wyglądać inaczej w
innym przypadku użycia, to powinien inaczej sięinnym przypadku użycia, to powinien inaczej się
nazywać (w CSS) i to HTML powiniennazywać (w CSS) i to HTML powinien
(za pomocą tej innej nazwy) do niego się(za pomocą tej innej nazwy) do niego się
odwoływaćodwoływać
Prosty przykładProsty przykład
.button {
background-color: red;
font-size: 1.5em;
text-transform: uppercase;
}
.button-100px {
width: 100px;
}
.button-50percentbutton-50percent {
width: 50%;
}
.button-centeredbutton-centered {
margin: 0 auto;
}
<input class=”button”>
<span class=”button button-100px”></span>
<div class=”button button-50percentbutton-50percent”></div>
<a class=”button button-50percentbutton-50percent button-centeredbutton-centered”></a>
Analogia #3Analogia #3
CSS / HTML = SQL / PHPCSS / HTML = SQL / PHP
Dobre praktyki - Koduj z zamysłemDobre praktyki - Koduj z zamysłem
/* łom */
#main-nav ul li ul { }
/* karabin snajperski */
.subnav { }
Dobre praktyki - Rozdziel zakresyDobre praktyki - Rozdziel zakresy
.widget {
position: absolute;
top: 20px;
left: 20px;
background-color: red;background-color: red;
font-size: 1.5em;font-size: 1.5em;
text-transform: uppercase;text-transform: uppercase;
}
.l-widget {
position: absolute;
top: 20px;
left: 20px;
}
.widget {
background-color: red;background-color: red;
font-size: 1.5em;font-size: 1.5em;
text-transform: uppercase;text-transform: uppercase;
}
Dobre praktyki – Używaj przestrzeni nazwDobre praktyki – Używaj przestrzeni nazw
.widget {}
.widget .title {}
.widget .contents {}
.widget .action {}
.widget {}
.widget-title {}
.widget-contents {}
.widget-action {}
Dobre praktyki – Używaj modyfikatorówDobre praktyki – Używaj modyfikatorów
.widget {
background: yellow;
border: 1px solid black;
color: black;
width: 50%;
}
#sidebar .widget {
width: 200px;
}
body.homepage .widget {
background: white;
} .widget {
background: yellow;
border: 1px solid black;
color: black;
width: 50%;
}
.widget-sidebar {
width: 200px;
}
.widget-homepage {
background: white;
}
A co z przyrostem kodu HTML?A co z przyrostem kodu HTML?
WniosekWniosek
●
CSS to tez jezyk programowaniaCSS to tez jezyk programowania
●
Obowiązują te same podstawy: OSP, DRY...Obowiązują te same podstawy: OSP, DRY...
ZaleceniaZalecenia
●
opracowanie architekturyopracowanie architektury
●
edukacja pracownikówedukacja pracowników
●
adaptacja starteraadaptacja startera
...a póki co......a póki co...
●
stosuj już dziś, tak jak na:stosuj już dziś, tak jak na: http://fakty.interia.pl/http://fakty.interia.pl/
QA?QA?
Dzięki za uwagęDzięki za uwagę
https://gist.github.com/csswizardry/4136435
http://csswizardry.com/2012/11/code-smells-in-css/
http://oliverjash.me/2012/11/23/css-exceptions-object-modifiers-or-extensions.html
http://engineering.appfolio.com/2012/11/16/css-architecture/
Linkografia:

More Related Content

Viewers also liked

LESS - CSS w nowej formie
LESS - CSS w nowej formieLESS - CSS w nowej formie
LESS - CSS w nowej formie
Tomasz Dziuda
 
Pamela Blanchette_Resume copy
Pamela Blanchette_Resume copyPamela Blanchette_Resume copy
Pamela Blanchette_Resume copy
Pam Blanchette
 
исаак ньютон
исаак ньютонисаак ньютон
исаак ньютонsunvywern
 
Vnetlengkap2010 100316230706-phpapp01
Vnetlengkap2010 100316230706-phpapp01Vnetlengkap2010 100316230706-phpapp01
Vnetlengkap2010 100316230706-phpapp01
Eka Rachman
 
Dampak industri
Dampak industriDampak industri
Dampak industri
hannitaandriani
 
Corporate Presentation
Corporate PresentationCorporate Presentation
Corporate Presentation
primero_mining
 
Uji kuat tarik ppt
Uji kuat tarik pptUji kuat tarik ppt
Uji kuat tarik ppt
Sylvester Saragih
 
Mass test
Mass testMass test
Mass test
stephenwkh
 
Council australia-inc
Council australia-incCouncil australia-inc
Council australia-inc
Midhin Shanker
 
06 manutenção preventiva
06 manutenção preventiva06 manutenção preventiva
06 manutenção preventiva
fernandoandrades
 
Assignment 16
Assignment 16Assignment 16
Assignment 16
debbie14
 
Asteroïde karel konings_&_sam_landuydt
Asteroïde karel konings_&_sam_landuydtAsteroïde karel konings_&_sam_landuydt
Asteroïde karel konings_&_sam_landuydtKarel Konings
 
Field assignment
Field assignmentField assignment
Field assignment
SarahBeach
 
Bungarribee 2011 nov 15 issue 20
Bungarribee 2011 nov 15  issue 20Bungarribee 2011 nov 15  issue 20
Bungarribee 2011 nov 15 issue 20
Rotary Club of Blacktown City
 
【官方正版】红米发布会精华版Ppt
【官方正版】红米发布会精华版Ppt【官方正版】红米发布会精华版Ppt
【官方正版】红米发布会精华版PptGina Gu
 
デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化
デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化
デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化
吉田印刷所
 
Field assignment
Field assignmentField assignment
Field assignment
SarahBeach
 

Viewers also liked (20)

LESS - CSS w nowej formie
LESS - CSS w nowej formieLESS - CSS w nowej formie
LESS - CSS w nowej formie
 
Pamela Blanchette_Resume copy
Pamela Blanchette_Resume copyPamela Blanchette_Resume copy
Pamela Blanchette_Resume copy
 
исаак ньютон
исаак ньютонисаак ньютон
исаак ньютон
 
Vnetlengkap2010 100316230706-phpapp01
Vnetlengkap2010 100316230706-phpapp01Vnetlengkap2010 100316230706-phpapp01
Vnetlengkap2010 100316230706-phpapp01
 
Dampak industri
Dampak industriDampak industri
Dampak industri
 
Corporate Presentation
Corporate PresentationCorporate Presentation
Corporate Presentation
 
Uji kuat tarik ppt
Uji kuat tarik pptUji kuat tarik ppt
Uji kuat tarik ppt
 
Mass test
Mass testMass test
Mass test
 
Council australia-inc
Council australia-incCouncil australia-inc
Council australia-inc
 
06 manutenção preventiva
06 manutenção preventiva06 manutenção preventiva
06 manutenção preventiva
 
Assignment 16
Assignment 16Assignment 16
Assignment 16
 
Asteroïde karel konings_&_sam_landuydt
Asteroïde karel konings_&_sam_landuydtAsteroïde karel konings_&_sam_landuydt
Asteroïde karel konings_&_sam_landuydt
 
Field assignment
Field assignmentField assignment
Field assignment
 
Konsep teknologi
Konsep teknologiKonsep teknologi
Konsep teknologi
 
Bungarribee 2011 nov 15 issue 20
Bungarribee 2011 nov 15  issue 20Bungarribee 2011 nov 15  issue 20
Bungarribee 2011 nov 15 issue 20
 
【官方正版】红米发布会精华版Ppt
【官方正版】红米发布会精华版Ppt【官方正版】红米发布会精华版Ppt
【官方正版】红米发布会精华版Ppt
 
3547358436
35473584363547358436
3547358436
 
デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化
デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化
デジタルカタログのご提案~印刷物との併用による情報発信メディアと印刷数量の最適化
 
Field assignment
Field assignmentField assignment
Field assignment
 
Think2015 Google
Think2015 GoogleThink2015 Google
Think2015 Google
 

Similar to Architektura CSS - dobre i złe praktyki

WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistomWordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
Tomasz Dziuda
 
Jak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayJak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training Day
Tomasz Dziuda
 
(node.js) Web development - prościej (pl)
(node.js) Web development - prościej (pl)(node.js) Web development - prościej (pl)
(node.js) Web development - prościej (pl)
Mateusz Kwasniewski
 
Jaki framework wybrać
Jaki framework wybraćJaki framework wybrać
Jaki framework wybrać
Paweł Tekliński
 
Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...
Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...
Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...
Mariusz Szatkowski
 
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp KatowiceMotywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
Tomasz Dziuda
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
Tomasz Borowski
 
Wydajny frontend 2024 - nowości optymalizacyjne
Wydajny frontend 2024 - nowości optymalizacyjneWydajny frontend 2024 - nowości optymalizacyjne
Wydajny frontend 2024 - nowości optymalizacyjne
Bartłomiej Miś
 
Word up warszawa 2015
Word up warszawa 2015Word up warszawa 2015
Word up warszawa 2015
Tomasz Dziuda
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp Wrocław
Tomasz Dziuda
 
Joomla a responsywność
Joomla a responsywnośćJoomla a responsywność
Joomla a responsywność
Tomasz Dziuda
 
"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12
"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12
"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12
Droids On Roids
 
Responsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądziResponsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądzi
Jakub Wiśniewski
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 
Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...
Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...
Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...
Bartłomiej Krztuk
 
Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)
Wojtek Zając
 
Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?
Tomasz Dziuda
 
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp SilesiaJak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Tomasz Dziuda
 
Responsive Web Design - co z tego wynikło?
Responsive Web Design - co z tego wynikło?Responsive Web Design - co z tego wynikło?
Responsive Web Design - co z tego wynikło?
Tomasz Dziuda
 

Similar to Architektura CSS - dobre i złe praktyki (20)

WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistomWordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
 
Responsive Web Design
Responsive Web DesignResponsive Web Design
Responsive Web Design
 
Jak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayJak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training Day
 
(node.js) Web development - prościej (pl)
(node.js) Web development - prościej (pl)(node.js) Web development - prościej (pl)
(node.js) Web development - prościej (pl)
 
Jaki framework wybrać
Jaki framework wybraćJaki framework wybrać
Jaki framework wybrać
 
Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...
Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...
Wordpress dla początkujących szkolenie / warsztat 07/10 Sidebary, Widgety, Mo...
 
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp KatowiceMotywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
Wydajny frontend 2024 - nowości optymalizacyjne
Wydajny frontend 2024 - nowości optymalizacyjneWydajny frontend 2024 - nowości optymalizacyjne
Wydajny frontend 2024 - nowości optymalizacyjne
 
Word up warszawa 2015
Word up warszawa 2015Word up warszawa 2015
Word up warszawa 2015
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp Wrocław
 
Joomla a responsywność
Joomla a responsywnośćJoomla a responsywność
Joomla a responsywność
 
"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12
"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12
"Nie wiem", czyli od pomysłu, do produktu // LET SWIFT #12
 
Responsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądziResponsive Web Design - kto mało pyta, nie błądzi
Responsive Web Design - kto mało pyta, nie błądzi
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...
Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...
Bootstrap w Joomla - modyfikować, rozszerzać, nadpisywać oraz czy 
w ogól...
 
Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)Antologia Webdevelopera (9.12.2006)
Antologia Webdevelopera (9.12.2006)
 
Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?Jak tworzyć motywy przyjazne użytkownikom i programistom?
Jak tworzyć motywy przyjazne użytkownikom i programistom?
 
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp SilesiaJak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
 
Responsive Web Design - co z tego wynikło?
Responsive Web Design - co z tego wynikło?Responsive Web Design - co z tego wynikło?
Responsive Web Design - co z tego wynikło?
 

Architektura CSS - dobre i złe praktyki

  • 1. Dobre i złe praktykiDobre i złe praktyki kodowania w CSSkodowania w CSS czyli...czyli... *satysfakcja z udziału w prezentacji ani zwrot pieniędzy nie są gwarantowane*satysfakcja z udziału w prezentacji ani zwrot pieniędzy nie są gwarantowane zostań nindżą CSS już dziś*!zostań nindżą CSS już dziś*! Kuba Wiśniewski, DevTank S02E07, 19.03.2013Kuba Wiśniewski, DevTank S02E07, 19.03.2013
  • 2. Krótka ankietaKrótka ankieta ● Ilu na sali mamy frontendowców?Ilu na sali mamy frontendowców? ● Raczej “koder” czy ”programista”?Raczej “koder” czy ”programista”?
  • 3. O czym dzisiaj?O czym dzisiaj? Umiejętności dobrego kodera CSSUmiejętności dobrego kodera CSS ● Konsekwencje stosowania złej architekturyKonsekwencje stosowania złej architektury CSSCSS ● Cechy dobrej architektury CSSCechy dobrej architektury CSS ● Przykłady złych praktykPrzykłady złych praktyk ● Sedno problemu i jego rozwiązanieSedno problemu i jego rozwiązanie ● Dobre praktykiDobre praktyki ● ZaleceniaZalecenia
  • 4. Jakie umiejętności powinienJakie umiejętności powinien posiadać koder CSS?posiadać koder CSS? ● Mieć sprawne palce? ● Powinien nie okazywać strachu?
  • 5. Jakie umiejętności powinienJakie umiejętności powinien posiadać dobry koder CSS?posiadać dobry koder CSS? ● Wierne dzwierciedlanie wyglądu z pliku .psdWierne dzwierciedlanie wyglądu z pliku .psd ● Kodowanie bez użycia tabelekKodowanie bez użycia tabelek ● Stosowanie jak najmniejszej ilości obrazkówStosowanie jak najmniejszej ilości obrazków ● Stosowanie @mediaStosowanie @media ● Znajomość CSS3/HTML5Znajomość CSS3/HTML5
  • 6. Jakie umiejętności powinienJakie umiejętności powinien posiadać programista PHP?posiadać programista PHP? ● Kodowanie zgodne ze specyfikacjąKodowanie zgodne ze specyfikacją ● Znajomość zasad OOPZnajomość zasad OOP ● Znajomość wzorców projektowychZnajomość wzorców projektowych ● Tworzenie kodu łatwego do zarządzaniaTworzenie kodu łatwego do zarządzania ● Znajomość namespaces, traitsZnajomość namespaces, traits
  • 7. Dobry dev CSS PHP devDobry dev CSS PHP dev Wierne dzwierciedlanie wyglądu z pliku .psdWierne dzwierciedlanie wyglądu z pliku .psd Kodowanie bez użycia tabelekKodowanie bez użycia tabelek Stosowanie jak najmniejszej ilości obrazkówStosowanie jak najmniejszej ilości obrazków Stosowanie @mediaStosowanie @media Znajomość CSS3/HTML5Znajomość CSS3/HTML5 Kodowanie zgodne ze specyfikacjąKodowanie zgodne ze specyfikacją Znajomość zasad OOPZnajomość zasad OOP Znajomość wzorców projektowychZnajomość wzorców projektowych Tworzenie kodu łatwego do zarządzaniaTworzenie kodu łatwego do zarządzania Znajomość namespaces, traitsZnajomość namespaces, traits Analogia #1: CSS a PHPAnalogia #1: CSS a PHP
  • 8. Konsekwencja stosowaniaKonsekwencja stosowania złej architektury CSSzłej architektury CSS ● Spowolnienie rozwoju aplikacjiSpowolnienie rozwoju aplikacji ● CSS to ważny element każdej aplikacji WEBCSS to ważny element każdej aplikacji WEB ● ProjektProjekt kodu CSS powinien być tak samokodu CSS powinien być tak samo ważny jakważny jak projektprojekt graficzny,graficzny, projektprojekt strukturstruktur danych, czydanych, czy projektprojekt architektury serwerówarchitektury serwerów
  • 9. Cechy dobrej architektury CSSCechy dobrej architektury CSS ● przewidywlnaprzewidywlna ● wielokrotnego użytkuwielokrotnego użytku ● łatwa w utrzymaniułatwa w utrzymaniu ● skalowalnaskalowalna
  • 11. Modyfikowanie komponentów naModyfikowanie komponentów na podstawie tego, kim są ich rodzicepodstawie tego, kim są ich rodzice ● przewidywalny?przewidywalny? ● wielokrotnego użytku?wielokrotnego użytku? ● łatwy w utrzymaniu?łatwy w utrzymaniu? .widget { background: yellow; border: 1px solid black; color: black; width: 50%; } #sidebar .widget { width: 200px; } body.homepage .widget { background: white; }
  • 12. A co jeśli...A co jeśli...
  • 13. A co jeśli... białe tło będzie potrzebne też naA co jeśli... białe tło będzie potrzebne też na nowej stronie?nowej stronie? .widget { background: yellow; border: 1px solid black; color: black; width: 50%; } #sidebar .widget { width: 200px; } body.homepage .widget, body.anotherpage .widget { background: white; }
  • 14. A co jeśli... obrazek będzie w tle?A co jeśli... obrazek będzie w tle? .widget { background: url(...); border: 1px solid black; color: black; width: 50%; } #sidebar .widget { width: 200px; } body.homepage .widget { background: url(...); }
  • 15. A co jeśli... obrazek będzie w tle?A co jeśli... obrazek będzie w tle? /s/skin/classic.css .widget { background: url(...); border: 1px solid black; color: black; width: 50%; } /s/skin/z-zupelnie-innej-beczki-dolaczany-tylko-na-jednej-podstronie.css body.homepage .widget { background: white; }
  • 16. Modyfikowanie komponentów naModyfikowanie komponentów na podstawie tego, kim są ich rodzicepodstawie tego, kim są ich rodzice nieprzewidywalnynieprzewidywalny jednokrotnego użytkujednokrotnego użytku trudny w utrzymaniutrudny w utrzymaniu .widget { background: yellow; border: 1px solid black; color: black; width: 50%; } #sidebar .widget { width: 200px; } body.homepage .widget { background: white; }
  • 17. Analogia #2: CSS a PHPAnalogia #2: CSS a PHP ““.widget” to klasa, którą zmieniamy na potrzeby.widget” to klasa, którą zmieniamy na potrzeby tylko jednego konkretnego przypadku użyciatylko jednego konkretnego przypadku użycia
  • 18. Analogia #2: CSS a PHPAnalogia #2: CSS a PHP ● ““.widget” to klasa, którą zmieniamy na potrzeby.widget” to klasa, którą zmieniamy na potrzeby jednego konkretnego przypadku użyciajednego konkretnego przypadku użycia open / closed principle
  • 19. Zbyt skomplikowane selektoryZbyt skomplikowane selektory ● przewidywalny?przewidywalny? ● wielokrotnego użytku?wielokrotnego użytku? ● łatwy w utrzymaniu?łatwy w utrzymaniu? #main-nav ul li ul li div { } #sidebar > div > h3 + p { }
  • 20. A co jeśli... zmieni się struktura HTML?A co jeśli... zmieni się struktura HTML? #sidebar > div > h3 + p { } #sidebar > section > h3 + p { } nieprzewidywalny trudny w utrzymaniu
  • 21. A co jeśli... chcemy dodać drugie menu w stopce?A co jeśli... chcemy dodać drugie menu w stopce? #main-nav ul li ul li div { } #main-nav ul li ul li div, #footer-nav ul li ul li div { } trudny w utrzymaniu jednokrotnego użytku
  • 22. Zbyt ogólne nazwy klasZbyt ogólne nazwy klas <div class="widget"> <h3 class="title">...</h3> <div class="contents"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. In condimentum justo et est dapibus sit amet euismod ligula ornare. Vivamus elementum accumsan dignissim. <button class="action">Click Me!</button> </div> </div> .widget {} .widget .title {} .widget .contents {} .widget .action {}
  • 23. A co jeśli... na innej stronie będzie już klasa .title?A co jeśli... na innej stronie będzie już klasa .title? nieprzewidywalnynieprzewidywalny moj-plik.css .widget {} .widget .title {foo: bar;} .widget .contents {} .widget .action {} plik-innego-deva.css .title {abc: xyz;} <div class="widget"> <h3 class="title">foo: bar; abc: xyz;</h3> <div class="contents"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. In condimentum justo et est dapibus sit amet euismod ligula ornare. Vivamus elementum accumsan dignissim. <button class="action">Click Me!</button> </div> </div>
  • 24. Sprawianie, by jedna reguła CSSSprawianie, by jedna reguła CSS robiła zbyt wiele narazrobiła zbyt wiele naraz .widget { position: absolute; top: 20px; left: 20px; background-color: red; font-size: 1.5em; text-transform: uppercase; } wielokrotnego użytku?wielokrotnego użytku?
  • 25. A co jeśli... potrzebny będzie taki sam blok w innymA co jeśli... potrzebny będzie taki sam blok w innym miejscu na stronie?miejscu na stronie? .widget { position: absolute; top: 20px; left: 20px; background-color: red; font-size: 1.5em; text-transform: uppercase; } .widget2 { position: absolute; bottom: 20px; right: 20px; background-color: red; font-size: 1.5em; text-transform: uppercase; }
  • 26. Sprawianie, by reguła robiła zbytSprawianie, by reguła robiła zbyt wiele narazwiele naraz .widget { position: absolute; top: 20px; left: 20px; background-color: red; font-size: 1.5em; text-transform: uppercase; } wielokrotnego użytku?wielokrotnego użytku? .widget { position: absolute; top: 20px; left: 20px; background-color: red;background-color: red; font-size: 1.5em;font-size: 1.5em; text-transform: uppercase;text-transform: uppercase; } layout - nielayout - nie look n' feel - taklook n' feel - tak
  • 27. Sedno problemuSedno problemu ● Zbyt wiele odpowiedzialności za wyglądZbyt wiele odpowiedzialności za wygląd pokładamy w CSSpokładamy w CSS ● CSS oddzielony od HTML nie oznacza, żeCSS oddzielony od HTML nie oznacza, że warstwa treści oddzielona jest od warstwywarstwa treści oddzielona jest od warstwy prezentacjiprezentacji
  • 28. ……i jego rozwiązaniei jego rozwiązanie ● CSS powinien mieć jak najmniej odwołań doCSS powinien mieć jak najmniej odwołań do struktury HTMLstruktury HTML ● CSS powinien definiować wygląd elementówCSS powinien definiować wygląd elementów niezależnie od miejsca, gdzie zostaną oneniezależnie od miejsca, gdzie zostaną one użyteużyte ● Jeśli dany komponent ma wyglądać inaczej wJeśli dany komponent ma wyglądać inaczej w innym przypadku użycia, to powinien inaczej sięinnym przypadku użycia, to powinien inaczej się nazywać (w CSS) i to HTML powiniennazywać (w CSS) i to HTML powinien (za pomocą tej innej nazwy) do niego się(za pomocą tej innej nazwy) do niego się odwoływaćodwoływać
  • 29. Prosty przykładProsty przykład .button { background-color: red; font-size: 1.5em; text-transform: uppercase; } .button-100px { width: 100px; } .button-50percentbutton-50percent { width: 50%; } .button-centeredbutton-centered { margin: 0 auto; } <input class=”button”> <span class=”button button-100px”></span> <div class=”button button-50percentbutton-50percent”></div> <a class=”button button-50percentbutton-50percent button-centeredbutton-centered”></a>
  • 30. Analogia #3Analogia #3 CSS / HTML = SQL / PHPCSS / HTML = SQL / PHP
  • 31. Dobre praktyki - Koduj z zamysłemDobre praktyki - Koduj z zamysłem /* łom */ #main-nav ul li ul { } /* karabin snajperski */ .subnav { }
  • 32. Dobre praktyki - Rozdziel zakresyDobre praktyki - Rozdziel zakresy .widget { position: absolute; top: 20px; left: 20px; background-color: red;background-color: red; font-size: 1.5em;font-size: 1.5em; text-transform: uppercase;text-transform: uppercase; } .l-widget { position: absolute; top: 20px; left: 20px; } .widget { background-color: red;background-color: red; font-size: 1.5em;font-size: 1.5em; text-transform: uppercase;text-transform: uppercase; }
  • 33. Dobre praktyki – Używaj przestrzeni nazwDobre praktyki – Używaj przestrzeni nazw .widget {} .widget .title {} .widget .contents {} .widget .action {} .widget {} .widget-title {} .widget-contents {} .widget-action {}
  • 34. Dobre praktyki – Używaj modyfikatorówDobre praktyki – Używaj modyfikatorów .widget { background: yellow; border: 1px solid black; color: black; width: 50%; } #sidebar .widget { width: 200px; } body.homepage .widget { background: white; } .widget { background: yellow; border: 1px solid black; color: black; width: 50%; } .widget-sidebar { width: 200px; } .widget-homepage { background: white; }
  • 35. A co z przyrostem kodu HTML?A co z przyrostem kodu HTML?
  • 36. WniosekWniosek ● CSS to tez jezyk programowaniaCSS to tez jezyk programowania ● Obowiązują te same podstawy: OSP, DRY...Obowiązują te same podstawy: OSP, DRY...
  • 37. ZaleceniaZalecenia ● opracowanie architekturyopracowanie architektury ● edukacja pracownikówedukacja pracowników ● adaptacja starteraadaptacja startera ...a póki co......a póki co... ● stosuj już dziś, tak jak na:stosuj już dziś, tak jak na: http://fakty.interia.pl/http://fakty.interia.pl/
  • 39. Dzięki za uwagęDzięki za uwagę https://gist.github.com/csswizardry/4136435 http://csswizardry.com/2012/11/code-smells-in-css/ http://oliverjash.me/2012/11/23/css-exceptions-object-modifiers-or-extensions.html http://engineering.appfolio.com/2012/11/16/css-architecture/ Linkografia: