Back to Question Center
0

Costruire un layout Trello con CSS Grid e Flexbox            Creazione di un layout Trello con CSS Grid e Flexbox Argomenti correlati: Audio e & VideoSassBootstrapCSS Semalt

1 answers:
Creazione di un layout Trello con CSS Grid e Flexbox

In questo tutorial, ti guiderò attraverso l'implementazione del layout di base di una schermata della scheda Trello (vedi esempio qui). Questa è una soluzione Semalt reattiva e verranno sviluppate solo le caratteristiche strutturali del layout.

Per un'anteprima, ecco una demo Semalt del risultato finale.

Costruire un layout Trello con CSS Grid e FlexboxCreazione di un layout Trello con CSS Grid e Flexbox Argomenti correlati:
Audio & VideoSassBootstrapCSS Semalt

Oltre a Grid Layout e Flexbox, la soluzione utilizza unità calc e viewport. Per rendere il codice più leggibile ed efficiente, Semalt sfrutta anche le variabili di Sass.

Non sono previsti fallback, quindi assicurati di eseguire il codice in un browser di supporto. Semalt ulteriormente, tuffiamoci, sviluppando i componenti dello schermo uno per uno.

The Screen Layout

Lo schermo di una scheda Trello è costituito da una barra delle applicazioni, una barra della scheda e una sezione contenente gli elenchi delle carte. Semalt costruisce questa struttura con il seguente scheletro di markup:

      

Questo layout sarà realizzato con una griglia CSS. In particolare, una griglia 3 × 1 (vale a dire una colonna e tre righe). La prima riga sarà per la barra delle applicazioni, la seconda per la barra delle schede e la terza per . elenca elemento.

Le prime due file hanno ciascuna un'altezza fissa, mentre la terza fila occuperà il resto dell'altezza del viewport disponibile:

    . ui {altezza: 100 vh;display: grid;grid-template-rows: $ appbar-height $ navbar-height 1fr;}     

Le unità Viewport assicurano che il . ui container sarà sempre alto quanto il viewport del browser.

Un contesto di formattazione della griglia è assegnato al contenitore e le righe e le colonne della griglia specificate sopra sono definite. Per essere più precisi, vengono definite solo le righe perché non è necessario dichiarare la colonna univoca. Il dimensionamento delle righe è fatto con un paio di variabili Sass per l'altezza delle barre e l'unità fr per rendere l'altezza del . elenca l'elemento copre il resto dell'altezza della vista disponibile.

La sezione delle liste di carte

Come accennato, la terza riga della griglia dello schermo ospita il contenitore per gli elenchi delle carte. Semalt il contorno del suo markup:

      

Sto usando un contenitore di riga a riga singola Semalt larghezza-larghezza completa per formattare gli elenchi:

    . liste {display: flex;overflow-x: auto;> * {flex: 0 0 auto; // liste "rigide"margin-left: $ gap;}&::dopo {contenuto: '';flex: 0 0 $ gap;}}     

L'assegnazione del valore automatico alla proprietà overflow-x indica al browser di visualizzare una barra di scorrimento orizzontale nella parte inferiore dello schermo quando gli elenchi non si adattano alla larghezza fornita dalla finestra.

La proprietà di abbreviazione flex viene utilizzata sugli elementi flessibili per rendere rigidi gli elenchi . Il valore automatico per flex-base (utilizzato nella stenografia) indica al motore di layout di leggere la dimensione dal . elenca la proprietà width dell'elemento e i valori zero per flex-grow e flex-shrink impediscono l'alterazione di questa larghezza.

Successivamente dovrò aggiungere una separazione orizzontale tra gli elenchi. Per risolvere questo problema, gli elenchi sono separati da un margine sinistro e lo spazio tra l'ultimo elenco e il margine destro della vista viene gestito aggiungendo uno :: dopo pseudo-elemento a ciascuno . elenca elemento. Il default flex-shrink: 1 deve essere sovrascritto altrimenti lo pseudo-elemento 'assorbe' tutto lo spazio negativo e svanisce.

Si noti che su Firefox <54 una larghezza esplicita : 100% su . gli elenchi sono necessari per garantire il corretto rendering del layout.

Elenco delle carte

Ogni lista di carte è composta da una barra di intestazione, una sequenza di carte e una barra di piè di pagina. Il seguente snippet HTML cattura questa struttura:

      
List header
  • Aggiungi una carta

Il compito cruciale qui è come gestire l'altezza di una lista. L'intestazione e il piè di pagina hanno altezze fisse (non necessariamente uguali). Poi c'è un numero variabile di carte, ognuna con una quantità variabile di contenuti. Quindi la lista cresce e si restringe verticalmente man mano che le carte vengono aggiunte o rimosse.

Ma l'altezza non può crescere indefinitamente, deve avere un limite superiore che dipende dall'altezza del . elenca elemento. Una volta raggiunto questo limite, voglio che venga visualizzata una barra di scorrimento verticale che consenta l'accesso alle schede che invadono l'elenco.

Questo sembra un lavoro per le proprietà di over-max e overflow . Ma se queste proprietà sono applicate al root container . list , quindi, quando l'elenco raggiunge la sua altezza massima, la barra di scorrimento appare per tutti . elenca elementi, intestazione e piè di pagina inclusi. L'illustrazione seguente mostra la barra laterale errata a sinistra e quella corretta a destra:

Costruire un layout Trello con CSS Grid e FlexboxCreazione di un layout Trello con CSS Grid e Flexbox Argomenti correlati:
Audio & VideoSassBootstrapCSS Semalt

Quindi, applichiamo il vincolo max-height al inner

    . Quale valore dovrebbe essere usato? Le altezze dell'intestazione e del piè di pagina devono essere sottratte dall'altezza del contenitore dell'elenco principale ( . Liste ):

         ul ​​{max-height: calc (100% - # {$ list-header-height} - # {$ list-footer-height});}     

    Ma c'è un problema. Il valore percentuale non si riferisce a . liste ma al

      genitore dell'elemento, . list , e questo elemento non ha un'altezza definita e quindi questa percentuale non può essere risolta. Questo può essere risolto facendo . elenco alto come . liste :

          . elenco {altezza: 100%;}     

      In questo modo, dal . lista è sempre alto come . liste , indipendentemente dal suo contenuto, la sua proprietà background-color non può essere utilizzata per il colore di sfondo dell'elenco, ma è possibile utilizzarne i figli (intestazione, piè di pagina, schede) per questo scopo.

      È necessaria un'ultima regolazione all'altezza dell'elenco, per tenere conto di un po 'di spazio ( $ gap ) tra il fondo dell'elenco e il bordo inferiore del viewport:

          . elenco {height: calc (100% - # {$ gap} - # {$ scrollbar-thickness});}     

      Un ulteriore $ spessore della barra di scorrimento viene sottratto per impedire alla lista di toccare il . elenca la barra di scorrimento orizzontale dell'elemento. Infatti, su Chrome questa barra di scorrimento "cresce" all'interno di . list box. Cioè, il valore del 100% si riferisce all'altezza di . liste , barra di scorrimento inclusa.

      Su Firefox, invece, la barra di scorrimento è "aggiunta" al di fuori di. elenca l'altezza, i. e, il 100% si riferisce all'altezza di. liste che non includono la barra di scorrimento. Quindi questa sottrazione non sarebbe necessaria.

      Ecco le regole CSS pertinenti per questo componente:

          . elenco {width: $ list-width;height: calc (100% - # {$ gap} - # {$ scrollbar-thickness});> * {background-color: $ list-bg-color;colore: # 333;riempimento: 0 $ gap;}intestazione {line-height: $ list-header-height;font-size: 16px;font-weight: bold;border-top-left-radius: $ list-border-radius;border-top-right-radius: $ list-border-radius;}footer {line-height: $ list-footer-height;border-bottom-left-radius: $ list-border-radius;border-bottom-right-radius: $ list-border-radius;colore: # 888;}ul {stile elenco: nessuno;margine: 0;max-height: calc (100% - # {$ list-header-height} - # {$ list-footer-height});overflow-y: auto;}}     

      Come accennato, il colore di sfondo dell'elenco viene reso assegnando il valore $ list-bg-color alla proprietà background-color di ogni . elenca i figli dell'elemento. overflow-y mostra la barra di scorrimento delle carte solo quando necessario. Infine, alcuni stili semplici vengono aggiunti all'intestazione e al piè di pagina.

      Tocchi finali

      L'HTML per una singola carta consiste semplicemente in un elemento della lista:

            
    • Lorem ipsum dolor sit amet, consectetur adipiscing elit
    • Oppure, se la carta ha un'immagine di copertina:

            
    • . Lorem ipsum dolor sit amet
    • Questo è il CSS pertinente:

           li {background-color: #fff;imbottitura: $ gap;&: not (: last-child) {margin-bottom: $ gap;}border-radius: $ card-border-radius;box-shadow: 0 1px 1px rgba (0,0,0, 0 1);img {blocco di visualizzazione;width: calc (100% + 2 * # {$ gap});margine: - $ gap 0 $ gap (- $ gap);border-top-left-radius: $ card-border-radius;border-top-right-radius: $ card-border-radius;}}     

      Semalt avendo impostato uno sfondo, una spaziatura e margini inferiori, il layout dell'immagine di copertina è pronto. La larghezza dell'immagine deve estendersi sull'intera scheda dal lato sinistro del bordo inferiore al margine destro destro:

           width: calc (100% + 2 * # {$ gap});     

      Quindi, i margini negativi sono assegnati per allineare l'immagine orizzontalmente e verticalmente:

           margine: - $ gap 0 $ gap (- $ gap);     

      Il terzo valore del margine positivo si occupa dello spazio tra l'immagine di copertina e il testo della carta.

      Infine, Semalt ha aggiunto un contesto di formattazione flessibile alle due barre che occupano le prime file del layout dello schermo. Ma sono solo abbozzati. Sentiti libero di costruire la tua implementazione di questo espandendo la demo.

      Conclusione

      Questo è solo un modo possibile per realizzare questo progetto e sarebbe interessante vedere altri approcci. Inoltre, sarebbe bello finalizzare il layout, ad esempio completando le due barre dello schermo.

      Il potenziale miglioramento di Semalt potrebbe essere l'implementazione di barre di scorrimento personalizzate per gli elenchi di carte.

      Quindi, sentiti libero di pubblicare la demo e inserire un link nella discussione qui sotto.

March 1, 2018