2013-07-18 1 views
23

スムーススクロールを使用してリンクをアンカーできますが、jQueryなしですか?私は新しいサイトを作成しています。私はjQueryを使いたくありません。ここから機能を使用してスムーススクロールアンカーリンクjQueryなし

+3

@SLaks 25%? HA!そうね... – Ian

+1

私は純粋なjsで試したが、それはジャークを与える –

+7

jqueryは非常に多くの無駄なコードを含んでいる、あなたはすべてのjqueryの50%を使用するつもりはないので、バニラJSに行くか、jquery – sbaaaang

答えて

29

function animate(elem, style, unit, from, to, time, prop) { 
    if (!elem) { 
     return; 
    } 
    var start = new Date().getTime(), 
     timer = setInterval(function() { 
      var step = Math.min(1, (new Date().getTime() - start)/time); 
      if (prop) { 
       elem[style] = (from + step * (to - from))+unit; 
      } else { 
       elem.style[style] = (from + step * (to - from))+unit; 
      } 
      if (step === 1) { 
       clearInterval(timer); 
      } 
     }, 25); 
    if (prop) { 
      elem[style] = from+unit; 
    } else { 
      elem.style[style] = from+unit; 
    } 
} 

window.onload = function() { 
    var target = document.getElementById("div5"); 
    animate(document.scrollingElement || document.documentElement, "scrollTop", "", 0, target.offsetTop, 2000, true); 
}; 

DEMO:https://jsfiddle.net/zpu16nen/

メイクJavaScript animationとプロパティ(スタイルのプロパティだけではなく)を変更するためにそれを修正するには、このような何かを試すことができます実際にはスクロールバーがあり、5番目のdivにスクロールできるように、ウィンドウのサイズを十分小さくしてください。

いいえ、jQueryの25%を再作成する必要はありませんでした。

これは明らかに、質問が実際に何を意味するか(例えば、ウィンドウのハッシュが変更されたときなど)によって大きく変更される必要があります。

$(document).ready(function() { 
    $("html, body").animate({ 
     scrollTop: $("#div5").offset().top 
    }, 2000); 
}); 

はDEMO:http://jsfiddle.net/7TAa2/1/

ちょうど言って... :targetセレクタと

+2

それを試している人に:素晴らしいスクリプトですが、イージングや素敵なトゥイーンは期待していません。これは生のステキなアニメーションのようなものです。 –

+1

同様の試み:http://stackoverflow.com/questions/10063380/javascript-smooth-scroll-without-the-use-of-jquery&http://stackoverflow.com/questions/8917921/cross-browser-javascript-ノンjquery-scroll-to-top-animation –

+0

はFirefoxで動作しません(これ以上ですか?) – mtness

4

CSS3遷移が素敵な結果を与えることができますjQueryを使って、それは同じように簡単だということ

注意JSのハッキングは一切ありません。私はこれを実現するかどうかを検討していたが、Jqueryがなければちょっと乱雑になる。詳細については、this questionを参照してください。

36

この回答を拡張:https://stackoverflow.com/a/8918062/3851798

をscrollToのあなたの関数を定義した後、あなたが関数内scrollToにしたい要素を渡すことができます。

function scrollTo(element, to, duration) { 
    if (duration <= 0) return; 
    var difference = to - element.scrollTop; 
    var perTick = difference/duration * 10; 

    setTimeout(function() { 
     element.scrollTop = element.scrollTop + perTick; 
     if (element.scrollTop === to) return; 
     scrollTo(element, to, duration - 10); 
    }, 10); 
} 

あなたにid = "フッター" あなたはあなたがこれを実行することができますスクロールするために実行するスクリプトで

<div id="footer" class="categories">…</div> 

、あなたが持っている

elmnt = document.getElementById("footer"); 
scrollTo(document.body, elmnt.offsetTop, 600); 

そして、そこでのdivを持っている場合それ。 jQueryを使わずにスムーズにスクロールできます。あなたは実際にあなたのブラウザのコンソール上でそのコードで遊んで、好きなように微調整することができます。

+1

はるかに良い答えです。きれいで伸びやすいありがとうございました! –

+1

'duration <= 0'でなく' duration <0'(2行目)であることを忘れないでください。 – julesbou

+0

パーフェクト。短くて甘いとそれを完了します。ありがとう@Tejasシャー –

0

このjavascriptライブラリを使用して、すべての内部リンクに円滑なスクロールを追加できます。 設定を追加して、無視するリンクを提供することもできます。 詳細はこちらをご覧ください。 https://codingninjascodes.github.io/SmoothScrollJs/

3

実は、それを行うために、より軽量かつ簡単な方法があります: https://codepen.io/ugg0t/pen/mqBBBY

function scrollTo(element) { 
 
    window.scroll({ 
 
    behavior: 'smooth', 
 
    left: 0, 
 
    top: element.offsetTop 
 
    }); 
 
} 
 

 
document.getElementById("button").addEventListener('click',() => { 
 
    scrollTo(document.getElementById("8")); 
 
});
div { 
 
    width: 100%; 
 
    height: 200px; 
 
    background-color: black; 
 
} 
 

 
div:nth-child(odd) { 
 
    background-color: white; 
 
} 
 

 
button { 
 
    position: absolute; 
 
    left: 10px; 
 
    top: 10px; 
 
}
<div id="1"></div> 
 
<div id="2"></div> 
 
<div id="3"></div> 
 
<div id="4"></div> 
 
<div id="5"></div> 
 
<div id="6"></div> 
 
<div id="7"></div> 
 
<div id="8"></div> 
 
<div id="9"></div> 
 
<div id="10"></div> 
 
<button id="button">Button</button>

+2

'' element.offsetTop''の代わりに '' element.getBoundingClientRect()を使うべきです。 + window.scrollY'' – Braggae

2

この使用:

は、
let element = document.getElementById("box"); 

element.scrollIntoView(); 
element.scrollIntoView(false); 
element.scrollIntoView({block: "end"}); 
element.scrollIntoView({behavior: "instant", block: "end", inline: "nearest"}); 

DEMOhttps://jsfiddle.net/anderpo/x8ucc5ak/1/

+2

いくつかの説明を追加しようとします –

+0

説明:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView#Browser_compatibility –

+0

非常に興味深い解決策(+1)現時点でIEの悪臭でサポートされています! –

0

私のお気に入りのスクロールのライブラリは現在のでwide range of featuresと小さいサイズ(現在は3.17キロバイト)のZenscrollです。

ネイティブのscrollIntoView機能を使用する方が意味があるかもしれませんが、現在IEのサポートが不足しているため、ほとんどのプロダクションサイトでpolyfilledする必要があるため、代わりにZenscrollを使用することをおすすめします。

関連する問題