Bootstrap burger menu optimized as an icon

Burger menu icons are everywhere in today’s web sites and application interfaces. Good or bad for user experience, this debate is not the subject here.

Design request

I had a design request where desktop interface get a button with both a “Menu” label and a burger menu icon next to it and the mobile interface get a simplified burger menu icon on the far right of the header.

screenshot Ztele.com bootstrap grid desktop VS mobile interface

Bootstrap been very popular these days for building fast responsive HTML layouts it’s not surprising to get burger menu in it’s Glyphs library … D’oupssss! There is NO burger menu available in the Glyphicons Free Edition used by Bootstrap’s Components.

Burger menu from Bootstrap

In fact by default Bootstrap use burger menu only within the Navbar Component when responsive kicks in.

Even worst for designers, it is not a define object (image or graph), you can’t use it out of the Navbar context. It is a pure semantic hack that takes 3 HTML <span> tags wrapped within a <button>. OK there is the <span class="sr-only"> fix but that is really a minimum to pass accessibility QA.

 A web-inspector view of Bootstrap navbar <span.icon-bar>

 

So I have designed a custom burger menu based on Bootstrap’s “icon-bar” LESS code lines.

HTML source code


<button id="main-menu-dropdown" class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown" title="Toggle navigation">
    <span class="string">Menu</span>
    <span class="ico ico-burger-menu" title="Menu">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
    </span>
</button>

The get the burger wrapped within a border you just add the class “border” to <span class="ico ico-burger-menu border">

Layout “Bootstrap style” by default

  1. Default icon layout (whitout border)

    <span class="ico ico-burger-menu">

  2. Icon wrapped within border

    <span class="ico ico-burger-menu border">

Default burger menu layout within a <button>Burger menu layout wrapped within border

LESS code lines


// ico-burger-menu is generated with the glyphicon icon method from bootstrap
@burger-menu-color:                 lighten(@dropdown-caret-color, 50%);
// ico-burger-menu within bootstrap buttons
@burger-menu-default-color:         lighten(@btn-default-color, 20%);
@burger-menu-primary-color:         @btn-primary-color;
// ico-burger-menu hover
@burger-menu-hover-color:           darken(@burger-menu-color, 30%);

/*
 * -------------------
 * Burger Menu
 */
.ico {
    .glyphicon;
    &.ico-burger-menu {
        display: inline-block;
        min-width: 18px;
        max-width: 32px;
        min-height: 18px;
        text-align: center;
        vertical-align: middle;
        background-color: transparent;
        &.border {
            min-width: 20px;
            margin-top: -4px;
            padding: 1px 2px;
            border: 1px solid @burger-menu-color;
            border-radius: 2px;
            // within bootstrap buttons
            .btn-default & {
                border-color: @burger-menu-default-color;
            }
            .btn-primary & {
                border-color: @burger-menu-primary-color;
            }
        }
        // Bars (style from navbar.less)
        .icon-bar {
            display: block;
            min-height: 2px;
            margin: 2px auto;
            border-radius: @border-radius-small;
            background-color: @burger-menu-color;
            // within bootstrap buttons
            .btn-default & {
                background-color: @burger-menu-default-color;
            }
            .btn-primary & {
                background-color: @burger-menu-primary-color;
            }
            .dropdown.open .btn &,
            .btn:hover & {
                background-color: @burger-menu-hover-color;
            }
        }
        &:focus {
            outline: 0;
        }
        &:hover,
        &:focus,
        .btn:hover & {
            text-decoration: none;
        }
        .btn-primary & {
            text-decoration: none;
        }
    }
}

Clean inner transparent border in CSS

Pure CSS 2.1, no image sprite in there

Quand j’ai reçu cette maquette du designer je croyais devoir utiliser une énorme image sprite qui contiendrait un contour rouge de 10 pixels, dont la couche (Photoshop layer) serait à 50% de transparence, pour chaque dimensions d’image utilisés dans le site.

Puis j’ai trouver la méthode CSS “:before” & “:after” proposée par Remy Sharp (VagrantRadio) en réponse à la question “Inner Border in CSS?“. Malgré que cette technique ne soit pas supportée par les anciens navigateurs de Internet Explorer (IE8 et moins), puisqu’il ne s’agit que d’un élément graphique, de savoir que c’est supporté et fonctionnel dans IE9, IE10, Google Chrome, Safari et Firefox me suffit amplement pour ce client.

The HTML source

<a class="picture" title="db_ARTICLE_TITLE" href="#">
 <span class="flag">Flag label</span>
 <img src="image/picture_182x102.jpg" alt="db_IMG_DESC" />
</a>

The CSS code

a.picture{
	position:relative;
	width:182px;
	height:102px;
}
.picture:before{
	content:'';
	position:absolute;
	left:0;
	top:0;
	width:162px;
	height:82px;
	border:10px solid transparent;
}
.picture:hover:before{
	border-color:rgba(215,32,23,.5);
}

Références:

Standards de largeur de site

Il est aujourd’hui difficile de décider d’un format d’écran puisque beaucoup d’appareils différents occupent les rapports de ventes des marchands de produits informatiques ; Du gigantesque écran d’ordinateur de bureau aux écrans d’appareils mobiles en passant par la panoplie de netbook, ultrabook etc…

Les bananes avec les bananes

Pour éviter de mélanger les pommes avec les bananes, cet exercice se limitera à calculer une norme de largeur pour les fureteurs “standards”. Cet à dire, en language CSS, aux médias de type screen. Donc les ordinateurs de bureaux et les ordinateurs portables (incluant les netbook) qui utilisent un système d’opération grand public tels que Windows (XP, Vista, 7), Mac OS X ou Linux.

Les contraintes

Viewport du fureteur Firefox 3.5
Voici une liste des contraintes que j’ai considérée pour décider du format final :

  1. Les statistiques compilées par Google Analytics des résolutions d’écrans des visiteurs de mon site ; Soit 1024 x 768 et 1280 x 1024.
  2. La largeur de l’interface du fureteur moderne qui gruge le plus de pixels dans la fenêtre du viewport ; Mozilla Firefox version 3.5 pour Windows XP. Ce fureteur  nécessite 4 pixels à gauche et 21 pixels pour sa barre de défilement (scrollbar) à droite, donc un total de 25 pixels de largeur.
  3. La dimension doit être un nombre paire pour permettre un alignement horizontal parfait.
  4. La dimension doit être divisible par des valeurs paires et impaires pour laisser un maximum de flexibilité au designer pour décider de la grille graphique (sub-division en colonnes avec des marges) qui convient le mieux au style de ses maquettes.

Les standards finaux sont …

  • 996 pixels pour un écran de 1024 x 768.
  • 1248 pixels pour les écrans de 1280 x 1024.