Immaginiamo di dover gestire un sito in cui tutti i contenuti vengono mostrati ad uno ad uno facendo scrollare in verticale il loro contenitore tramite un menu di navigazione. Per implementare questo effetto con jQuery è necessario conoscere il procedimento che assegna un offset verticale a ciascun elemento. Vediamo come.
In jQuery l'oggetto offset()
restituisce le coordinate verticali e orizzontali di un elemento rispetto all'intero documento, mentre position()
da lo stesso risultato ma rispetto al contenitore dell'elemento.
Avendo un documento di questo tipo:
<div id="site">
<div id="content">
<div class="box" id="home">...</div>
<div class="box" id="about">...</div>
<div class="box" id="contatti">...</div>
</div>
<div id="navigation">...</div>
</div>
Con questi stili CSS:
html, body {
margin: 0;
padding: 0;
height: 100%;
min-height: 100%;
width: 100%;
}
body {
position: relative;
font: 100%/1.5 Arial, sans-serif;
overflow-y: hidden;
}
#site {
width: 100%;
height: 100%;
min-height: 100%;
position: relative;
overflow-y: hidden;
}
#content {
width: 68%;
position: absolute;
top: 2em;
right: 2%;
height: 100%;
min-height: 100%;
}
#navigation {
width: 20%;
height: 100%;
min-height: 100%;
background: #000;
position: fixed;
top: 0;
left: 0;
}
#navigation ul {
width: 100%;
margin: 0;
padding: 2em 0 0 0;
list-style: none;
}
#navigation a {
display: block;
padding: 0.5em;
margin-bottom: 1em;
margin-left: 28%;
text-align: right;
background: #c30;
color: #fff;
text-decoration: none;
width: 70%;
border-radius: 6px;
}
#navigation a:hover {
background: #d30;
}
#navigation a.current {
background: #d34545;
font-weight: bold;
text-transform: uppercase;
}
#about, #contatti {
margin-top: 600px;
}
Dobbiamo far muovere l'elemento content
usando l'offset superiore di ciascuna sezione operando sul menu di navigazione. Infatti ciascun link ha un'ancora che può essere usata come ID della sezione corrispondente:
$(function() {
$('a', '#navigation').each(function() {
var $a = $(this);
var href = $a.attr('href');
var box = $(href);
var $ul = $a.parents('ul');
$a.click(function(event) {
$a.addClass('current');
$ul.find('a').not($a).removeClass('current');
$('#content').css('top', '2em');
$('#content').animate({
top: - (box.offset().top - 50)
}, 1000);
event.preventDefault();
});
});
});
Per evitare sfasamenti nel posizionamento dei box resettiamo ad ogni clic il valore originale della proprietà top
del contenitore:
$('#content').css('top', '2em');
Potete visionare l'esempio finale in questa pagina.