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");
});
});