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:
Volitelná hlavička
Podpora pro vnořené tabulky
Podpora pro expandování tabulky
Možnost definovat šířku sloupce fixně nebo je mít responzivní
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!
Abychom poskytli co nejlepší služby, používáme k ukládání a/nebo přístupu k informacím o zařízení, technologie jako jsou soubory cookies. Souhlas s těmito technologiemi nám umožní zpracovávat údaje, jako je chování při procházení nebo jedinečná ID na tomto webu. Nesouhlas nebo odvolání souhlasu může nepříznivě ovlivnit určité vlastnosti a funkce.
Funkční
Vždy aktivní
Technické uložení nebo přístup je nezbytně nutný pro legitimní účel umožnění použití konkrétní služby, kterou si odběratel nebo uživatel výslovně vyžádal, nebo pouze za účelem provedení přenosu sdělení prostřednictvím sítě elektronických komunikací.
Předvolby
Technické uložení nebo přístup je nezbytný pro legitimní účel ukládání preferencí, které nejsou požadovány odběratelem nebo uživatelem.
Statistiky
Technické uložení nebo přístup, který se používá výhradně pro statistické účely.Technické uložení nebo přístup, který se používá výhradně pro anonymní statistické účely. Bez předvolání, dobrovolného plnění ze strany vašeho Poskytovatele internetových služeb nebo dalších záznamů od třetí strany nelze informace, uložené nebo získané pouze pro tento účel, obvykle použít k vaší identifikaci.
Marketing
Technické uložení nebo přístup je nutný k vytvoření uživatelských profilů za účelem zasílání reklamy nebo sledování uživatele na webových stránkách nebo několika webových stránkách pro podobné marketingové účely.