Förstå CSS-statistik Hur man får mest ut av numren

Om du inte märkte, fick CSS analys webbplats cssstats.com nyligen en översyn. Det är ett vackert utformat verktyg som ger dig mycket objektiv inblick i din kod, men hur kan du göra den bästa användningen av CSS-statistiken? Vad ska du skjuta för? Vad menar de, och hur kan du använda dem dag-till-dag?

Idag ska vi prata om CSS bästa praxis, specificitet och underhåll, plus du lär dig hur du korrekt tolkar och utnyttjar CSS-statistiken bättre. Låt oss dyka in!

Snabbstartguide till CSS-statistik

Huvud på över till cssstats.com, ange antingen webbadressen till din webbplats, dess stylesheet eller klistra in den råa CSS direkt i textområdet längst ner och träffa .

När du har analyserat, får du massor av statistik om CSS; från antalet använda regler, deras genomsnittliga storlek, uppdelningar av varje typ av deklaration, typsnitt och bakgrundsfärger, typfamiljer och storlekar och specificitetsgrafer.

Det är vad CSS-statistik ger dig, nu ska vi titta på vad vi kan göra med all data.

Fokusera på Underhållbarhet

Som front-end-utvecklare är vi ständigt oroade över prestanda och användarupplevelse. Vi är också ansvariga för att bygga programvara, men ordet "programvara" är främmande för många front-end-utvecklare som kommer från en designbakgrund. Det är ofta lätt att ignorera bästa praxis när vi kodar vår CSS.

Men sanningen är att front-end-utveckling, precis som vilken som helst annan mjukvaruutveckling, kräver att man fokuserar på bästa praxis. Reglerna för bästa praxis diskuteras rikligt på webben, men för den här artikelns skull kommer vi att fästa in på vad som förmodligen är den viktigaste praxisen när det gäller CSS: maintainability.

Hållbarheten hos CSS centrerar på många olika aspekter.

  • Hur enkelt kan du utforma en viss modul?
  • Hur lätt kan du designa en modifierad version av den modulen?
  • Kan en ny utvecklare helt förstå de system som din CSS använder?
  • Är din CSS förutsägbar, konsekvent och organiserad?
  • Är du beroende av en förprocessor (eller ett annat verktyg) för att göra utveckling och segmentering mer flexibel?
  • Repeterar du dig ofta?
  • Använder du tidigare etablerade namn- och stilkonventioner?

Vi kommer inte att dyka in i var och en av dessa objekt individuellt, men när vi pratar om underhållbarhet påverkar var och en av dessa överväganden den totala underhållsförmågan för din kodbas.

Så vad säger dessa statistik om underhållsförmåga?

Ärligt svar? Ingenting, nödvändigtvis. Du lär dig inte något om underhållsförmåga genom att bara titta på CSS-statistiken. Du måste också förstå sammanhanget för den specifika CSS, liksom kontexten för aktiv utveckling.

Det första sättet att analysera din CSS-statistik är att leta efter tecken på CSS bloat.

Svälla

Av svälla vi menar oanvänd, överflödig eller på annat sätt onödig CSS.

Vilken skala av webbplats laddar CSS?

Låt oss exempelvis ta ett ensidigt program som har fem olika innehållsmoduler. Vilken typ av CSS-statistik skulle du förvänta dig att en enda sida skulle ha? En typisk enkeltsidesapplikation kan ha en bråkdel av antalet CSS-regler och kanske hälften av antalet färgdeklarationer som en stor nyhetspubliceringssida eller en mångfacetterad SAAS-applikation.

Om du ser ett enormt antal selektörer (till exempel om din enkla enkelsidiga webbplats innehåller så mycket CSS som ett webbramverk som Bootstrap, som klickar på knappt 2400 selektörer) är det troligt att du har gått fel någonstans . Om du laddar i 30 teckenstorlekar och din design kräver 10, är ​​det troligt att du har oanvända, uppblåsta stilar eller eventuellt inkonsekventa stilar.

Ett eventuellt undantag från denna regel, när det gäller hållbarhet, är om du är faktiskt med Bootstrap eller annan populär, väl dokumenterad ram Eftersom dokumentationen på dessa projekt är relativt djup och användningen har mättat på webben, behöver inte utvecklare av framsidan nödvändigtvis upprätthålla Bootstrap, så länge som den primära källan bibehåller Bootstraps kärnanpassningar. Om du däremot inkluderar Bootstrap-ramverket helt enkelt för rutnätet eller några UI-element, borde du istället bygga en anpassad version som inte innehåller den extra CSS som du aldrig planerar att använda.

Vilka typer av sidor laddar webbplatsen?

Det är möjligt att din ansökan gör något som kräver ett stort antal väljare, färger eller teckenstorlekar. Om du till exempel kör en webbutik som använder produktfärger är det möjligt att ett stort antal färger kan dyka upp i din CSS och vara ett helt legitimt fall. Ett annat exempel är om du kör en webbplats som tillåter användare att välja från en lista med teckensnittstorlekar och teckensnitt för innehåll de skapar. I dessa exempel är det meningsfullt att se stora siffror i de specifika kategorierna.

Medium.com använder en fontstorlek på 301px någonstans ...

Om du skapar något som till exempel en blogg med ett begränsat färgschema, bör dina CSS-statistik återspegla det val av färgval och typsnitt som deklarerar.

Redundans mellan regler

Definierar du samma typsnittstyp tjugo gånger över din CSS? Mycket ofta kan detta undvikas, och är vanligtvis ett resultat av brist på planering. Om du bestämmer dina teckenstorlekar innan du skriver någon annan CSS, kommer du lättare att kunna tillämpa dessa storlekar över resten av systemet.

Detsamma gäller för någon upprepad stil; om du befinner dig att skriva samma sak flera gånger, förtjänar den uppsättningen stilar för egen presentation eller semantisk klass eller annan modulär definition?

Gå inte överbord här; omdefiniera några teckenstorlekar eller bakgrundsfärger är inte en stor sak. Men omdefiniera ett antal stilar flera gånger på mycket liknande moduler kan innebära att du borde förlänga en basklass. Om du till exempel har en knappklass:

.btn font-size: 1.2em; font-vikt: 400; brevavstånd: .06em; färg: #fff; bakgrundsfärg: # 4a4a4a; vaddering: 6px 8px; 

Säg att du vill ha en blå version av samma knapp. Hur ska du gå om att definiera det? Om du omdefinierar detsamma BTN klass skulle det se ut så här:

.btn-blå font-size: 1.2em; font-vikt: 400; brevavstånd: .06em; färg: #fff; bakgrundsfärg: # 0C508D; vaddering: 6px 8px; 

Självklart finns det många problem med detta. För det första strider det mot principen DRY (repetera inte). Men varför spelar det roll? underhåll. Låt oss exempelvis säga att designen ändras och kräver en mindre typsnitt på knappar. Då måste du gå in i .BTNoch de .BTN-blue klass för att ändra teckenstorleken. Ännu mer komplikation uppstår när du behöver varianter av de blå och vanliga grå knapparna, som en blå version. Alla dina ändringar till någon knapp måste göras på många knappar.

Detta är otroligt ineffektivt. Istället borde du dra nytta av det faktum att klasserna är modulära och låter dig definiera knappstilar som utökar din bas .BTN klass.

.btn font-size: 1.2em; font-vikt: 400; brevavstånd: .06em; färg: #fff; bakgrundsfärg: # 4a4a4a; vaddering: 6px 8px;  .btn.btn-blue background-color: # 0C508D; 

A ha! Och nu har vi en mycket mer underhållbar lösning, som också tar bort ett betydande antal rader av CSS och följer DRY-principen.

specificitet

Specificitet är en av de svårare att förstå mörka hörn av CSS som ofta går upp även de mest erfarna utvecklarna. På CSS-statistik kan du se ett specificitetsschema som visar hur specifika selektorerna är i din CSS, samt där de väljare ser upp.

CSS-specificitet från BBC: s webbplats

Denna graf visar specificiteten hos väljare som de upplever i CSS från bbc.co.uk. Tänk dig att vänster om diagrammet är toppen av stilarket, då rör det sig längs x-axeln som det läser ner stilarket. Ju mer specifika regeln är desto högre är den mörkblå linjen på y-axeln

Specificitet tommelfingerregel

Vi ska ge tre allmänna "tumregler" att börja med och förklara sedan reglerna.

  1. Gå från mindre specifika till mer specifika
  2. Skjut för lägsta möjliga genomsnittliga specificitet
  3. Minska topparna i diagrammet

Vi pratar om vart och ett av dessa mer djupt, men först låt oss prata lite om hur specificitet fungerar.

CSS-selektorer tilldelas en specificitetspoäng för att informera webbläsarens återgivningsmotor vilka regler gäller för vilka element. Anledningen till att detta behövs är också orsaken till att CSS är så kraftfull: stilar kan vara ärftliga och kaskad i CSS. Det betyder att du kan tillämpa mer än en uppsättning stilar på ett visst element. Återgivningsmotorn måste konsolidera alla dessa regler och presentera något, men vad händer när två olika värden är inställda för samma stildeklaration? Till exempel:

en färg: #fff;  a.knapp färg: # 000; 

När CSS-motorn möter en  tagg med en klass av knapp, Det måste avgöra om Färg attribut ska vara #fff# 000, eller webbläsarens standard. CSS-specificitet är den regelsätt som webbläsaren använder för att bestämma denna.

Points

Så hur fungerar specificitet? Använd detta poängsystem som en guide, taget direkt från CSS Tricks:

Observera att i det här poängsystemet, när något går över 10, går det inte in i nästa kolumn, så till exempel om du hade en väljare som var 11 element lång så skulle det inte spillas över för att vara en specificitet på 0, 0,1,1. Det skulle istället vara 0,0,0,11.

Här är några väljare och deras resultat.

nav li a  / * 0,0,0,3 * / .nav-item  / * 0,0,1,0 * / nav.nav-item  / * 0,0,1,1 * / #logo  / * 0,1,0,0 * /
 
en bakgrundsfärg: blå! viktig;  / * I föregående exempel använde vi inline-stilar för att ställa in bakgrundsfärgen till röd. Om vi ​​tillämpade den här stilen med den viktiga kvalifikationen, skulle den dock åsidosätta inline-stilen. * /

Okej - nu när vi har en grundläggande primer ur vägen för CSS-specificitet, hur ska det påverka vår kod? Låt oss gå tillbaka till våra tre tumregler för CSS-specificitet.

# 1 Gå från mindre specifika till mer specifika 

Denna regel säger i huvudsak att allmänna väljare ska vara i början av din CSS, och mer specifika väljare bör komma senare i din CSS. Anledningen till denna regel är många.

Först ställer du allmänna steg i början av din ansökan vanligtvis scenen i din kod för grundläggande moduler som ska skapas. I samband med # 2 har de minst specifika stilar i början att du skriver med minst specificitet möjligt först. Senare, när din kod utvecklas kan det vara nödvändigt att lägga till mer specifika stilar för att åsidosätta eller utöka tidigare stilar.

Styles på Apples hemsida är mycket specifika tidigt i stilarketDen rena CSS-ramens specificitet ökar i allmänhet mot slutet av stilarket

Detta leder till vår andra punkt: vad händer när CSS-återgivningsmotorn möter två väljare som har samma poäng? Det måste fortfarande välja, så det kommer att välja den senare av de två reglerna. Genom att erra till minst specifikt i början av filen ser du till att dina specificitetsöverträdelser är mer specifika när du går senare i filen. Det innebär att en enda klass senare i filen bör anses kunna överväga enskilda klasser tidigare i filen.

Denna praxis kommer att se till att senare utveckling på samma projekt snabbt kan förstå kaskadsystemet.

# 2 Skjut för lägsta möjliga genomsnittliga specificitet 

Om du har varit en front-end-utvecklare för länge har du förmodligen upplevt "CSS-specificitetskriget". Du skriver en väljare och några regler, uppdatera sedan bara webbläsaren för att hitta ändringarna inte har tillämpats. Du vet från tidigare projekt eller från konversationer om specificitet att det beror på att din väljare inte är tillräckligt specifik, så istället för att försöka spåra problemet till den väljare som är för specifik, bestämmer du dig för att göra den nya Mer specifik. Du lägger till ett ID eller två, och om det inte gör tricket, kastar du bara !Viktig på det. Och, voila - dina stilar visas.

Denna metod fungerar tekniskt sett. men tyvärr, helst du vill utvidga den stilen, måste du fortsätta att öka komplexiteten, och innan du vet är dina selektorer ytterst specifikt, och du måste upprepa kod snarare än att bara återanvända klasser. Utöver det är det nästan omöjligt att bestämma exakt vilken nivå av specificitet några nya stilar borde ha utan att lägga till fler och fler ID och !Viktig deklarationer.

Att hålla dina väljare mindre specifika är ett mycket saner, mer underhållbart sätt att hantera din CSS.

Några pro tips:

  • Som standard föredrar du klasser över ID-skivor. Denna praxis löser mest specificitetsproblem i ett steg.
  • Näs inte dina valörer längre än tre eller fyra nivåer djupt och var säker på att du behöver att bo. Nesting bör endast inträffa vid förlängning av tidigare definierade klasser, och bör inte användas enbart för kodorganisation. Nesting kan användas för framtidsbeständig dina klassdefinitioner, men återanvändbara klasser ska användas där det är möjligt.

# 3 Minska topparna i diagrammet 

Denna regel är i första hand på plats för att undvika otroligt placerade regler. Om du till exempel definierar vissa klasser för textpresentation och plötsligt har en regel som hyllar sex klasser och ett ID, bör den specifika regeln placeras kontextuellt med mer specifika väljare, den är relaterad till.

Slutsats

CSS-statistiken kan ge dig inblick i hur din CSS skrivs, men det här är bara användbart om du har en uppfattning om vad den statistiken ska se ut innan du försöker analysera dem. Detta innebär att du har en djup kontextuell förståelse för hur din CSS skrivs och varför. Om din CSS är underhållbar och lämplig för den webbplats den används på, är statistiken för den CSS inte tillräckligt för att refactor din kod. 

I stället för att följa numren regler blint, som ansvarig front-end-utvecklare, bör du fokusera på att göra din kod underhållbar och minska uppblåsthet. Statistik om din kod kan hjälpa dig att hitta problemområden, men de kan bara gå så långt.

Vidare läsning

  • Specificitetsgrafen av Harry Roberts
  • CSS: Specificity Wars (en klassiker) av Andy Clarke
  • Specificitet på MDN
  • Specifikationer för CSS-specificitet av Chris Coyier
  • cssstats.com