Moje dobre praktyki – CSS

1. Wstęp

CSS jest dziś niedoceniany. Między programistami Angulara/Reacta/Vue/... a projektantami UI zieje przepaść.

Projektant UI zagnieżdża trzydzieści <div> i nakłada na nie czterdzieści klas CSS, a programista Angulara co dwa tygodnie podnieca się najnowszą biblioteką, podczas gdy jego dependency hell już dawno nie buduje się bez npm i --force, bo peer dependencies wchodzą sobie w konflikt. CSS i HTML mało obchodzą fanatyka TypeScriptu. Nawet do najprostszych pól formularza musi użyć Materiala, bo boi się, że inaczej nie ogarnie walidacji. A już na pewno nie chce tracić czasu na wymyślanie koła na nowo. Że przy pierwszym wymaganiu, którego biblioteka nie obsługuje, i tak straci cały zaoszczędzony czas i skończy na czytaniu issues tej biblioteki na GitHubie – tego sobie nie uświadamia.

Jako programista w projekcie fullstackowym rzadko masz okazję wykazać się umiejętnościami frontendowego projektanta. Dostajesz makiety ekranów w Figmie i musisz je odwzorować co do piksela. Większość takich frontendowców nawet nie wie, że responsywny layout da się zrobić jedną linijką CSS. CSS jest potężniejszy niż kiedykolwiek. Minęły czasy hacków stylów w JS, niezliczonych media queries i obejść dla IE 8. Hurra!

2. Idealnie wyśrodkowane

Na rozmowach rekrutacyjnych nie zawsze to dobrze wypadało, ale sam miałem z tego frajdę: na pytanie, czy dobrze radzę sobie z frontendem, chętnie odpowiadałem: „O tak. Potrafię wyśrodkować <div> w pionie”.

Wyśrodkowanie diva jest notorycznie trudne.

Już nie:

:)
.parent {
    display: grid;
    place-items: center
}

3. Responsywny Grid

1
2
3
4
.parent {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

4. Responsywny Flexbox

1
2
3
.parent {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}

.box {
    flex: 1 1 150px; /*  Stretching: */
    flex: 0 1 150px; /*  No stretching: */
    margin: 5px;
}

5. Układ strony

Nagłówek
Treść
Stopka
.parent {
    display: grid;
    grid-template-rows: auto 1fr auto;
}

6. Pasek boczny

Min. 150px / maks. 25%
Ten element zajmuje drugą pozycję w siatce (1fr), czyli wypełnia całą pozostałą przestrzeń.
.parent {
    display: grid;
    grid-template-columns: minmax(150px, 25%) 1fr;
}

7. Źródła

1-Line Layouts