Efter en del påstötningar från kollegor har jag testat Lesscss. Det är en teknik som utvidgar klassisk CSS med fina saker som variabler, funktioner (mixins) och en del annat bra. Det är väldigt praktiskt om man till exempel har kod i sitt CSS som återkommer på flera olika ställen. Då kan man istället deklarera detta på ett ställe och sedan återanvända på ett enkelt sätt.
För att testa har jag byggt en enkel grid för responsiv desig. Jag använde 12 spalter och gutter runt alla spalter (klassisk 960.gs-tänk). Med traditionell CSS hade jag hårdkodat fyra varianter mobil, tablet, desktop och huge. Men Lesscss löser detta på ett smidigt sätt.
Jag har en mixin (funktion) för griden som jag sedan matar med tre variabler, spaltbredd, gutter och totalbredd. Inne i min grid-mixin räknar jag sedan fram exakta bredder på de olika blocken eller på min wrapper. Redan i detta läge har jag alltså jag sparat cirka 75% av koden eftersom jag gör en grid istället för fyra, trolleri.
Min Mixin ser ut ungefär såhär.
.grid(@block,@gutter,@container) {
/* Blocks */
.block-1 { width: @block }
.block-2 { width: @block * 2 + @gutter * 2 }
.block-3 { width: @block * 3 + @gutter * 4 }
.block-4 { width: @block * 4 + @gutter * 6 }
.block-5 { width: @block * 5 + @gutter * 8 }
.block-6 { width: @block * 6 + @gutter * 10 }
.block-7 { width: @block * 7 + @gutter * 12 }
.block-8 { width: @block * 8 + @gutter * 14 }
.block-9 { width: @block * 9 + @gutter * 16 }
.block-10 { width: @block * 10 + @gutter * 18 }
.block-11 { width: @block * 11 + @gutter * 20 }
.block-12 { width: @block * 12 + @gutter * 22 }
/* Prefix */
.prefix-1 { padding-left: @block + @gutter * 2; }
.prefix-2 { padding-left: @block * 2 + @gutter * 4; }
.prefix-3 { padding-left: @block * 3 + @gutter * 6; }
.prefix-4 { padding-left: @block * 4 + @gutter * 8; }
.prefix-5 { padding-left: @block * 5 + @gutter * 10; }
.prefix-6 { padding-left: @block * 6 + @gutter * 12; }
.prefix-7 { padding-left: @block * 7 + @gutter * 14; }
.prefix-8 { padding-left: @block * 8 + @gutter * 16; }
.prefix-9 { padding-left: @block * 9 + @gutter * 18; }
.prefix-10 { padding-left: @block * 10 + @gutter * 20; }
.prefix-11 { padding-left: @block * 11 + @gutter * 22; }
/* Suffix */
.suffix-1 { padding-right: @block + @gutter * 2; }
.suffix-2 { padding-right: @block * 2 + @gutter * 4; }
.suffix-3 { padding-right: @block * 3 + @gutter * 6; }
.suffix-4 { padding-right: @block * 4 + @gutter * 8; }
.suffix-5 { padding-right: @block * 4 + @gutter * 10; }
.suffix-6 { padding-right: @block * 4 + @gutter * 12; }
.suffix-7 { padding-right: @block * 7 + @gutter * 14; }
.suffix-8 { padding-right: @block * 8 + @gutter * 16; }
.suffix-9 { padding-right: @block * 9 + @gutter * 18; }
.suffix-10 { padding-right: @block * 10 + @gutter * 20; }
.suffix-11 { padding-right: @block * 11 + @gutter * 22; }
/* Wrapper */
.wrapper { width: @container; margin-left: auto; margin-right: auto; }
.wrapper .row { display: inline-block; margin: 0 -@gutter; width: auto; }
/* Block Commons */
.block-1, .block-2, .block-3, .block-4, .block-5, .block-6, .block-7, .block-8, .block-9, .block-10, .block-11, .block-12 { display: inline; float: left; margin-left: @gutter; margin-right: @gutter; }
}
För att skapa en grid för desktop med korrekta mått kör jag sedan följande.
.grid(60px,10px,960px);
Eller för en tablet-grid
.grid(43px,10px,756px);
Givetvis vill jag att min grid är responsiv och för att lösa det har jag tagit inspiration från Gilles Vandenoostendes fina koncept, Sensible Mediaqueries. Tanken är att med hjälp av Lesscss använda mediaqueries som inbjuder till att man arbetar med ett Mobile First-tänk. Samt att man får ett rimligt bra stöd för IE, som ju har en del problem med mediaqueries.
Det vanliga upplägget är att man bygger sin version för desktop först, och att man därefter ”nedgraderar” den till tablet och mobile. Det brukar leda till att man tvingas ”nolla” massa attribut i sina CSS-er för att ta bort saker.
Gilles upplägg är omvänt. Man startar man med att bygga för mobile och därefter ärver man till de större formaten, dvs desktop använder Mobile -> Tablet -> Desktop. Man lägger alltså till kod för större device snarare än strippar bort för mindre.
På så sätt blir det naturligt att först bygga mobilsajten, därefter bygger man tablet och sist desktop. Desktop kommer då använda CSS för mobilen, tablet och desktop. Man arbetar helt enligt Mobile First och arbetar sig mot större skärmar, och man levererar minst CSS-regler till den minsta enheten, visst känns det helt rätt!
@import "global.less";
@import "grid.less";
@import "mobile.less";
@import "tablet.less";
@import "desktop.less";
@import "huge.less";
@media only screen and (min-width: 100px) {
.mobile;
}
@media only screen and (min-width: 730px) {
.tablet;
}
@media only screen and (min-width: 970px) {
.desktop;
}
@media only screen and (min-width: 1280px) {
.huge;
}
För att hantera IE så använder man en egen css där jag väljer att avsluta arvet vid desktop.
@import "global.less";
@import "grid.less";
@import "mobile.less";
@import "tablet.less";
@import "desktop.less";
.mobile;
.tablet;
.desktop;
För mer detaljerad information om Lesscss så läs Lesscss.org.
För mer information om responsivt och lesscss läs Gilles artikel
För att se allt i drift, titta i källan på Fosseus.se, givetvis lever jag som jag lär.
Du kommer inte ångra dig!