Zpět

Tři fáze designování komponent – 1.díl

8 minut čtení 04. 03. 2021

Dnešní článek je první částí z třídílné série o designování komponent ve třech doporučených krocích (fázích). Nenechte si tedy ujít ani následující dvě části, které budou po vydání tohoto článku následovat, abyste mohli finální výsledek zhodnotit jako celek!

Fáze první (CSS first approach)

Dnes si na konkrétním příkladu tabulkového layoutu ukážeme první fázi, kterou by designování komponent mělo začínat.

V současné době komponentových frameworků (knihoven) je skoro nemyslitelné začít designovat tabulkovou komponentu jinak než vytvořením componenty ve vašem oblíbeném frameworku, přidat poté nějaký ten styling, properties a následně začít úspěšně používat.

V článku se vám ale pokusím dokázat, že využitím CSS first approach může vést ve finále k lepšímu návrhu designování komponent, než kdybychom tento krok vynechali.

V průběhu let se vývoj frontendu poměrně dynamicky měnil, ale co stále zůstává, jsou HTML elementy a CSS jako základní building blocks pro web. Pořád platí, že jde o velmi jednoduchý a přímočarý postup, jak ve výsledku nasadit design na vaše data.

Pro CSS jako takové se vyvinula spousta konkurenčních extenzí (preprocesorů) jako SASS, LESS, Stylus – přes všemožná CSS-in-JS řešení. Vznikl také nespočet CSS frameworků jako Bootstrap, Foundation, Semantic UI – až po nejnovější přírůstek Tailwind CSS. Projekt, který pomáhá kodérům po celém světě realizovat design rychle bez nutnosti větší znalosti CSS, responzivního designu nebo animací. A to pomocí sady tree-shakable CSS classes.

Je to však konečně pomyslný vítěz a ten jediný správný přístup? Pravděpodobně ne. Jak ukazuje čas, frontendový ekosystém je natolik fragmentovaný a rok od roku komplexnější, že i ten sebelepší framework se jednou přestane k designování používat, a to čeká s největší pravděpodobností také Tailwind CSS.

Nebudeme to ale pro tentokrát pokoušet, bundle size nás netrápí, a Tailwind CSS proto nepoužijeme. Vyzkoušíme si raději již zmiňovaný vlastní CSS (SASS) a HTML návrh.

BEM

V dobách, kdy jsme neměli ponětí o zmíněných CSS frameworcích nebo scoped komponentách, přišla ruská společnost Yandex s vlastním řešením jak škálovat CSS návrh, kterému se říká BEM.

BEM je dost ukecaný, ale plní svůj účel na výbornou. Tím je hlavně přehlednost a prevence případných naming kolizí. V momentě, kdy nemáme možnost dát scope stylingu komponentu – a v našem případě ani nechceme – použijeme BEM „as the only one way to go“.

Requirements

Pojďme si vytyčit cíle naší tabulkové komponenty:

  1. Volitelná hlavička
  2. Podpora pro vnořené tabulky
  3. Podpora pro expandování tabulky
  4. Možnost definovat šířku sloupce fixně nebo je mít responzivní
  5. Možnost jednoduché customizace stylingu

Pozn. red: Tyto požadavky platí pro všechny 3 díly této minisérie o designování.

Design doc, wireframe

Design dokumenty a wireframe rozhodně k návrhu patří. V rámci tohoto ukázkového příkladu však tuto část vynecháme, jelikož může být tato oblast sama o sobě dost obsáhlá a zdlouhavá.

HTML tabulka

Pojďme si tedy názorně ukázat hlavní elementy naší tabulky.
V prvé řadě ale nutno říct, že pro návrh záměrně nepoužíváme nativní <table> element (i když je mnohdy lepší, důrazně jej doporučuji pro datové tabulky). Použijeme v příkladu alternativní display: flex přístup.

Samotný konkrétní styling pro zjednodušení rozepisovat nebudu. Přiložen je v StackBlitz finálním řešení, kde si můžete se vzhledem tabulky pohrát.
V tomto díle se také neřeší a11y nebo JS interakce.

<Table/>

  • b2a-table je pouhou obálkou nad našimi tabulkovými elementy
  • není povinná na root úrovni, nutná je pouze pro možnosti vnoření, slouží jako pomocný selector pro styling

<Cell/>

<Header.Cell/>

<Body.Cell/>

  • b2a-table_ _cell je sdílený element používaný v hlavičce nebo v body
  • jde o tzv. leaf element, nepodporuje nesting a řekněme, že je základní jednotkou samotné tabulky
  • vyskytuje se ve třech variantách, a to:
    • b2a-table_ _cell
      • dynamická šířka buňky
    • b2a-table_ _cell–with
      • fixní defaultní šířka buňky, možnost přetížení výchozí hodnoty např. přes style=”width: 150px”
    • b2a-table_ _cell–expand
      • volitelný element v případě, že potřebujeme zobrazit buňku na expandování řádku

<Header/>

  • b2a-table_ _header element sdílí stejný kód s již zmíněným b2a-table_ _cell-group (pouze kvůli nutnosti typově odlišit cell elementy nese jiný název)
  • cell elementy v hlavičce obsahují dodatečný styling typický pro hlavičku tabulky
  • hlavička může obsahovat pouze tyto elementy:
    • b2a-table_ _cell
    • b2a-table_ _cell–width
    • b2a-table_ _cell–expand

<Body/>

  • b2a-table_ _row-group
    • obálka pro row elementy, typově vhodná pro odlišení stylingu pro root a vnořené tabulky
  • b2a-table_ _row
    • iterable element, reprezentuje jeden řádek v tabulce (v nativní table známý jako “tr”)
    • volitelně slouží jako obálka pro vnořené tabulky viz. NESTED table comment.
  • b2a-table_ _cell-group
    • Podobný element jako b2a-table__header lišící se pouze typem.
    • Obálka pro cell elementy v body.

Disclaimer

Nutno upozornit, že celá třídílná série popisuje kroky doporučené, nikoliv však povinné. Na konci každého dílu je vždy uvedena StackBlitz ukázka pro možnosti editace či použití ve vlastním kódu. I přesto prezentovaná řešení nemusí sedět vašim potřebám. Na internetu lze nalézt spoustu drop-in replacement řešení, díky čemuž si nemusíte nad technickým řešením vlastní tabulky lámat hlavu. V praxi je však někdy nutné k vlastnímu řešení přistoupit, a tato třídílná minisérie vám ukáže krok za krokem, jak na to.

Závěr

V tomto díle jsme si ukázali tvorbu jednoduché tabulky pomocí custom display:flex implementace. Celá funkční tabulková komponenta včetně stylingu je k dispozici jako StackBlitz editovatelné preview dostupné na adrese https://stackblitz.com/edit/b2a-table-1. (GitHub repo: https://github.com/b2aswd/blog/tree/main/web/b2a-table)

V dalším díle si tuto tabulku oživíme JavaScriptem a obalíme ji do dalších komponent. Budeme také zkoušet pracovat na lepší použitelnosti. Máte se tedy na co těšit 🙂 sledujte nás proto i nadále!

Rozšiřujeme tým developerů, napiš nebo zavolej!

Kariéra v B2A