Kop 1

tagline

Navigatiemenu

Een navigatiemenu biedt veel uitdagingen. Er komen in deze training veel herhalingen voor maar op enkele zaken gaan we juist wat dieper in. Een navigatiemenu kan zelfs opgevat worden als een website in het klein!

Leerdoelen

  • submenu;
  • lay-out met CSS Grid;
  • ab=nimatie met transitions
  • icons met Font Awesome
  • Een stukje JS om links te beïnvloeden
  • mediaqueries

Als je de inhoud van de filmpjes doorloopt, kun je opmerken dat tot de laatste video alleen voor mobile wordt ontwikkeld: mobile first wordt hier grondig gevolgd.

Voor de liefhebbers is er ook een oudere tutorial voor het maken van een responsive menu: https://blanken5.home.xs4all.nl/responsiveMenu.html.

Responsive menu met submenu stap 0:
het gewenste resultaat (00:05:04)

Een eerste video van een tutorial, waarin je ziet wat het resultaat is van de tutorial: een responsive menu met submenu, roll-overs en een knop om het menu op een mobiel apparaat te verbergen.
Dit verbergen gaat met een animatie.

Responsive menu met submenu stap 1:
de markup (00:05:04)

Als eerste maak je de mark-up van het menu. Het zit in een nav-element en bestaat uit een lijst van linkjes.
Bij een submenu is er weer sprake van een opsommingslijst van linkjes, maar bedenk goed dat deze geplaatst wordt BINNEN het list-item van het hoofdmenu.
De parent van het submenu krijgt een class mee. Bedenk er hier een voor jezelf en probeer zo origineel mogelijk te zijn.
De footer bevat in ieder geval de validatie-icons. De markup daarvoor vind je hier: https://github.com/Theo-denBlanken/validatie-W3C

Responsive menu met submenu stap 2:
de eerste CSS (00:09:25

Na het koppelen van het stijlblad beginnen met de opmaak voor mobiele viewports: mobile-first. Het menu krijgt een kleur die zich van de rest van het document onderscheidt. De opsommingslijsten hebben opsommingstekens, padding en marge, die worden verwijderd.
De links zijn inline, ze worden krijgen daarom een display-type: block. Dan kunnen ze ook padding krijgen, zodat ze voor de gebruiker gemakkelijk aan te klikken zijn. De kleur van de links en de onderstreping worden ook aangepast.
Om het submenu te onderscheiden krijgt deze een dubbele rand en padding aan de linkerzijde. De links zijn eenvoudig geselecteerd met de selector nav a

Responsive menu met submenu stap 3:
het menu verbergen (00:12:49)

Het menu is erg groot voor mobiele apparaten. Het is niet wenselijk dat de gebruiker moet scrollen voor er een stukje inhoud te zien is. Het menu moet daarom worden verborgen.
Om het te verbergen gaan we puur CSS3 gebruiken.We maken een check-box en een label daarbij. Dat label moet uiteindelijk aangeblikt worden door de gebruiker. We kunnen voor de checkbox een pseude-selector gebruiken :checked. Met de ~-selector (tildes-selector) kun je elk sibling van de checkbox:selected selecteren. We kiezen hier de lijst van de linkjes.
We geven deze display: none;.
Als de checkboot geselecteerd is dan geven we display block.
Heb je dit principe eenmaal begrepen dan kun je ook de tekstinhoud in het label (deze staat in 2 span’s) afwisselend verbergen en tonen, zodat de gebruiker gehint wordt wanneer hij op het label moet klikken.
Wordt de check-box door een klik op het label weer ge-de-selecteerd, dan verdwijnt het menu weer. Er is sprake van een togglend menu.

Responsive menu met submenu stap 4:
iconen met Font-Awesome (00:10:37)

Je kunt het menu verrijken met iconen. Er is een icoon voor het menu dat algemeen herkend wordt, bovendien voor het sluiten van het menu en de naar beneden gerichte caret duidt op een submenu.
Hier gebruiken we daarvoor Font Awesome (hier versie 5): https://fontawesome.com/ Met een CDN (Content Delivery Network) koppel je een stijlblad waarna je met een class fas en fa-bars een icoon met 3 balkjes toe.
Als je via CSS het icoon toevoegt, kun je ook een ander icoon laten verschijnen bij een roll-ver. CSS heeft immers een eigenschap content en die alle inhoud heeft. Als het Font dus Font awesome is, dan kun je met content: “\ff0d7” een caret tonen. Dit doen we dan extra achter een linkje naar het submenu met de selector .heeft-submens > a::after. De pseudo-selector ::after maakt een extra stukje DOM aan na het element dat je geselecteerd hebt.
Bedenk dat de omhoog-knoppen op deze pagina ook gemaakt zijn met hexadecimale code. Hier in HTL ziet dat er zou uit: & # x f 1 5 1 ;

Responsive menu met submenu stap 5:
Stijlen met CSS Grid (00:08:02)

Door de geringe ruimte valt het op dat de footer bij weinig inhoud niet aansluit tegen de onderkant van de viewport. Met CSS Grid is dat eenvoudig op te lossen:
Geef de body een minimale hoogte van 100vh (dat heeft hij namelijk niet) en maak van hem een grid-container met display: grid;
Met grid-template-rows: auto 1fr auto; geen je hem 3 rijen. De eerste een laatste zijn zo hoog als de inhoud vereist, de overige ruimte krijgt het middelste element in de body. Zo staat de footer dan tenminste onder tegen de viewport. Bij toename van de inhoud schuift hij gedwee naar beneden.
Ook de inhoud van de footer kan netjes naar de zijden worden verdeeld.
Maak hem ook tot grid container, maar nu met 2 kolommen: 1fr auto.
Dit kan op dezelfde manier in de link naar het submenu.

Responsive menu met submenu stap 6:
menu-toggle animeren (00:07:48)

We hebben wel een menu-toggle maar deze is niet zomaar te animeren. Display: block en display:none maakt dat niet mogelijk.
We gaan de eigenschap op de opsomming dus weghalen en kiezen een andere selector: de linkjes IN de opsomming krijgen verschillende eigenschappen.
Om ze te verbergen maken we van de linkjes de font-grootte, de hoogte, de regelhoogte en de verticale schaling eerst 0. Als de check-box geselecteerd is, geven we ze uitgangsgroottes terug.
Als deze eigenschappen een transition krijgen, zien we vervolgens een animatie in de menu-toggle.

Responsive menu met submenu stap 7:
het submenu verbergen (00:07:50)

Met een vergelijkbare animatie kan ook het submenu worden verborgen. Het is wel van belang de selectie goed te verzorgen, zodat je alleen de linkjes in het submenu selecteert.
Je geeft ze opnieuw een font-grootte, hoogte, regelhoogte en de verticale schaling 0. Als de link van de parent van het sub-menu een hover krijgt, gaan de linkjes daarbinnen weer de uitgangswaarden krijgen.
Bij een hover van de parent animeert het submenu dan tevoorschijn.

Responsive menu met submenu stap 8:
link mag niet afgaan (00:09:29)

Een hover kan helaas niet op apparaten zonder muis werken. Daar kan dit weliswaar ook gebeuren met een tap op een element. Om een submenu te openen kan er dus op de parent-link geklikt worden, maar dan mag er niet overgegaan worden naar de gelinkte pagina. Daarvoor schrijven we een JavaScriptje dat alle parent-linkjs selecteert en in een array stopt. Het script doorloopt het array en zegt tegen elk linkje dat deze niet mag linken. De JavaScript-functie daarvoor is .preventDefault();
Zo werkt het uitklappen van het submenu ook op een mobieltje en tablet.

Responsive menu met submenu stap 9:
voor bredere viewport (00:17:38)

Het menu moet responsie zijn. Voor bredere viewports maken we een mediaquery aan.
In de opsomming van het hoofdmenu willen we de items nu naast elkaar.
We maken daar dus een grid-container van met display: grid;
We maken daar kolommen. Dit kan snel met de waarde repeat();
Je kunt daar als eerste argument het aantal linkjes ingeven, maar dan is jouw menu niet zo geschikt voor CMS, waar niet bij voorbaat bekend is hoeveel items het menu heeft. Met repeat(auto-fill, minmax(10em, 1fr)); kun je tenminste uitgaan van meerdere linkjes van elk minimaal 10 em; Er blijft zo wel ruimte over.
Als je het helmen wilt opvullen dan gebruik je repeat(auto-fit, minmax(10em, 1fr));

De menu-toggle is nu overbodig. Deze wordt dus verborgen.
Dan zijn natuurlijk ook de items van het hoofdmenu niet zichtbaar, die moet je dus weer de gewenste waarden geven.
Als het submenu uitklapt, vergroot deze de hele nav en duwt de inhoud naar beneden.
Om hem over de inhoud te laten vallen, geef je hem postion: absolute. Zorg er dan wel voor dat de parent van het submenu een position relative heeft.
De linkjes zelf hebben geen achtergrondkleur, dat valt op bij dit submenu. Geef deze dus alsnog.
Tot slot zie je dat met 1 selector alle linkjes van het hoofdmenu behalve de eerste te selecteren zijn. Ze krijgen allemaal een randje aan de linkerzijde.


Bonus opdracht

Voor mensen met een extra uitdaging:

  1. Probeer (een kopie van het werk tot nu toe) zo aan te passen dat het menu juist blijft staan en de main en footer naar rechts uit het beeld schuiven. Een aantal zaken waar je rekening mee zou moeten houden:
    • De niet zichtbare checkbox moet op een andere plaats in de mark-up;
    • Het menu (NIET het submenu) heeft een position: absolute; en de main een z-index: 2; zodat deze eroverheen valt;
    • Deze position absolute moet voor de overige viewports weer ongedaan gemaakt worden, en als je de elementen een breedte van 100% geeft, denk er dan ook aan dat box-sizing een border-box te geven om de uiterste elementen aan de rechterzijde in de normale toestand ook nog in beeld te laten;
    • De body moet een overflowX van hidden krijgen, zodat de main en footer echt uit beeld kunnen schuiven er er niet naar gescrolled kan worden.
    • De footer heeft een vertraging in de animatie.
  2. Animeer niet met transition maar met een key-frame-animatie.
  3. Voeg een extra submenu toe. Bedenk zelf een leuke inhoud.

Inleveren

  • Na afloop plaats je deze training online in je bewijzenmap;
  • Valideer jouw pagina's op Markup Validation Service van W3C.
  • De validatie icoontjes staan al in de footer. Code vind je bij https://github.com/Theo-denBlanken/validatie-W3C;
  • Plaats jouw code op in een aparte reposetry op GitHub en plaats jouw uitwerking online;
  • Maak in jouw GitHub-repo een README.md met daarin temnminste een link naar jouw online uitwerking.
  • Plaats de GitHub-link in ELO Magister bij de FRO-opdracht responsive menu.