2016-10-20 9 views
0

リンクをクリックするたびに、自動的にページ内のその要素(すべてのdiv要素)にスクロールする、マルチページを作成します。
この関数は機能しますが、引き続き指定された要素にジャンプします。JSスムーススクロール垂直&水平機能

は、ここで私はこれまで持っているコードと、私は関数を呼び出すために使用する要素です:

<li class="topli"> 
    <a id="toplink" onclick="Scroll('#home')" href="javascript:void(0);">HOME</a> 
</li> 

<script> 
    function Scroll(element) { 
     var ID = element.split('#').join(''); 
     var target = document.getElementById(ID); 
     var offset = target.getBoundingClientRect(); 

     console.log("X:",offset.x,"Y:",offset.y); 

     if (window.scrollY != offset.y) { 
      window.scroll(window.scrollY, offset.y); 
     } 

     if (window.scrollX != offset.x) { 
      window.scroll(window.scrollX, offset.x); 
     } 
    } 
</script> 

私はJSFiddleへのより詳細なコードを追加します必要であれば。

+0

@Tektiv、あなたが関数内の最初の行を見れば、あなたは、私が '.split'と' .joinを使用し表示されます'#home'から'# 'を引いて、何も追加しないでください。 –

答えて

0

この

(function($) { 
    $.fn.goTo = function() { 
     $('html, body').animate({ 
      scrollTop: $(this).offset().top + 'px' 
     }, 'fast'); 

     return this; 
} 
})(jQuery); 

のためのjQueryのヘルパーを作成し、(100は、スクロールのレートである)垂直方向にスクロールするためにこれを試してみてください

$('#el').goTo(); 
+0

最初はjQueryを使わずにこれを作っていました。そこにすべてのディレクトリを含めることなくJQueryを含める方法はありますか?また、 '.fn.'は何を指していますか? –

+0

.fn - ウィジェットを作成するためのjQuery契約です。だから、あなたは要素コンテキストでこの関数を呼び出すことができます。 jqueryリファレンスのみを含める必要があります。 – VadimB

+0

申し訳ありませんが、私はまだ普通のJSでこれをやろうとしていますが、うまく行かない場合はこのことを念頭に置いておきます。 '.animate'に対応するプレーンなJSもありますか?事前にありがとう.. –

0

のように使用します。

const goTo = (targetEl) => { 
    const elm = document.querySelector(targetEl); 
    const offset = elm.getBoundingClientRect().bottom; 
    if (offset > window.innerHeight) { 
    window.scroll(0, window.scrollY + 100); 
    setTimeout(() => { 
     goTo(targetEl); 
    }, 16.666); 
    } else { 
    return; 
    } 
}; 

はそれを呼び出しますように:

goTo('#scroll-target'); 

またはクリックで:関数自体で行われ

window.addEventListener('DOMContentLoaded',() => { 
    document.querySelector('.long-div').addEventListener('click',() => { 
    goTo('#scroll-target'); 
    }); 
}); 
+0

どうすればこのことを説明できますか私と違うの?私は同じコードだが、異なるコードを参照してください..また、 'const'とは何か '()=> {..}'は 'setTimeout'で何をしますか?私はJSが何をしているのか、そしてなぜそれがそれをするのかを理解するのがとても遅いので、違いが何であるかを説明することができれば、本当に感謝しています! –

+0

それは同様の機能を持ちますが、現在は "再帰的"です。基本的には、ターゲットdivとページが整列していない場合は、一度に100pxの画面をスクロールするだけで、関数を再度呼び出して、最大60回/秒(1000/60)を実行します。これにより、滑らかなアニメーションが得られます。関数を再呼び出しするために 'window.requestAnimationFrame'を見ることもできます。' const'とarrow関数については、ES6構文を見てください。 – Louis

+0

動作しません、man、 'window.addEventListener'と' const'' goTo()の 'setTimeout'に式文のエラーがあります。 –

関連する問題