2013-10-26 10 views
7

私のjqueryアコーデオンが私の望むことをするのにちょっとした問題がありました。jQueryアコーディオン、クリックされたタブが上にスクロール開始されました。

私はいつもクリックされているタブをページの上から一定量のピクセルにスクロールさせたいと思います。しかし、アクティブなタブがクリックされているタブの上にあるときはいつでも、ページがすでに少しスクロールされていると、クリックされたタブのコンテンツの上部と部分がページの上部を超えてスクロールアップされます。

これは私が得たものである:ここでは

$(function() { 
    $("#accordion").accordion({ 
     autoHeight: false, 
     collapsible: true, 
     heightStyle: "content", 
     active: 0, 
     animate: 300 
    }); 
    $('#accordion h3').bind('click',function(){ 
     theOffset = $(this).offset(); 
     $('body,html').animate({ 
      scrollTop: theOffset.top - 100 
     }); 
    }); 
}); 

fiddleは、「セクション2」拡大を持って、たとえば、

を私の問題を説明するためだ、下にスクロールして「セクション3」タブと、それをクリックしてくださいすべてのページをスクロールし、それ以外の方法でも動作します。

新しいタブを開く前にアクティブなタブを閉じると、うまくいきますので、これはトップの機能にスクロールしてしまうタブの高さに何かがあると想定しています!

誰かが助けてくれることを願っています。おそらくこれは間違った方法です。 jqueryのスキルが基本的なカットアンドペーストの理解に限定されているため、実際に何をしているのか分かりません。 ^^

おかげさまで、ありがとうございました。 :)

乾杯

答えて

16

はい、タブのthatsのその高さは、問題の原因のthats閉じたばかり。

クリックされたh3の上端は、その上のタブが折り畳まれた直後に変更されます。

回避策(おそらく悪い)は、折りたたみアニメーションが終了した後、つまり折りたたみアニメーションが300msに設定されている場合は、310ms後にスクロールアニメーションを開始することです。

$(function() { 
     $("#accordion").accordion({ 
      autoHeight: false, 
      collapsible: true, 
      heightStyle: "content", 
      active: 0, 
      animate: 300 // collapse will take 300ms 
     }); 
     $('#accordion h3').bind('click',function(){ 
      var self = this; 
      setTimeout(function() { 
       theOffset = $(self).offset(); 
       $('body,html').animate({ scrollTop: theOffset.top - 100 }); 
      }, 310); // ensure the collapse animation is done 
     }); 
}); 

Updated Fiddle

+0

はい! :Dありがとう、私は実際のスクロールイベントを遅らせようとしましたが運がなかったのですが、うまくいきました!優れた! – Andreas

+0

うまく動作します!私の唯一の疑問はなぜあなたは 'var self = this;'をやっているのですか?私は 'var theOffset = $(this).offset();'を使ってやろうとしましたが、うまくいきませんでした。どんな考え? – Technotronic

+2

@Technotronic - setTimeoutコールバック内の 'this'の値は外部ではないためです。 – techfoobar

3

あなたはアコーディオンに活性化機能を追加することができます。そうすれば、他のアニメーションの表示/非表示が完了するとトリガーされます。あなたはオープンアコーディオンタブを崩壊している場合

$(function() { 
    $("#accordion").accordion({ 
     autoHeight: false, 
     collapsible: true, 
     heightStyle: "content", 
     active: 0, 
     animate: 300, 
     activate: function(event, ui) { 
      try { 
       theOffset = ui.newHeader.offset(); 
       $('body,html').animate({ 
        scrollTop: theOffset.top 
       }); 
      } catch(err){} 
     } 
    }); 
}); 

ui.newHeaderとして必要とされるトライキャッチは未定義です。

関連する問題