Vytvořte si moderní a responzivní rozvržení přístrojové desky pomocí mřížky CSS a Flexboxu

Nejprve si představíme základy mřížky CSS. Ty pak použijeme k vytvoření našeho základního rozvržení palubní desky. Poté prozkoumáme nastavení a strukturu našich vnitřních bloků obsahu, včetně některých bloků flexboxu. Nakonec si krátce povíme o zodpovědné mobilní odezvě a zároveň do naší boční navigace začleníme posuvné funkce vhodné pro mobilní zařízení. S čím budete odcházet? Boom-goes-the-dynamite dashboard, díky kterému vás budou mít lidé hodně rádi.

Poznámka: Budeme vytvářet zjednodušenou verzi výše uvedeného dashboardu, která používá stejné koncepty jako plná verze. Plná verze by tento článek hloupě prodloužila…

Nejdříve to nejdůležitější: naše základní rozvržení mřížky

Zkrátka a dobře vám rozeberu mřížku CSS. Potřebujeme hlavní kontejner mřížky a pak potřebujeme div (neboli sémantický prvek) pro každý prvek v kontejneru mřížky:

Naše základní celková struktura stránky ovládacího panelu

Pěkně jednoduchá struktura, že? Naše rozložení pomůže vytvořit toto okamžitě krásné plátno níže. Nebojte se, budeme přidávat další obsah.

Váš první zjednodušený, nenáročný layout dashboardu

Dále si stanovíme zákon… myslím CSS

Váš hlavní kontejner musí být definován jako display: grid;, aby skutečně fungovala jakákoli funkce mřížky. Dáme mu také výšku 100 %, abychom mu sdělili, že chceme, aby náš panel vyplnil celou stránku. A každému podřízenému kontejneru přiřadíme jméno, abychom mohli gridu říct, co s ním má dělat. Poté použijeme názvy k vytvoření struktury stránky v tabulkové deklaraci pomocí grid-template-areas:

Naše základní styly rozvržení mřížky ovládacího panelu

Náš konečný, responzivní ovládací panel bude vypadat takto:

Náš jednoduchý dashboard s responzivním vnitřním obsahem a posuvnou boční navigací

Vysvětlení mřížky-šablony-oblasti

V podstatě jsme každému z našich podřízených kontejnerů přiřadili jméno a pak je pomocí grid-template-areas hodili do formátu podobného tabulce. Mrtvolně jednoduché.

Máme celkem dva sloupce zleva doprava. První sloupec má šířku 250px (boční navigace) a druhý 1fr, tedy zlomek. To znamená, že bude zabírat zbývající místo v kontejneru po vykreslení prvního sloupce.

Dále deklarujeme celkem tři řádky. Řádky plynou shora dolů. Takže počínaje horním řádkem máme prvek <header>, který je vysoký 50px. Poté deklarujeme obsahovou oblast <main>, která má výšku 1fr. To znamená, že se po vykreslení explicitně deklarovaných výšek vertikálně roztáhne tak, aby vyplnila zbývající prostor okna. Nakonec deklarujeme naši oblast <footer>, která má rovněž výšku 50px.

Přidání záhlaví a zápatí

Jak <header>, tak<footer> budou flex kontejnery s flex roztečí a zarovnáním:

Naše nastavení záhlaví a zápatí dashboardu

Pomocí justify-content: space-between; roztáhneme první a poslední prvek tak, aby se roztáhly na oba konce svého kontejneru. Je to tak snadné ve srovnání se starými školními pokyny float. A díky align-items: center; máme naše prvky dokonale zarovnané, aniž bychom se museli spoléhat na padding apod. pro vycentrování.

Krátká poznámka k naší podivně vypadající syntaxi tříd CSS: používáme CSS ve stylu BEM (block-element-modifier), který doporučuji kvůli škálovatelnosti a čitelnosti. Doporučuje se vyhnout se hrubým html selektorům značek.

Přidání elementu side nav

Pro obsah side nav použijeme tradiční elementy <ul> a <li>. Kvůli dobré sémantice html a čitelnosti pro člověka je doporučuji používat raději než <div> nebo jiné elementy. O něco níže přidáme do naší boční navigace posuvnou funkci vhodnou pro mobilní zařízení:

Základní struktura naší boční navigace dashboardu

Přidání prvního elementu <hlavní> sekce

Tento je přímočarý a jednoduchý. Další kontejner flex:

Náš první prvek sekce <main>

Teď to začne být zajímavé… úvodní karty responzivní mřížky

Toto je jedna z mých nejoblíbenějších částí našeho panelu, protože můžeme využít super efektivní a elegantní řešení mřížky. Podívejte se znovu na dříve poskytnutou animaci ovládacího panelu. Všimněte si, jak se tyto šedé karty chovají při změně obrazovky? Naše karty si úžasně zachovávají konzistentní šířku žlábku mezi sebou, mají konzistentní obtékání, a když nemůžeme vyplnit celý řádek, naše obtékaná karta přesně odpovídá výšce a šířce karty nad ní, přičemž s ní zůstává zarovnaná. Toho je velmi náročné a zdlouhavé dosáhnout bez metody, kterou vám právě ukážu:

Velmi pěkné, responzivní přehledové karty s mřížkou

Vidíte, jak jsme pro ně použili kontejner mřížky, který je uvnitř našeho hlavního kontejneru mřížky stránky, že? Udělali jsme to proto, že je to nejjednodušší a nejelegantnější řešení, které lze použít pro potřebnou responzivitu položek karet. Náš pokyn repeat(auto-fit, minmax(265px, 1fr) se postará o několik zásadních překážek:

  1. Pokud karty přesáhnou šířku 265px, zabalí se do dalšího řádku.
  2. Pokud karty přesáhnou šířku 265px, roztáhnou se tak, aby zabraly zbývající dostupnou šířku kontejneru.
  3. Pokud se karty zabalí do nového řádku (auto-fit), zarovnají se zleva doprava s kartami nad nimi a přizpůsobí se jejich šířce! A navíc získáte vestavěnou responzivitu bez jakýchkoli dotazů na média!

Použití metody sloupce repeat je také fantastický způsob, jak vytvořit krásné, responzivní galerie obrázků, a to i s obrázky různých velikostí. Pomocí instrukce grid-auto-flow: dense; máte dokonce přístup k dynamickým balicím algoritmům. Tím zabráníte vzniku prázdných míst v řádcích kvůli různým výškám obrázků. Aby však tato metoda fungovala, musí se vzájemně škálovat v relativních jednotkách fr, a proto ji pro naše karty uvedené níže nepoužijeme.

Přidání kontejnerů s hlavním obsahem

Naše karty palubní desky s dynamickými výškami

Tato část má také zajímavý zvrat. Tyto karty budou obsahovat hlavní položky obsahu vašeho ovládacího panelu a jejich výška se bude navzájem lišit díky jejich dynamickému obsahu. Ve většině typických rozhraní byste chtěli, aby podobně zaměřené karty na stejném řádku měly stejnou jednotnou výšku a šířku. A toho byste dosáhli tak, že byste každé kartě přiřadili hodnotu flex: 1;, takže by rostly tak, aby odpovídaly nejvyšší kartě.

V našem případě však nechceme nutit tyto karty, aby se vzájemně výškově shodovaly, protože jejich obsahové předměty se budou lišit. Aby přirozeně plynuly ve dvou sloupcích, použijeme k tomu speciální vlastnost CSS, column-count:

Karty s hlavním obsahem dashboardu

Použití column-count zajistí, že se náš obsah uvnitř části main-cards rozdělí do dvou sloupců. Zároveň použijeme mezeru mezi kartami pomocí column-gap. To je velmi podobné jako u našich přehledových karet, kde jsme použili grid-gap.

Důvod, proč jsme pro tuto sekci nepoužili display: grid;, je ten, že naše výšky jednotlivých karet jsou dynamické. Chceme, aby přirozeně splývaly do dvou sloupců, a přitom jsme dodržovali jejich různé výšky. Díky této metodě také nemusíme používat tradiční mřížku float, která by nás nutila počítat procentuální šířky, žlaby a speciální pravidla pro okraje prvních a posledních podřízených prvků.

Také jsme použili column-break-inside: avoid;, abychom zajistili, že se obsah každé karty nerozdělí.column-count ve skutečnosti rozdělí obsah každého prvku tak, aby oba řádky měly stejnou výšku, což nechceme.

Krátká poznámka k zodpovědné mobilní responzivitě

Podívejte se znovu na responzivní video v horní části článku. Vidíte, jak se část main-cards s přiblížením k obrazovkám o velikosti tabletu mění v jeden sloupec? A vidíte, jak na obrazovkách velikosti mobilu mizí postranní navigace? Pro tuto responzivitu bychom měli naše CSS skutečně psát ve formátu mobile-first.

To znamená, že naše počáteční CSS by mělo být přívětivé pro mobilní zařízení. Poté, jak se zvětšuje velikost naší obrazovky, pozorujeme styly pro větší obrazovky pomocí gradujících min-width media queries. To je lepší postup než přepisování desktopových stylů pomocí max-width media queries, protože tento přístup může vést k některým bolestem hlavy:

Graduating min-width media queries

Vytvoření naší postranní navigace posuvné na mobilních zařízeních

Naše práce není skutečně dokončena, dokud nezajistíme, aby byla postranní navigace použitelná i na mobilních zařízeních. Musíme:

  1. Přidat naši ikonu menu a ikonu zavření.
  2. Přidat nějaké responzivní přechody pro posuvnou akci.
  3. Napsat nějaký JavaScript, aby naše kliknutí aktivovalo boční navigaci.

Pro naše ikony použijeme knihovnu Font Awesome a zapojíme jQuery pro snadnou manipulaci s DOM (viz codepen pro odkaz).

Ikona hlavní nabídky a ikona zavření boční navigace pro mobilní zařízení

Následující aktualizace CSS zahrne nové ikony a dodá naší boční navigaci posuvné přechody. Opět použijeme gradující dotazy na média:

Styl pro mobilní zařízení pro naši boční navigaci a ikony menu

Nakonec musíme napsat nějaký JavaScript, aby naše klikání fungovalo. Funkce posouvání se dosáhne přepínáním názvu třídy .active, čímž se aktualizuje instrukce transform: translateX();. Nezapomeňte před koncovou značku </body> přidat odkaz na CDN jQuery:

Jazyk JavaScript, který zajistí, aby se naše boční navigace posouvala

Teď byste měli mít plně responzivní boční navigaci. Zmenšete okno, dokud nebude mít mobilní velikost. Mělo by se skrýt a měla by se zobrazit ikona nabídky. Klikněte na ni a boční navigace by se měla posunout do zobrazení. Klikněte na ikonu zavřít a boční navigace by se měla opět zavřít. Pěkně šikovné, co říkáte? A to jste si mysleli, že to nejde…