Lösa problem med CSS-nätet och Flexbox Kort-gränssnittet

Kortmönstret har haft stor framgång de senaste tiderna, men sättet att bygga dem är fortfarande begränsat på grund av CSS tillgängligt för oss. Hittills är det det. Genom att kombinera CSS Grid och Flexbox kan vi göra kort som stämmer snyggt, beter sig responsivt och vilka anpassar sig till innehållet inom dem. Låt oss se hur!

Vad vi ska bygga

Vi kommer att bygga detta kort-användargränssnitt (kolla in hela sidversionen för en tydligare idé):

Vid olika brytpunkter ändras kortarrangemanget enligt följande:

1: liten, 2: medium, 3: stor viewport

CSS Grid vs Flexbox

När Flexbox träffade CSS-scenen kunde glädje höras över hela världen. äntligen hade vi en layout modul för att lösa alla våra float frustrationer. Men det var inte så. Flexbox fungerar bäst för att fördela element längs en enda axel; antingen horisontellt längs en rad, eller vertikalt som en kolumn. Att bygga ett riktigt flytande nät med Flexbox är svårt.

Rutnät, dock, är avsedd att lägga ut element över två axlar (eller dimensioner); vågrätt och vertikalt. I denna handledning kommer vi att använda var och en för det ändamål den var avsedd att ge oss en riktigt solid lösning. Låt oss börja!

Inspiration

Nyligen bbc.co.uk lanserade (i beta) deras senaste iteration, går rent och rymligt med deras kort UI. Ignorera de eländiga rubrikerna, det ser bra ut.

De bästa korten är byggda och inriktade över raden med Flexbox, men vi kommer att expandera på layouten med hjälp av Grid.

Notera: För att följa med behöver du en webbläsare som stöder Grid. Här är lite info för att komma igång.

Vårt kort Markup

Låt oss börja med ett omslag för vårt nät

, några rutnät för att ordna allt
, och några ankare (varje ankare blir ett kort):

 

Placera så många kort som du vill, vi använder sju. Var och en har en miniatyrbild

som vi kommer att ge en bakgrundsbild senare. Då finns det en
, som i sin tur rymmer en

, en för författaren, och kanske även en

för lite mer information.

Grid Basics

Låt oss nu sparka av några stilar genom att ordna varje av dessa objekt i ett rutnät. 

Notera: Om det här är din första fördämning i "Grid" kanske du vill få fart genom att läsa de första handledningarna i Förstå CSS Grid Layout.

Vi kommer att gå mobila först här, så de första stilarna ger vår förpackning en bredd och centrerar den och ställer sedan in några Grid-regler:

.band bredd: 90%; maxbredd: 1240px; marginal: 0 auto; display: rutnät; rutmall-kolumner: 1fr; rutnät-rader: auto; gallergap: 20px; 

Viktigast, här säger vi att vår .band kommer vara display: rutnät;. Vi förklara sedan grid-template-kolonner av 1fr, som säger att varje kolumn kommer att ta upp en enda del av de tillgängliga. Vi har bara förklarat en för nu, så varje kolumn fyller hela bredden.

Då säger vi rutnät-rader: auto;. Detta är faktiskt standardvärdet, så vi kunde ha utelämnat det, och innebär att raden höjder kommer att bestämmas rent av innehållet.

Slutligen definierar vi en grid-gap av 20px, vilket ger oss våra kolonn- och radrännor.

Media Query Numero Uno

På bredare visningar (500px är helt godtyckligt), ändrar vi grid-template-kolonner att ge oss ett möjligt två kort per rad. Nu finns det två kolumner, var och en är en av de tillgängliga två fraktionerna.

@media bara skärm och (minbredd: 500px) .band grid-mall-kolumner: 1fr 1fr; 

Media Query Numero Dos

Slutligen, för större skärmar går vi med en fyra kolumnlayout.

@media bara skärm och (min bredd: 850px) .band grid-mall-kolumner: 1fr 1fr 1fr 1fr; 

Här kunde vi lika ha skrivit upprepa (4, 1fr) istället för 1fr 1fr 1fr 1fr. För mer information om hur fr enhet fungerar, kolla in CSS Grid Layout: Fluid Columns och Better Gutters.

Så vad har det gett oss?

Styling korten

Det har gett oss en ganska solid rutnätlayout, och om du är en fan av brutalism kanske du vill behålla saker som denna, men för alla andra låter vi göra våra kort ser lite mer ut som kort.

Vi börjar med detta:

.kort bakgrund: vit; text-dekoration: ingen; färg: # 444; boxskugga: 0 2px 5px rgba (0,0,0,0,1); display: flex; flex-riktning: kolumn; minhöjd: 100%; 

Detta ger oss några grundläggande stilar: en vit bakgrund, ingen undertext för texten, en grå färg och en snygg box-shadow att ge oss lite djup.

Därefter förklarar vi kortet för att vara display: flex;. Detta är viktigt - vi anpassar innehållet på kortet vertikalt med hjälp av Flexbox. Därför anger vi också flex-riktning: kolumn; att ge oss vår vertikala axel. Slutligen förklarar vi minhöjd: 100%; så att alla korten fyller höjden på föräldern (vårt objekt). Bra jobbat! Det ger oss detta:

Hover State

Låt oss göra några andra förbättringar innan du dyker längre in i Flexbox. Lägg till en position: relativ; och a övergång så att vi kan flytta kortet på svävaren:

 position: relativ; topp: 0; övergång: alla .1s enkelt in;

Lyft sedan kortet på svävaren och gör skuggan mer uttalad:

.kort: svävar topp: -2px; boxskugga: 0 4px 5px rgba (0,0,0,0,2); 

Typografi

Nu lägger vi till några allmänna stilar för typografi för att ändra färgerna och avståndet.

.kortartikel vaddering: 20px;  / * typografi * / .card h1 font-size: 20px; marginal: 0; färg: # 333;  .card p linjehöjd: 1,4;  .card span font-size: 12px; font-weight: bold; färg: # 999; text-transform: stor bokstav; brevavstånd: .05em; marginal: 2em 0 0 0; 

Här är vad du borde ha:

miniatyrer

Varje miniatyrbild kommer att appliceras som en bakgrundsbild, så vi lägger till lite markering över hela linjen, så här:

Nu ska vi se till att .tumme divs har några dimensioner, och att bakgrundsbilderna fyller dem ordentligt:

.kort .thumb padding-bottom: 60%; bakgrundsstorlek: omslag; bakgrundsställning: center center; 

Bra jobb, det ger oss det här:

Flexbox Artikel

Nu vill vi att författarnamnet ska anpassas längst ner på kortet, oavsett hur mycket innehåll det finns ovanför det. Här kommer Flexbox igen:

.kortartikel vaddering: 20px; flex: 1; display: flex; flex-riktning: kolumn; motivera innehåll: mellanslag mellan; 

Vi använder stenografi flex: 1; att ange att detta flex-objekt (det är fortfarande ett barn i den ursprungliga flexbehållaren) borde växa för att ta upp allt ledigt utrymme.

Då förklara vi att artikeln är en flexbehållare i sin egen rätt, och vi förklarar igen flex-riktning: kolumn; att ge oss vertikal fördelning. Slutligen, motivera innehåll: mellanslag mellan; säger att alla flex-objekt inom den ska sprida sig jämnt längs axeln, med lika avstånd mellan.

Det är allt bra, men det ger oss dessa konstiga, vandrande punkter i mitten av våra kort.

För att anpassa dessa ordentligt, låt oss lägga till flex-grow: 1; (eller bara flex: 1;) till dem, så de fyller hela det återstående vertikala utrymmet och anpassar sig snyggt till toppen.

.kort p flex: 1; / * gör p växa för att fylla tillgängligt utrymme * / linjehöjd: 1,4; 

Bättre!

Ändra rutnätet

Vid den här tiden är vi ganska mycket insvept, men det enda som Grid tillåter oss att göra nu är att helt ändra layouten genom att placera våra rutnät varhelst vi vill, och i vilken storlek som helst. För denna demo ville vi göra det allra första kortet (låt oss kalla det vårt "utvalda kort") två kolumner breda för något annat än de minsta visningarna.

I vår första mediefråga, låt oss göra det här:

@media only screen och (minbredd: 500px) ... item-1 rutnät-kolumn: 1 / span 2; 

Harking tillbaka till vår inledande handledning om rutnätområden, här säger vi att, förutom 500px, bör det första objektet börja på raden 1 och spänna över två spår. Resten av rutnätet faller automatiskt på plats.

Inom samma mediasökning har jag också stött på textstorlek av rubriken i vårt utvalda kort.

Slutsats

Detta har varit en bra övning i att använda Grid with Flexbox; Grid hanterade vår huvudsakliga tvådimensionella layout, sedan hanterade Flexbox den vertikala fördelningen av element inom våra kort. Ha det roligt att leka med det!

Vidare läsning

  • Förstå CSS Grid Layout tutorial serien
  • Ska jag använda Grid eller Flexbox? av Rachel Andrew
  • Utforma kortbaserade användargränssnitt på smashing magazine
  • bbc.co.uk beta hemsida
  • Snabbtips: Lägg till en @supports CSS-fil till dina CodePen-demos