Tvorba mobilního menu (1/2)

|

V našem seriálu o responzivním webdesignu se dnes podíváme na to, jak vytvořit zcela funkční menu pro mobilní zařízení – tedy takové, jaké najdete i na tomto webu. Menu se bude chovat plně responzivně. Po kliknutí na ikonku vyjede z levé strany a posune obsah webu doprava. Tohoto pěkného efektu dosáhneme použitím CSS animací a JavaScriptu. Pusťme se do toho.

Pro pochopení kódu je tedy nutné znát jazyk HTML, CSS a JavaScript. Začneme tím, že si vytvoříme kostru menu v jazyce HTML.

<nav id="site-navigation" class="primary-navigation menu" role="navigation">
    <div id="menu-control" class="d-tab-none">
        <a href="javascript:void(0);">
            <span class="menu-control-top-line"></span>
            <span class="menu-control-middle-line"></span>
            <span class="menu-control-bottom-line"></span>
        </a>
    </div>
    <div class="primary-menu-container">
        <ul id="primary-menu" class="menu-wrapper">
            <li class="menu-item"><a href="#">O nás</a></li>
            <li class="menu-item"><a href="#">Služby</a></li>
            <li class="menu-item"><a href="#">Portfolio</a></li>
            <li class="menu-item"><a href="#">Šablony</a></li>
            <li class="menu-item"><a href="#">Blog</a></li>
            <li class="menu-item"><a href="#">Kontakt</a></li>
        </ul>
    </div>
</nav>

Blok s id „menu-control“ slouží k ovládání mobilního menu. Přidáme do layoutu stránky obalující div pro celou stránku s id „page“ a do něj zanoříme div s třídou „dark-cover“, která bude překrývat obsah při aktivaci mobilního menu. Menu ještě obalíme blokem header.

<div id="page" class="site">
    <div class="dark-cover"></div>
    <header>
        <nav id="site-navigation" class="primary-navigation menu" role="navigation"> 
            ...
        </nav> 
     </header>
</div>

Doplníme základní styly pro menu. Začít můžeme hamburgerovým tlačítkem pro přepínání menu. Využíváme SCSS syntaxi preprocesoru SASS.

* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

#menu-control{
   a{
        position: absolute;
        right: 0.75rem;
        width: 44px;
        height: 32px;

        span{
            position: absolute;
            left: 0;
            right: 0;
            height: 2px;
            background-color: #fff;
        } 
        &:hover span{
            background-color: #ff0;
        }
    }
        
    .menu-control-top-line{
        top: 0;
    }        
    .menu-control-middle-line{
        top: 15px;
    } 
    .menu-control-bottom-line{
        bottom: 0;
    }
}

Pokračujme doplněním stylů pro responzivně se chovající menu. Použijeme k tomu media query s breakponty, u kterých stanovíme hranici 800px pro přepínání mezi mobilním a desktopovým menu.

ul.menu-wrapper{
    padding: 1rem 0;
    list-style-type: none;
        
    a{
        color: #fff;
        text-align: center;
        width: 100%;
        display: block;
        margin: 1.25rem 0;
        text-transform: uppercase;
        text-decoration: none;
        font-size: 1.5rem;
        padding: 0 2rem;

        &:hover{
            text-decoration: underline;
            text-decoration-color: #ff0;
        }
    }
}    
@media (min-width: 480px){
    ul.menu-wrapper{
        padding: 2rem 0 1rem;
            
        a{
            text-align: right;
            padding: 0 3rem 0 2rem;
            font-size: 1.25rem;
        } 
    }    
}
@media (min-width: 800px){
    ul.menu-wrapper{
        padding: 0;
        display: flex;
        justify-content: center;

        a{ 
            font-size: 1rem;
            margin: 0 0.75em;
            padding: 1em 0;
            text-align: left;
            width: auto;

            &:hover{
                color: #ff0;
                text-decoration: none;
            }  
        }    
    }

    .d-tab-none{
        display: none;
    }
    header{
        min-height: 0;
    }
}
@media (min-width: 1024px){       
    ul.menu-wrapper a{
       font-size: 1.25rem;
    }
}
@media (min-width: 1280px){
    ul.menu-wrapper a{
        font-size: 1.5rem;
    } 
}

Velikost textu menu se postupně zvětšuje, jak se rozšiřuje šířka okna prohlížeče. Nyní už můžeme přidat kód pro mobilní menu.

.primary-menu-container{
    position: fixed;
    top: 0;
    bottom: 0;
    right: 100%;
    width: 100%;
    transition: right 1s;
    z-index: 110;
    background: #00f;
    
    @media (min-width: 480px){
        width: 280px;
    } 

    @media (min-width: 800px){
        position: static;
        width: 100%;
    }
    
    &.mobile{
        right: 0;
        overflow-x: auto;
            
        @media (min-width: 480px){
            right: calc(100% - 280px);
        } 
    }  
    
    // close button
    ul.menu-wrapper{
        .close-button{
            width: 2rem;
            display: block;
            margin: 0 auto;
            padding: 0;
            font-size: 5rem;
            font-weight: 200;
            transform: rotate(45deg);
            cursor: pointer;
            color: #fff;

            &:hover{
                color: #ff0;
                text-decoration: none;
            }
            
            @media (min-width: 480px){
                position: absolute;
                left: 1rem;
                top: -0.5rem;
            }
        }
    }    
}

V horní části kódu se definují styly pro zatím schované mobilní menu, které se aktivuje klikem na hamburgerové tlačítko. To přidává elementu „.primary-menu-container“ třídu „mobile“. Tučně vyznačený kus kódu se postará o animaci vyjetí menu zleva. Níže v kódu jsou styly pro zavírací tlačítko, které v kostře HTML nemáme, ale v pokračování tohoto seriálu si ho vytvoříme za pomoci JavaScriptu. Ze stylů už zbývá jen přidat styly pro zbytek stránky, aby se posunula doprava a překryla poloprůhledným elementem „dark-cover“.

header{
    background-color: #00f;
    min-height: 4rem;
}
#page{
    background-color: #fff;
    margin-left: 0;
    transition: margin 1s;
    width: 100%;
    
    .dark-cover{
        display: none;
    }
    
    &.mobile{
        margin-left: 280px;
            
        .dark-cover{
            display: block;
            background: rgba(#000000, .25);
            left: 0;
            right: 0;
            top: 0;
            bottom: 0;
            z-index: 100;
            position: fixed;
        }
    }
}

Styly máme hotové, zbývá ještě přidat JavaScript pro ovládání menu, což je obsahem druhé části tohoto mini seriálu – Tvorba mobilního menu (2/2).