JavaScriptはスクロールのためのウィンドウX / Y位置を取得します


213

現在の表示可能なウィンドウの位置(合計ページ幅/高さに対する)を取得する方法を見つけて、セクションを別のセクションに強制的にスクロールできるようにしたいと思っています。ただし、ブラウザーの実際のX / Yを保持しているオブジェクトを推測する場合、膨大な量のオプションがあるようです。

IE 6 +、FF 2+、およびChrome / Safariを確実に機能させるには、これらのうちどれが必要ですか?

window.innerWidth
window.innerHeight
window.pageXOffset
window.pageYOffset
document.documentElement.clientWidth
document.documentElement.clientHeight
document.documentElement.scrollLeft
document.documentElement.scrollTop
document.body.clientWidth
document.body.clientHeight
document.body.scrollLeft
document.body.scrollTop

そして他に何かありますか?ウィンドウがどこにあるかがわかったらwindow.scrollBy(x,y);、目的のポイントに到達するまでゆっくり呼び出すイベントチェーンを設定できます。

回答:


282

これを見つけるためにjQuery(v1.10)が使用するメソッドは次のとおりです。

var doc = document.documentElement;
var left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
var top = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

あれは:

  • window.pageXOffset最初にテストし、存在する場合はそれを使用します。
  • それ以外の場合はを使用しdocument.documentElement.scrollLeftます。
  • 次にdocument.documentElement.clientLeft、存在するかどうかを減算します。

document.documentElement.clientLeft/ の減算はTop、ルート要素にボーダー(パディングやマージンではなく、実際のボーダー)を適用した状況を修正するためにのみ必要であるように見えます。


トーマス-まったくその通りです。私の悪い。コメントを削除しました。私はあなたのコメントを再読しましたが、あなたのソリューションはJqueryソリューションではないことに気付きました。謝罪。モッドアップ。
バンコクの2015年

現在は機能しています。彼らはwebkitに非常に一時的なバグがあり、すでに修正済みだと思います。私はそのバグのために完全に壊れたプラグインを書きました、そして、ユーザーはこれについて私に報告しました。そのような基本的なものが壊れる可能性がある非常に怖い
vsync

2
これは$(window).scrollTop();のコードですか??この回答にjQueryメソッドも含めると便利でしょう。
Phil

1
私が投稿したコードは、何が起こったかを言い換えたものjQuery.fn.offset()です。scrollTop()/ scrollLeft()基本的に同じことを行いますが、clientTop / clientLeftを減算しません。
thomasrutter 2015

方法は何ですか?
Maxrunner

208

多分もっと簡単です。

var top  = window.pageYOffset || document.documentElement.scrollTop,
    left = window.pageXOffset || document.documentElement.scrollLeft;

クレジット:so.dom.js#L492


1
ブラウザを完全に安全にクロス!最良のソリューション。
Simon Steinberger、2015年

1
回答コードよりはうまくいきましたが、...回答コードは機能せず、少しではありません...
Hydroper

2
document.documentElement.scrollTopどこでも機能するを使用しないのはなぜでしょうか。
vsync 2018

33

純粋なJavaScriptを使用すると、Window.scrollXおよびWindow.scrollYを使用できます

window.addEventListener("scroll", function(event) {
    var top = this.scrollY,
        left =this.scrollX;
}, false);

ノート

pageXOffsetプロパティはscrollXプロパティのエイリアスであり、pageYOffsetプロパティはscrollYプロパティのエイリアスです。

window.pageXOffset == window.scrollX; // always true
window.pageYOffset == window.scrollY; // always true

ここに簡単なデモがあります

window.addEventListener("scroll", function(event) {
  
    var top = this.scrollY,
        left = this.scrollX;
  
    var horizontalScroll = document.querySelector(".horizontalScroll"),
        verticalScroll = document.querySelector(".verticalScroll");
    
    horizontalScroll.innerHTML = "Scroll X: " + left + "px";
      verticalScroll.innerHTML = "Scroll Y: " + top + "px";
  
}, false);
*{box-sizing: border-box}
:root{height: 200vh;width: 200vw}
.wrapper{
    position: fixed;
    top:20px;
    left:0px;
    width:320px;
    background: black;
    color: green;
    height: 64px;
}
.wrapper div{
    display: inline;
    width: 50%;
    float: left;
    text-align: center;
    line-height: 64px
}
.horizontalScroll{color: orange}
<div class=wrapper>
    <div class=horizontalScroll>Scroll (x,y) to </div>
    <div class=verticalScroll>see me in action</div>
</div>


6
リンク先のページには、「ブラウザー間の互換性のために、window.scrollYの代わりにwindow.pageYOffsetを使用してください」とあります。
JeremyWeir 2015年

これはIEでは機能しません。IEには次のようなものが必要ですwindow.pageYOffset
hipkiss

-1
function FastScrollUp()
{
     window.scroll(0,0)
};

function FastScrollDown()
{
     $i = document.documentElement.scrollHeight ; 
     window.scroll(0,$i)
};
 var step = 20;
 var h,t;
 var y = 0;
function SmoothScrollUp()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, -step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollUp()},20);

};


function SmoothScrollDown()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollDown()},20);

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.