1

jQuery.scrollTo プラグインをアコーディオン (クリックすると 1 つのブロックが拡大し、別のブロックが縮小する) で使用しようとしていますが、正しい位置にスクロールしません。

ここにデモがあります: pelmeshkin.com/temp/scrolltoaccoridon

ご覧のとおり、最初のクリックは正しくスクロールしますが、次のクリックは必要以上にスクロールします。

両方のイベントが同時に開始されるため、ターゲットの初期位置 (拡大/縮小の前にあった場所) を使用しているようですが、scrollTo を一時停止して、slideUp/slideDown トランジションが終了するまで待機しようとしても、これは理にかなっています。 、それはまだ同じように動作します。:(

4

3 に答える 3

4

アニメーションが発生する前に、位置に基づいて位置を計算しているためです。おそらく単純な問題ではない内部計算をいじくり回すことを除いて、正直に言うとこれにどのように対処するかわかりません。

于 2009-04-20T00:14:41.430 に答える
3

わかりました、私はそれを自分で解決しました。まず、offset()を使用してページロード上のすべてのクリック可能な要素の位置を見つけ、それらを配列に配置してから、クリックイベントでscrollToにピクセル値としてフィードします。

このようにして、要素ID自体から計算するのではなく、ページ上でスクロールする正確なピクセル位置をscrollToに指定します。最終的には次のようになります:pelmeshkin.com

于 2009-05-05T22:35:50.927 に答える
0

お前。 NSFW

そして、Effect.ScrollTo を少しハッキングした後:

Effect.LazyScrollTo = function(element) { try {
  var options = arguments[1] || { };
  scrollOffsets = document.viewport.getScrollOffsets();
  elementOffsets = $(element).cumulativeOffset();

  if (options.offset) elementOffsets[1] += options.offset;

  return new Effect.Tween(null,
    scrollOffsets.top,
    elementOffsets[1],
    options,
    function(p){
      try {
        this.lazy_offset = this.lazy_offset || $(element).cumulativeOffset();
        scrollTo(scrollOffsets.left, (p.round() - (elementOffsets[1] - this.lazy_offset[1])));
      } catch(e) {
        alert(e);
      }
    }.bind(this)
  ); 
} catch(e) { alert(e); }}

あとは別のところ...

new Effect.SlideDown('tab1-body', {queue: 'end'});
new Effect.LazyScrollTo('tab1-heading', {queue: 'end'});

明けましておめでとう。

于 2009-12-29T16:03:57.183 に答える