javascriptの命令で画面をスクロールさせる
スクロールの設定について、試します。
以前の投稿(https://propansystem.net/blog/2022/04/26/post-7753/)では、スクロール位置を取得しましたが、
今回は、スクロールをjavascript側から設定する方法です。
スクロールを設定するメソッドは次のものがあります。
scrollTo()
scrollBy()
scrollToメソッドはスクロールの初期位置を設定します。
また、scrollByメソッドは、現在のスクロール位置から加算して、スクロール位置を設定します。
実際に次のようなサンプルを書いて試してみます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>テストHTML</title> </head> <body> <div id="test1" style="width: 5000px; height: 5000px;"> <div style="position:fixed; top:10px;"> <div>X座標:<span id="x1"></span></div> <div>Y座標:<span id="y1"></span></div> </div> </div> <script type="text/javascript"> // ウィンドウ取得 let window_test = window; // スクロールされたらメソッド「output_log_scroll」を呼ぶ window.addEventListener('scroll', output_log_scroll); // スクロール位置を強制指定 scrollTo(100, 200); // スクロールの現在位置から、座標を加算する(この場合は、500, 700の位置になる) scrollBy(400, 500); // スクロール位置(X座標、Y座標)を出力する function output_log_scroll() { // x座標出力用の要素を取得 let x1 = document.getElementById("x1"); let y1 = document.getElementById("y1"); // 要素を更新する x1.innerHTML = window_test.pageXOffset; y1.innerHTML = window_test.pageYOffset; console.log("window pageXOffset -> " + window_test.pageXOffset); console.log("window pageYOffset -> " + window_test.pageYOffset); } </script> </body> </html>
上記のソースと、実際にブラウザでアクセスしてみるとわかりますが、
最初のscrollToメソッドで「横方向に100、縦方向に200」のスクロール位置を決定していますが、
次のscrollByメソッドで「横方向に400、縦方向に500」のスクロール位置を決定していので
結果的に「横方向に500、縦方向に700」のスクロール位置になっていることがわかります。
動的にスクロール位置を変更する
次に、スクロール位置を動的に変更してみます。
実際の開発では利用機会はほとんどありませんが、ここでは実験的な意味をこめてサンプルを書いてみます。
サンプルHTMLは次のように書きました。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>テストHTML</title> </head> <body> <div id="test1" style="width: 5000px; height: 5000px;"> <div style="position:fixed; top:10px;"> <div>X座標:<span id="x1"></span></div> <div>Y座標:<span id="y1"></span></div> </div> </div> <script type="text/javascript"> // ウィンドウ取得 let window_test = window; // スクロールされたらメソッド「output_log_scroll」を呼ぶ window.addEventListener('scroll', output_log_scroll); // 50ミリ秒ごとに、スクロール値を加算していく setInterval(function() {scrollBy(10, 25)}, 50); // スクロール位置(X座標、Y座標)を出力する function output_log_scroll() { // x座標出力用の要素を取得 let x1 = document.getElementById("x1"); let y1 = document.getElementById("y1"); // 要素を更新する x1.innerHTML = window_test.pageXOffset; y1.innerHTML = window_test.pageYOffset; console.log("window pageXOffset -> " + window_test.pageXOffset); console.log("window pageYOffset -> " + window_test.pageYOffset); } </script> </body> </html>
画面にアクセスしてみると、50ミリ秒ごとに
scrollBy(10, 25)
を実行して、スクロール位置が変化することがわかります。
ただし、画面上にあるdivタグ
<div id="test1" style="width: 5000px; height: 5000px;"> <div style="position:fixed; top:10px;"> <div>X座標:<span id="x1"></span></div> <div>Y座標:<span id="y1"></span></div> </div> </div>
は、もともと幅、高さが5000pxのサイズを指定している為、スクロール位置がそれ以上になると、見た目の変化は止まります。
では、スクロールの加算が止まったあとは、setIntervalの命令はどうなるか、ログを入れて試してみます。
setInterval(function() {scrollBy(10, 25)}, 50);
を
let scroll_counter = 0; setInterval(function() { scroll_counter++; console.log('scroll_counter -> ' + scroll_counter); scrollBy(10, 25) }, 50);
という形で書き換えて実行してみます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>テストHTML</title> </head> <body> <div id="test1" style="width: 5000px; height: 5000px;"> <div style="position:fixed; top:10px;"> <div>X座標:<span id="x1"></span></div> <div>Y座標:<span id="y1"></span></div> </div> </div> <script type="text/javascript"> // ウィンドウ取得 let window_test = window; let scroll_counter = 0; // スクロールされたらメソッド「output_log_scroll」を呼ぶ window.addEventListener('scroll', output_log_scroll); // 50ミリ秒ごとに、スクロール値を加算していく setInterval(function() { scroll_counter++; console.log('scroll_counter -> ' + scroll_counter); scrollBy(10, 25) }, 50); // スクロール位置(X座標、Y座標)を出力する function output_log_scroll() { // x座標出力用の要素を取得 let x1 = document.getElementById("x1"); let y1 = document.getElementById("y1"); // 要素を更新する x1.innerHTML = window_test.pageXOffset; y1.innerHTML = window_test.pageYOffset; console.log("window pageXOffset -> " + window_test.pageXOffset); console.log("window pageYOffset -> " + window_test.pageYOffset); } </script> </body> </html>
実際に画面アクセスして開発者ツールでログを確認すると、スクロールの動きが止まってもscrollByの命令は実行され続けています。
サンプルとして実験的に書いたプログラムなので、実際の開発ではこのようなことはしませんが、スクロールメソッドとその挙動を確認する為に試してみました。