Flexbox App Layout

Perfect layout for just about any app by utilizing Flexbox.

by Nick Karnik

HTML

<link rel="stylesheet" href="https://storage.googleapis.com/code.getmdl.io/1.0.6/material.indigo-pink.min.css">
<script src="https://storage.googleapis.com/code.getmdl.io/1.0.6/material.min.js"></script>
<header>
    <div class="branding">
        <div class="menu-button menu-toggle nav">
            <i class="material-icons">menu</i>
        </div>
        <img src="http://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png" />
    </div>
    <div class="page-details">
        <div class="title">Page Title That Might Get Really Long Sometimes</div>
    </div>
    <div class="settings">
        <div class="menu-button profile">
            <i class="material-icons">person</i>
        </div>
        <div class="menu-button menu-toggle aside">
            <i class="material-icons">chat</i>
        </div>
    </div>
</header>
<app>
    <nav>
        <div class="title-block">
            <img src="http://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png" />
        </div>
        <ul>
            <li><a href="#"><i class="material-icons">home</i>
                <span>Home</span></a></li>
            <li><a href="#"><i class="material-icons">adb</i>
                <span>Menu Item with a Long Name</span></a></li>
            <li><a href="#"><i class="material-icons">android</i>
                <span>Android</span></a></li>
            <li><a href="#"><i class="material-icons">attachment</i>
                <span>Attachments</span></a></li>
            <li><a href="#"><i class="material-icons">bookmark</i>
                <span>Bookmarks</span></a></li>
            <li><a href="#"><i class="material-icons">star</i>
                <span>Favorites</span></a></li>
            <li><a href="#"><i class="material-icons">build</i>
                <span>Configuration</span></a></li>
            <li><a href="#"><i class="material-icons">cake</i>
                <span>Birthday Party</span></a></li>
            <li><a href="#"><i...

SCSS

@import url('https://fonts.googleapis.com/icon?family=Material+Icons');

* {
    box-sizing: border-box;
}

html, body {
    margin:0;
    height:100%;
    min-height:100%;
}

body {
    margin:0;
    display: flex;
    flex-direction: column;
}

header { 
    z-index: 0;
    flex: 0 64px;
    display: flex;

    background: white;
    box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.24);

    .branding,
    .page-details,
    .settings {
        display: flex;
        align-items: center;
    }

    .branding {
        flex: 0 0 256px;
        order: 0;
        justify-content: flex-start;

        img {
            max-height: 32px;
            max-width: 175px;
        }
    }

    .page-details {
        flex: 1 1 100%;
        order: 1;
        padding: 0 24px;
        overflow: hidden;

        .title {
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;

            font-size: 20px;
            line-height: 24px;
        }
    }

    .settings {
        flex: 0 0 256px;
        order: 2;
        justify-content: flex-end;
    }
}

.menu-button {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 48px;
    height: 48px;
    margin: 8px;

    &:hover {
        background: rgba(0,0,0,0.08);
        cursor: pointer;
    }
}

app {
    flex: 1;
    display: flex;
}

nav {
    background: #FAF9F8;
    flex: 0 0 256px;
    overflow: auto;
    order: 0;
    border-right: 1px solid #d9d9d9;
    
    .branding,
    .title-block {
        height: 64px;
        display: flex;
        align-items: center;
        padding: 0 24px;
        
        img {
            max-height: 32px;
            max-width: 175px;
        }
    }
    
    ul {
        list-style: none;
        margin: 8px 0;
        padding: 0;

        li a {
            display: flex;
            align-items: center;
            height: 56px;
            padding: 0 20px;
            text-decoration: none;
            color: black;

...

JavaScript

$(function() {
    $(".menu-toggle").on("click", function(e) {
        if($(this).hasClass("nav")) {
            $("nav").addClass("open");
        }
        else {
            $("aside").addClass("open");
        }
        e.stopPropagation();
    });
    
    $("body:not(nav)").on("click", function(e) {
        $("nav, aside").removeClass("open");
    });
});