CSS Grid: Easier than you think

Core concepts

A kitten with cute toes

Tracks, lines, and fr


                    .grid {
                        display: grid;
                        grid-template-columns: 1fr 1fr;
                        grid-template-rows: 1fr 1fr;
                    }
                
Grid Tracks

Grid areas

                        
                        .grid {
                            display: grid;
                            grid-template-columns: 2fr 2fr 1fr 2fr;
                            grid-template-rows: 100px 200px 100px;
                            grid-template-areas:
                                "head head . side"
                                "main main . side"
                                "footer footer footer footer";
                        }
                        
                    

Grid areas

Grid Areas

Which means you can do this…

                            
                                .grid {
                                    grid-template-areas:
                                        "πŸ‘©πŸ½  πŸ‘©πŸ½  πŸ‘©πŸ½"
                                        "πŸ‘—  πŸ‘—  πŸ‘•"
                                        "πŸ‘‘  πŸ‘‘  πŸ‘‘";
                                }
                            
                        

…I know right!

Grid Areas

Going from Skeleton to Grid

(or how I reduced 20k of CSS to 6k and removed a shedload of markup at the same time)

A shocked cat

Markup


                    <header class="layout layout-header"></header>
                    
                    <div class="layout">
                        <main class="layout-main"></main>
                    
                        <aside class="sidebar layout-sidebar"></aside>
                    </div>
                    
                    <footer class="layout layout-footer"></footer>
                

Define a layout

                        
                            .layout {
                                display: grid;
                                grid-template-columns: repeat(12, 1fr);
                                grid-column-gap: 2rem;
                            }
                        
                

Small screen first design

                    
                            .layout > * {
                                /* All grid elements to span 10 cols offset by 1 */
                                grid-column: 2 / span 10;
                            }
                    
                

Small screen first design

Define breakpoints


                        @media screen and (min-width: 1000px) {
                            .layout-main {
                                grid-column: 2 / span 5;
                            }

                            .layout-sidebar {
                                grid-column: 8 / span 4;
                            }
                        }
                

Define breakpoints

Progressive enhancement

A cat gives a high five

Progressive enhancement

Feature queries


                    .block {
                        float: right;
                    }

                    @supports (display: grid) {
                        .block {
                            display: grid;
                        }
                    }
                

Wait a sec, what about flex?

Use both!

I think I may need to recalibrate the estimation part of my brain to account for just how powerful CSS grid is.
Jeremy Keith

Thank you

Thank you

polytechnic.co.uk

@garrettc