Automatisch Menu Active maken

Status
Niet open voor verdere reacties.

lerrie

Gebruiker
Lid geworden
2 nov 2010
Berichten
300
Als ik een menu balk heb met wat tekst (home contact etc.) kan ik er dan voor zorgen dat via classes de active pagina automatisch een andere achtergrond kleur krijgt? Bijv. als we op de contact pagina zijn dat de tekst contact een andere achterkleur krijgt dan de rest? Ik kan dit wel manueel doen maar wil het graag automatisch hebben!

Bvd.
 
de html (1)
Je geeft de <li>'s van het menu allemaal een eigen id, bv.:
HTML:
<ul id="menu">
    <li id="home"><a href="index.htm">Home</a></li>
    <li id="meer"><a href="meer.htm">Meer</a></li>
    <li id="slot"><a href="slot.htm">Slot</a></li>    
</ul>

de html (2)
De <body>-tag van een bepaalde pagina geef je een class met dezelfde naam als de id van de bijbehorende <li>. Dus bv. voor de homepage:
HTML:
</head>
<body class="home">
...
Voor de pagina "Meer":
HTML:
</head>
<body class="meer">
...
enz.

de css
De gewone css voor het menu is bv.:
Code:
#menu a {
    background: white;
    color: black;
    border: 1px solid Silver;
    }
Nu geef je css de opdracht om alléén als de class-naam hetzelfde is als de id-naam de "actuele stijl" weer te geven:
Code:
.home #menu #home a,
.meer #menu #meer a,
.slot #menu #slot a {
    background: PapayaWhip;
    color: PaleVioletRed;
    border: 1px solid SandyBrown;
    }
Op de homepage heeft de li #home inderdaad een eerder in de html staande class .home, dus daar wordt de actuele stijl met de exotische kleuren op toegepast.
Alle andere li's voldoen daar niet aan, dus die krijgen de gewone stijl.
Op de pagina "Meer", met .meer als class van de body, krijgt nu de li met de #meer automatisch de voorkeursbehandeling, enz.

Zo kan het menu identiek blijven, wat ook handig is als je het er met een php-include in gaat zetten. :)

Met vriendelijke groet,
CSShunter
 
Oke bedankt voor de goede info! Het lukt inderdaad zo! Maar kan het ook op een andere manier zonder mijn body een class te geven, want als ik een nieuwe pagina toe voeg moet ik dus elke keer weer een nieuwe class maken!
 
Tja, je moet er wat voor over hebben. :p

Nee, serieus: als je een pagina als actuele pagina uniek in het menu wilt hebben staan, zal ergens op die pagina dat unieke kenmerk moeten zitten.
En dan wordt het kiezen of delen:
  1. ofwel je geeft de actuele pagina direct aan in het menu, met een class="actual",
  2. ofwel je geeft de <body> (of een ander element op de pagina) een uniek kenmerk mee, zodat je het met het stylesheet kunt aansturen.
Bij een class="actual" in het menu speelt:
  • Het voordeel dat je met één class in het stylesheet alle pagina's kan bedienen, en er bij een nieuwe pagina geen extra class in het stylesheet aangemaakt hoeft te worden.
  • Het voordeel dat je alleen het trefwoord "actual" hoeft te onthouden.
  • Het nadeel, dat het hele menu op elke pagina moet komen, om er voor de actuele pagina die class="actual" bij te kunnen zetten, en voor de rest niet.
  • Dus ook het nadeel, dat het menu er niet met een php-include in gezet kan worden (er is niet één menu, maar net zoveel menu's als er pagina's zijn).
  • En daarmee het nadeel dat als er een nieuwe pagina in het menu bij komt, alle pagina's van de hele site het nieuwe menu moeten krijgen.
  • Met een Dreamweaver dwt-template is dat vrij eenvoudig, maar dan staat DW wel een prettig tot onprettig tijdje (afhankelijk van de omvang van de site) te loeieren om alle pagina's inclusief het nieuwe menu opnieuw op de server te zetten (zie ook deze hartekreet).
  • D.w.z. dat de nieuwe pagina niet meteen online via alle andere pagina's te bereiken is.
Bij een <body class="paginanaam">, zoals de constructie hierboven, speelt:
  • Het voordeel dat je op de pagina's aan het menu niets meer hoeft te doen.
  • Het voordeel dat het menu er nu wel met een php-include in kan, en dus ook met één upload van de gewijzigde php-include een wijziging (nieuwe pagina) in het menu kan doorvoeren voor de hele site tegelijk.
  • D.w.z. het voordeel dat met 3 uploads (de nieuwe pagina zelf, het aangepaste stylesheet en de nieuwe menu-include) de hele site per direct bij de nieuwe pagina kan komen.
    Je kunt ook een nieuwe pagina van te voren klaar maken, inclusief het aangepaste stylesheet, en die alvast uploaden. Op dag x kan je dan met 1 upload van de nieuwe menu-include in 1 tel de hele site aangepast en online hebben.
  • Het nadeel, dat je in het stylesheet voor elke nieuwe pagina een paar nieuwe stijlregels moet opnemen (en dat je moet onthouden hoe dat ook alweer werkt).
Zelf vind ik de tweede methode het handigste.

Om verder te automatiseren zie ik twee mogelijkheden:
  1. Clientside: via javascript bv. de paginanaam uit de url opvragen, en die on-the-fly in het menu de actual-class geven. Maar dat gaat ten koste van de toegankelijkheid voor mensen die niet met javascript (kunnen) browsen: afgekeurd!
  2. Serverside maatregelen treffen. Is: het CMS (als je de site met een CMS bedient) aanpassen, zodat het met php automatisch gaat. Of anders zelf php in elkaar knutselen dat het automatisch kan doen.
    Maar dat kan wel eens veel meer werk zijn dan het aanmaken van een nieuwe class bij een nieuwe pagina. ;)
Met vriendelijke groet,
CSShunter
 
Ik ga morgen even kijken hoe ik dit ga oplossen, misschien is dan een php bestandje nog het handigst! Ik hou je op de hoogte!
 
php aangedreven menu met automatische actuele pagina stijl

Ja, met php had ik het nog nooit gedaan, want daar ben ik niet zo in ingevoerd.
Maar het valt reuze mee en blijkt vrij eenvoudig:
Werking:
  • De menu-include checkt de url van de pagina, en vergelijkt die met de url's uit het menu.
  • Bij een match wordt de class="actual" toegevoegd aan de pagina van dat moment.
  • Via die class doet het stylesheet de rest vanzelf.
Resultaat:
  • Aan het stylesheet hoeft nu niets gedaan te worden bij een nieuwe pagina.
  • Aan de bestaande pagina's hoeft nu niets gedaan te worden bij een nieuwe pagina.
  • Alleen de menu-include hoeft een update te krijgen door eervolle vermelding van de nieuwe pagina. Maar dat moest sowieso al.
Php loont toch wel erg de moeite!

Met vriendelijke groet,
CSShunter
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan