JavaScriptでのスクロール量を取得するコードを紹介します。
ブラウザの画面上でクリックした座標を取得したい場合などで、ブラウザの画面が、どのくらいスクロールしたかを取得するコードを紹介します。
スクロール量の取得は、Internet Explorer, Mozilla Firefoxと、Google Chrome, Micorosft Edge などのWebkit系/準拠のブラウザではコードが異なります。jQueryを利用するとブラウザの違いの場合分けが不要になります。jQueryでのスクロール量の取得はこちらの記事を参照してください。
最新のWebブラウザでは仕様の統一が進み、多くのブラウザで共通のコードで動作する状況になっています。
下記のHTMLファイルを記述します。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<style type="text/css">
<!--
.FloatInfo{
position:fixed;
top:16px;
right:16px;
width:240px;
height:60px;
background-color:#FFFFFF;
}
-->
</style>
<script type="text/javascript">
function onScroll() {
var infoF = document.getElementById("infoFrame");
infoF.innerHTML = "ScrollY:" + document.documentElement.scrollTop;
}
window.onscroll = onScroll;
</script>
</head>
<body>
<div id="infoFrame" class="FloatInfo"></div>
<div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
</div>
</body>
</html>
WindowのonscrollイベントにonScroll関数を割り当てています。画面がスクロールするごとに、onScroll()関数が実行されます。onScroll()関数中ではdocument.documentElement.scrollTopでY方向のスクロール量を取得します。取得した数値は、id="infoFrame"の枠に"ScrollY:"の文字列とともに表示します。infoFrame枠はスクロールで画面がいにスクロールアウトしないようにfixedスタイルでスクロールしないように設定してあります。
Internet Explorer で上記のHTMLファイルを表示します。下図の画面が表示されます。
下方向にスクロールします。ScrollYの値が増加します。
ページの最初までスクロールで戻るとScrollYの値は0になります。
FireFoxで上記のHTMLファイルを表示します。下図の画面が表示されます。
下方向にスクロールします。ScrollYの値が増加します。
ページの最初に戻るとScrollY の値は0になります。
Google Chromeで上記のHTMLファイルを表示します。下図の画面が表示されます。
下方向にスクロールします。ScrollYの値が増加します。
ページの最初に戻るとScrollY の値は0になります。
バージョンの古いChromeでは、正しく動作しません。
Google Chromeで上記のHTMLファイルを表示します。下図の画面が表示されます。
下方向にスクロールしますが、ScrollYの値は0のままです。
横方向のスクロール量を取得する場合は、scrollLeft プロパティの値を利用します。ただし、先の場合と同様に、Internet Explorer, Firefoxはdocument.documentElementのscrollLeftプロパティを取得し、古いGoogle Chrome, Micorosft Edgeはdocument.bodyのscrollLeftプロパティを取得する必要があります。
下記のコードを記述します。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<style type="text/css">
<!--
.FloatInfo{
position:fixed;
top:16px;
right:16px;
width:240px;
height:60px;
background-color:#FFFFFF;
}
-->
</style>
<script type="text/javascript">
function onScroll() {
var infoF = document.getElementById("infoFrame");
infoF.innerHTML = "ScrollX:" + document.documentElement.scrollLeft + "<br/>"
+ "ScrollY:" + document.documentElement.scrollTop;
}
window.onscroll = onScroll;
</script>
</head>
<body>
<div id="infoFrame" class="FloatInfo"></div>
<div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
</div>
</body>
</html>
先のコードとほぼ同様です。スクロール時に、Y方向のスクロール量をscrollTopプロパティで取得し、X方向のスクロール量をscrollLeftで取得し、infoFrameに表示します。
上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。
右方向にスクロールします。ScrollXの値が増加します。その後、下にスクロールするとScrollYの値も増加します。
逆方向にスクロールすると値が減り、左上に戻ると両方の値が0になります。
Webkitの動作に準拠する、Microsoft Edgeでも動作を確認します。上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。
下方向にスクロールします。ScrooYの値が増加します。その後、右にスクロールするとScrollXの値も増加します。
反対向きにスクロールすると値が減少します。左上に戻ると、ScrollX,ScrollYの両方の値が0になります。
上記のHTMLファイルをGoogle Chromedeで表示します。下図の画面が表示されます。
下方向にスクロールします。ScrooYの値が増加します。その後、右にスクロールするとScrollXの値も増加します。
反対向きにスクロールすると値が減少します。左上に戻ると、ScrollX,ScrollYの両方の値が0になります。
スクロール量を取得する方法は複数あり、
といったプロパティが利用できますが、ブラウザの種類とDOCTYPEで取得できる場合とできない場合が出てきます。
HTMLの先頭部にDOCTYPEとして以下のコードがある場合、「DOCTYPEを指定した」ものとして判断されます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Firefox 2.0, Firefox 1.5 | Opera 9 | Safari 3.0β | IE 7 IE 6 | |
---|---|---|---|---|
window.scrollY | YES | undefined | YES | undefined |
window.pageYOffset | YES | YES | YES | undefined |
document.body.scrollTop | YES | YES | YES | YES |
document.documentElement.scrollTop | 常に0 | YES | 常に0 | 常に0 |
Firefox 2.0, Firefox 1.5 | Opera 9 | Safari 3.0β | IE 7 IE 6 | |
---|---|---|---|---|
window.scrollY | YES | undefined | YES | undefined |
window.pageYOffset | YES | YES | YES | undefined |
document.body.scrollTop | 常に0 | YES | YES | 常に0 |
document.documentElement.scrollTop | YES | YES | 常に0 | YES |
先のコードでは古いChromeでは動作しませんでした。これは、古いChromeやMicrosoft EdgeといったWebkit準拠のブラウザでは document.documentElement.scrollTop は常に0の値を返すためです。古いChromeでは、document.documentElement.scrollTop ではなく、document.body.scrollTopを利用します。
古いChromeで正しく動作させるためには、ユーザーエージェントを判定して、古いChromeや古いIEではdocument.body.scrollTopを参照する動作にします。
以下のコードを記述します。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<style type="text/css">
<!--
.FloatInfo{
position:fixed;
top:16px;
right:16px;
width:240px;
height:60px;
background-color:#FFFFFF;
}
-->
</style>
<script type="text/javascript">
function onScroll() {
if (navigator.userAgent.toLowerCase().match(/webkit|msie 5/)) {
documentElement = document.body;
} else {
documentElement = document.documentElement;
}
var infoF = document.getElementById("infoFrame");
infoF.innerHTML = "ScrollY:" + documentElement.scrollTop;
}
window.onscroll = onScroll;
</script>
</head>
<body>
<div id="infoFrame" class="FloatInfo"></div>
<div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
<div style="height:120px;background-color:#808080">コンテンツ</div>
<div style="height:120px;background-color:#D0D0D0">コンテンツ</div>
</div>
</body>
</html>
navigator.userAgentでユーザーエージェントを取得し、ユーザーエージェントにWebkitの文字列が含まれる場合は、webkit系のブラウザと判定し、document.body.scrollTopを参照する動作にします。
古いChromeで上記のHTMLファイルを表示します。下図の画面が表示されます。
下方向にスクロールします。ScrollYの数値が増加します。
画面の一番上に戻ると、ScrollYの数値は0になります。
先のコードでは古いChromeでは動作しませんでした。これは、古いChromeやMicrosoft EdgeといったWebkit準拠のブラウザでは document.documentElement.scrollLeft は常に0の値を返すためです。古いChromeでは、document.documentElement.scrollLeft ではなく、document.body.scrollLeft を利用します。
古いChromeで正しく動作させるためには、ユーザーエージェントを判定して、古いChromeや古いIEではdocument.body.scrollLeft を参照する動作にします。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<style type="text/css">
<!--
.FloatInfo{
position:fixed;
top:16px;
right:16px;
width:240px;
height:60px;
background-color:#FFFFFF;
}
-->
</style>
<script type="text/javascript">
function onScroll() {
if (navigator.userAgent.toLowerCase().match(/webkit|msie 5/)) {
documentElement = document.body;
} else {
documentElement = document.documentElement;
}
var infoF = document.getElementById("infoFrame");
infoF.innerHTML = "ScrollX:" + documentElement.scrollLeft + "<br/>"
+ "ScrollY:" + documentElement.scrollTop;
}
window.onscroll = onScroll;
</script>
</head>
<body>
<div id="infoFrame" class="FloatInfo"></div>
<div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#eaeaff">コンテンツ</div>
<div style="height:120px;width:1600px;background-color:#9ebeee">コンテンツ</div>
</div>
</body>
</html>