2012-01-30 1 views
10

Это должен быть довольно простой вопрос, но я бросил большую часть своего утра на это, и в этот момент я близок к тому, чтобы бросить полотенце. У меня нет даже немного JS обув - но я нашел хорошо комментировал кусок кода, который я надеялся использовать для анимации якорь ссылки это:Учет фиксированного заголовка с анимацией. Scrolltop и (target) .offset(). Top;

$(document).ready(function() { 
$('a[href*=#]').bind('click', function(e) { 
e.preventDefault(); //prevent the "normal" behaviour which would be a "hard" jump 

var target = $(this).attr("href"); //Get the target 

var scrollToPosition = $(target).offset().top; 

// perform animated scrolling by getting top-position of target-element and set it  as scroll target 
$('html, body').stop().animate({ scrollTop: scrollToPosition}, 600, function() { 
    location.hash = target; //attach the hash (#jumptarget) to the pageurl 
}); 

return false; 

}); 
}); 

Я пытаюсь получить его земля 30px выше верхнего смещения() -. Я попытался

$('html, body').stop().animate({ scrollTop: scrollToPosition -30}, 600,

Который почти работает - он идет в нужном месте, но затем отскакивает назад.

Я также попытался

scrollTop: $(target).offset().top - 20 },

Я также попытался

scrollTop: $(hash).offset().top + $('#access').outerHeight()

Который не кажется ничего менять.

Кажется, что ответ может быть здесь: JQuery page scroll issue with fixed header, но я просто не могу, похоже, получить его.

Я знаю, что это похоже на другие вопросы - но я прошел через то, что мог найти, и я недостаточно грамотен, чтобы не копировать/вставлять все, что исправляет проблему.

Я был бы невероятно благодарен за решение.

Большое спасибо,

Martin

PS

Этот другой кусок кода, который я нашел работу, но делает это зачистки хэштегом из, что делает это в основном бесполезно.

$(function(){ 
$('a[href*=#]').click(function() { 
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
    && location.hostname == this.hostname) { 
     var $target = $(this.hash); 
     $target = $target.length && $target || $('[name=' + this.hash.slice(1) +']'); 
     if ($target.length) { 
      var targetOffset = $target.offset().top; 
      $('html,body').animate({scrollTop: targetOffset - 30}, 1000); 
      return false; 
     } 
    } 
    }); 
}); 

ответ

12

Редакция: Вам просто нужно определить высоту фиксированного заголовка и вычитать, что из scrollToPosition которые вы делали правильно. Проблема заключается в том, что window.location.hash = "" + target; перескакивает страницу в начало элемента с этим идентификатором. Поэтому, если вы живите там, как вы делали, а затем переходите на этот хеш, он будет «возвращаться», как вы описали. Вот первый способ, которым мы можем бороться с этим:

// Get the height of the header 
var headerHeight = $("div#header").height(); 

// Attach the click event 
$('a[href*=#]').bind("click", function(e) { 
    e.preventDefault(); 

    var target = $(this).attr("href"); //Get the target 
    var scrollToPosition = $(target).offset().top - headerHeight; 

    $('html').animate({ 'scrollTop': scrollToPosition }, 600, function(){ 
     window.location.hash = "" + target; 
     // This hash change will jump the page to the top of the div with the same id 
     // so we need to force the page to back to the end of the animation 
     $('html').animate({ 'scrollTop': scrollToPosition }, 0); 
    }); 

    $('body').append("called"); 
}); 

Вот нового jsfiddle для первого метода: http://jsfiddle.net/yjcRv/1/

ДАЛЕЕ EDIT: еще лучший способ контролировать событие изменения хэша должен используйте плагин как jQuery Address. С этим вы можете использовать свои события хэшмена намного больше.Вот пример использования:

// Get the height of the header 
var headerHeight = $("div#header").height(); 

$.address.change(function(evt){ 
    var target = "#" + evt["pathNames"][0]; //Get the target from the event data 

    // If there's been some content requested go to it…else go to the top 
    if(evt["pathNames"][0]){ 
     var scrollToPosition = $(target).offset().top - headerHeight; 
     $('html').animate({ 'scrollTop': scrollToPosition }, 600); 
    }else{ 
     $('html').animate({ 'scrollTop': '0' }, 600); 
    } 

    return false; 
}); 

// Attach the click event 
$('a').bind("click", function(e) { 
    // Change the location 
    $.address.value($(this).attr("href")); 

    return false; 
}); 

Живой пример здесь: http://www.vdotgood.com/stack/user3444.html

ПРИМЕЧАНИЕ: Вам не нужно, чтобы добавить хэш ваши ссылки HREF атрибута в настоящее время. Вот ссылка, которую вы могли бы предназначаться с селектором JQuery:

<!-- This is correct --> 
<a href="/target" class="myclass">Target</a> 

<!-- These are incorrect --> 
<a href="/#/target" class="myclass">Target</a> 

<a href="#/target" class="myclass">Target</a> 

Чтобы настроить таргетинг по этой ссылке вы бы использовать селектор типа:

$("a.myclass").click(function(){ 
    $.address.value($(this).attr("href")); 
    return false; 
}); 

JQuery Адрес действительно на самом деле ищет ссылки которые имеют следующий атрибут:

<a href="/target" rel="address:/target">Target</a> 

rel атрибут здесь продолжение ains address:, за которым следует относительный url, указанный вами в этом случае /target. Если вы используете это, jQuery Address будет обнаруживать ссылку и автоматически запускать событие изменения хэша.

+0

Большое спасибо Стиву. Клянусь, я собираюсь узнать достаточно, чтобы понять, что я копирую, и надеюсь, в этом году, но это только спасло меня от головных болей. Cheers -m – Martin

+0

Быстрый вопрос: код работает отлично, но хэш, добавленный к URL, подходит как «#undefined» - любые идеи? – Martin

+0

Не беспокойтесь. Просто держитесь за это, регулярно посещайте онлайн-учебники, и вы будете впитывать знания, которые вам нужны! Defo проверяет сайты tutsplus ([Webdesigntuts] (http://webdesign.tutsplus.com/), [Nettuts] (http://net.tutsplus.com/)) и [Team Treehouse] (http: // teamtreehouse .com /) веб-дизайн/разработка обучения от Carsonified, все большие бесплатные ресурсы. –

5

Я знаю, что это старый вопрос (вид), но я столкнулся с аналогичной проблемой с фиксированной выпадающей навигацией на веб-сайте. Обратите внимание, что это гладкий фрагмент кода прокрутки, хотя вы можете легко сделать это автоматически, изменив скорость анимации.

JQuery:

$('body').on('click','a[href^="#"]',function(event){ 
    event.preventDefault(); 
    var target_offset = $(this.hash).offset() ? $(this.hash).offset().top : 0; 
    //change this number to create the additional off set   
    var customoffset = 75 
    $('html, body').animate({scrollTop:target_offset - customoffset}, 500); 
}); 

Я использовал этот кусок кода в течение длительного времени без каких-либо проблем. Единственное, что мне не нравится в этом, это захват ЛЮБОГО тега. Таким образом, в плагине, таком как плагин Flexslider, где навигация использует #, я вручную отделяю их от плагина.

1

Я изменил оригинальный сценарий от http://www.paulund.co.uk/smooth-scroll-to-internal-links-with-jquery. Это чудеса, но вы не можете установить задержку, как есть.

var headerHeight = $("header").height(); 


     $(document).ready(function(){ 
    $('a[href^="#"]').on('click',function (e) { 
     e.preventDefault(); 

     var target = this.hash, 
     $target = $(target); 

     $('html, body').stop().animate({ 
      'scrollTop': $target.offset().top - headerHeight 
     }, 1200, 'swing', function() { 
      window.location.hash = target ; 
     }); 
    }); 
}); 

Да, я немного поздно, но эта проблема как раз пришла мне в голову ... Ура!

 Смежные вопросы

  • Нет связанных вопросов^_^