interu58
1.09.2014, 01:31:08
Witam.
Chce stworzyć stronę w formacje "one page website".
Mam taki o to kod:
<html>
<head>
</head>
<body>
<div id="header">
<div id="nav">
<a href="#strona1">1</a>
<a href="#strona2">2</a>
<a href="#strona3">3</a>
</div>
</div>
<div id="page-wrap">
<div id="strona1">
<a name="1"></a>
<div class="page-padding"></div>
<p></p>
</div> <!--END strona1-->
<div id="strona2">
<a name="2"></a>
<div class="page-padding"></div>
<p>This is what you would see on the Portfolio page.</p>
</div> <!--END strona2-->
<div id="strona3">
<a name="3"></a>
<div class="page-padding"></div>
<p></p>
</div> <!--END strona3-->
</div> <!--END page-wrap-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script>$(document).ready(function() {
function filterPath(string) {
return string
.replace(/^\//,'')
.replace(/(index|default).[a-zA-Z]{3,4}$/,'')
.replace(/\/$/,'');
}
$('a[href*=#]').each(function() {
if ( filterPath(location.pathname) == filterPath(this.pathname)
&& location.hostname == this.hostname
&& this.hash.replace(/#/,'') ) {
var $targetId = $(this.hash), $targetAnchor = $('[name=' + this.hash.slice(1) +']');
var $target = $targetId.length ? $targetId : $targetAnchor.length ? $targetAnchor : false;
if ($target) {
var targetOffset = $target.offset().top;
$(this).click(function() {
$('html, body').animate({scrollTop: targetOffset}, 1500);
return false;
});
}
}
});
});</script>
</body>
</html>
i działa to w ten sposób, że jak wciskam na poszczególne pozycje menu to strona się przewija, ale nie zmienia się adres strony, który bez różnicy, czy wybiorę z menu opcje 1 czy 2 zawsze jest ten sam, a co za tym idzie nie będzie jak podlinkować poszczególnych pozycji menu. Znalazłem, że można ten problem rozwiązać za pomocą funkcji location.hash. Kiedy wpisuje noAfter:function() {location.hash=id} to i owszem adres strony się zmienia czyli wyskakuje mi #1, #2 czy #3, ale nie działa już przewijanie. Niestety nie znam zbyt dobrze js, szukam rozwiązania już jakiś czas i nic mi nie działa poprawnie.
Mógłby mi ktoś podpowiedzieć co mógłbym zrobić, żeby przewijanie działało razem ze zmianą adresu strony?
Z góry dziękuję za pomoc.
kamilo818
1.09.2014, 08:53:15
ja to robię tak. Działa super
var $root = $('html, body');
$('a').click(function() {
var href = $.attr(this, 'href');
$root.animate({
scrollTop : $(href).offset().top
}, 500, function() {
window.location.hash = href;
});
return false;
});
Prosto, łatwo i przyjemnie
interu58
1.09.2014, 12:48:48
Dzięki wielkie

Działa, ale.... przy powrocie z samego dołu strony za pomocą suwaka na samą górę już adresy nie przeskakują. wracam na samą górę a w adresie mam nadal #3. tak samo jest jak używam suwaka do przejścia na sam dół. funkcja działa tylko w przypadku wybierania pozycji z menu.
kamilo818
1.09.2014, 14:13:53
Jeśli chcesz żeby przesuwając suwakiem/scrollem zmieniał ci sie adres i aktywne menu to musisz określić która pozycja suwaka należy poszczególnych cześci strony.
Określasz położenie/początek podstrony za pomocą
var poczatek = $('nazwa').offset().top
i określasz koniec
var koniec = poczatek + $('nazwa').height()
. Jesli suwak jest na tej wysokości to podwietlasz konkretny link w menu i zmieniasz location.hash
interu58
2.09.2014, 02:11:07
nie działa mi to niestety. próbowałem to przerobić, ale chyba za mało znam js.
kamilo818
2.09.2014, 06:37:59
Kiedyś zrobiłem to tak. Pewnie można to jakoś udoskonalić, ale działa świetnie
$(window).scroll(function(){
var pozycja_news = $('.news').offset().top;
var pozycja_oferta = $('.oferta').offset().top;
var pozycja_o_nas = $('.o_nas').offset().top;
var pozycja_powierzchnie_biurowe = $('.powierzchnie_biurowe').offset().top;
var pozycja_powierzchnie_handlowe = $('.powierzchnie_handlowe').offset().top;
var pozycja_kontakt = $('.kontakt').offset().top;
var ScrollTop = parseInt($(window).scrollTop());
if (ScrollTop >= pozycja_news-20 && ScrollTop < pozycja_news+70+$('.news').height()) {
document.getElementById("news_link").className = "active";
}else{
document.getElementById("news_link").className = "normal";
}
if (ScrollTop >= pozycja_oferta-20 && ScrollTop < pozycja_oferta+20+$('.oferta').height()) {
document.getElementById("oferta_link").className = "active";
}else{
document.getElementById("oferta_link").className = "normal";
}
if (ScrollTop >= pozycja_o_nas-20 && ScrollTop < pozycja_o_nas+20+$('.o_nas').height()) {
document.getElementById("o_nas_link").className = "active";
}else{
document.getElementById("o_nas_link").className = "normal";
}
if (ScrollTop >= pozycja_powierzchnie_biurowe-20 && ScrollTop < pozycja_powierzchnie_biurowe+20+$('.powierzchnie_biurowe').height()) {
document.getElementById("powierzchnie_biurowe_link").className = "active";
}else{
document.getElementById("powierzchnie_biurowe_link").className = "normal";
}
if (ScrollTop >= pozycja_powierzchnie_handlowe-20 && ScrollTop < pozycja_powierzchnie_handlowe+20+$('.powierzchnie_handlowe').height()) {
document.getElementById("powierzchnie_handlowe_link").className = "active";
}else{
document.getElementById("powierzchnie_handlowe_link").className = "normal";
}
if (ScrollTop >= pozycja_kontakt-20 && ScrollTop < pozycja_kontakt+30+$('.kontakt').height()) {
document.getElementById("kontakt_link").className = "active";
}else{
document.getElementById("kontakt_link").className = "normal";
}
});
interu58
15.09.2014, 14:49:24
Dzięki wielkie:) wypróbuje.