ホームページでリンクジャンプすると、表示位置はページの先頭位置になります。それは当然のことです。途中から表示されても見づらいものです。
しかしながら、PHPプログラムだとそれが仇になることがあります。
管理画面等での記事の上下入れ替えや、ボタン選択処理などです。
表示位置がボタンを押すごとに表示位置が先頭に戻ると、思いのほか使い勝手が悪くなります。
PHPでボタンクリック時に、表示位置をキープする方法がないかとググって調べて試してみたところ、うまくできましたので忘備録として記録いたします。
現象はこのような感じです。
まずは以下のプログラムを見てください。
ボタンを押すと表示位置が先頭に戻る例
スクロールして、下のほうを見るとボタンがあります。
このボタンをクリックすると、ページが再表示されるのですが、その際に表示位置が先頭に戻ります。
これを、ボタンを押しても表示位置をそのままキープできるようにします。
まずは、表示位置をキープできるように対応したプログラムをご覧ください。
ボタンを押しても表示位置がキープできるようにしたプログラムをご覧ください。
ボタンを押しても表示位置がキープされます。
やればできるものです。
ところで、ここで疑問がわいてきませんか?
一体どうやってPHPから表示位置をキープしているのだろうと?
疑問?表示位置は具体的にどうやってキープしているの?
一番関心のある部分ではないでしょうか?
サーバーサイドから、ブラウザサイドへ命令を出すことはできません。
表示に関してはブラウザに一任されており、表示位置のキープはブラウザ側でなければできません。
ではどうやってPHPから表示位置をキープさせているのか?
その原理を解説いたします。
Jquery $(window).scrollTop() 関数で表示位置をキープ
実際にキープしている方法は、Javascript(Jquery)を使用しています。
Jqueryに 【$(window).scrollTop() 】 という関数があり、この関数には2つの特性があります。
- 現在のスクロール位置を返す
- 指定スクロール位置へスクロールする
PHP側で現在のスクロール位置を、指定スクロール位置として表示する
ボタンを押したときに、1.の機能で現在のスクロール位置を取得し、PHPへデータとして送信します。
PHP側で受信した現在のスクロール位置を、指定スクロール位置として表示します。
この2つの工程だけで、表示位置がキープできるようになります。
とは言っても、「言うは易し」です。
具体的にどのように行っているのか、プログラムソースを踏まえて解説いたします。
具体的なコーディング方法
以下に表示位置をキープするサンプルプログラムソースを記載いたします。
<?php
// (5)▼▼▼
$position = 0;
// (5)▲▲▲
$msg = null;
// (6)▼▼▼
if ((isset($_REQUEST["position"]) == true) // ボタンが押された?
&& (isset($_REQUEST["reset"]) != true)) // リセットボタンでない?
{
// (6)▲▲▲
// (7)▼▼▼
$position = $_REQUEST["position"];
// (7)▲▲▲
$msg = "【ボタンが押されましたが、表示位置がキープされました。】";
}
// 日付情報をセット
$today = date("Y/m/d h:i:s");
$time = "<p class=\"time\">■ただ今の時間<br>[${today}]</p>";
?>
<!doctype html>
<html>
<head>
<meta charset="shift_jis">
<title>位置テスト</title>
<style type="text/css">
article
{
width: 800px;
margin-right: auto;
margin-left: auto;
border: 1px solid #CCC;
text-align: center;
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
padding-top: 30px;
padding-right: 30px;
padding-bottom: 600px;
padding-left: 30px;
}
p
{
text-align: justify;
}
input[type=submit],
input[type=button]
{
padding-top: 20px;
padding-right: 20px;
padding-bottom: 20px;
padding-left: 29px;
}
.center
{
text-align: center;
margin-bottom: 300px;
}
.time
{
text-align: right;
}
.msg
{
color: #F00;
text-align: center;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(document).ready(function()
{
// (2)▼▼▼
window.onload = function (){ $(window).scrollTop(<?php echo $position; ?>);}
// (2)▲▲▲
// (3)▼▼▼
$("input[type=button]").click(function()
{
// (3)▲▲▲
// (4)▼▼▼
var position = $(window).scrollTop();
$("input:hidden[name=position]").val(position);
// (4)▲▲▲
$("#form").submit();
});
});
</script>
</head>
<body>
<article>
<section>
<p class="time"><?php echo $time; ?></p>
<h1>フォームボタンクリックで表示位置のキープに対応</h1>
<p>
下のフォームボタンを押して、プログラムに送信すると表示位置がキープした状態で再表示されます。
</p>
<p>
試しに、画面のかなり下にあるボタンを押してみてください。<br>
表示位置がボタンの位置のままキープされます。
</p>
<p class="center">↓ボタンはもう少し下にあります。↓</p>
<p class="center">↓ボタンはもう少し下にあります。↓</p>
<p class="center">↓ボタンはもう少し下にあります。↓</p>
</section>
<section>
<form id="form" action="" method="post" enctype="application/x-www-form-urlencoded">
<!-- (1)▼▼▼ -->
<input name="position" type="hidden" value="0">
<!-- (1)▲▲▲ -->
<input name="send" type="button" value="押すと表示位置がキープされます">
<input name="reset" type="submit" value="リセット">
</form>
<p class="msg"><?php echo $msg; ?></p>
</section>
</article>
</body>
</html>
プログラムは全体から眺めるより、部分的に見たほうがわかりやすいものです。
以下にパーツごとに記載いたします。
(1)表示位置をPHP側に送信するための仕掛けを入れる
<!-- (1)▼▼▼ -->
<input name="position" type="hidden" value="0">
<!-- (1)▲▲▲ -->
フォームの中に、非表示項目として現在の表示位置を設定します。
初期値は0でOKです。
なぜ0でよいかというと、ボタンを押したときにJqueryを使用してあとから設定するためです。
(2)ブラウザで表示時に指定位置へ自動スクロールする
// (2)▼▼▼
window.onload = function (){ $(window).scrollTop(<?php echo $position; ?>);}
// (2)▲▲▲
ページ表示時に、指定スクロール位置に合わせます。
この時指定スクロール位置はPHPから渡されます。
この部分に、ボタンを押した時点のスクロール位置をセットすることで、表示位置のキープを実現しています。
ここが今回の処理の一番肝になる部分です。
ここが理解できれば後は簡単です。
(3)ボタンが押されたかを判断します。
// (3)▼▼▼
$("input[type=button]").click(function()
{
// (3)▲▲▲
いきなりサブミットすると、現在のスクロール位置をキープできないため、Jquery側でサブミットするようにします。
(4)現在のスクロール位置を(1)の非表示フォームにセットします。
// (4)▼▼▼
var position = $(window).scrollTop();
$("input:hidden[name=position]").val(position);
// (4)▲▲▲
(1)で非表示フォームにスクロール位置を0を設定していましたが、ボタンを押した際に、現在のスクロール位置を非表示項目にセットしています。
Jqeryで動的に設定した値も、キチンとPHPに送信されます。
(5)PHP側でスクロール位置の初期化を行う。
// (5)▼▼▼
$position = 0;
// (5)▲▲▲
(1)に表示するスクロール位置を0で初期化します。
これは、ボタンを押されなかった時の初期表示位置を先頭位置にするためです。
例えば、ここに100を設定すると、初期表示位置が100ピクセル位置になります。
(6)ボタンが押されたかどうかの判断
// (6)▼▼▼
if ((isset($_REQUEST["position"]) == true) // ボタンが押された?
&& (isset($_REQUEST["reset"]) != true)) // リセットボタンでない?
{
// (6)▲▲▲
ボタンが押されると、$_REQUEST変数にフォームからのname=positionが設置されます。
その特性を利用し、position値がセットされていたらボタンが押されたと判断しています。
同様に”reset”を判断しているのは、リセットボタンが押されたときは何もしないためです。
(7)渡されたスクロール位置を(2)の位置へ表示
// (7)▼▼▼
$position = $_REQUEST["position"];
// (7)▲▲▲
フォームから送信されたスクロール位置情報を、(2)の初期スクロール位置へ設定します。
これにより、スクロール位置のキープを実現しています。
PHPとJqueryの連携はやればできる。
PHPはサーバー側で動作するプログラムです。
Jqueryはブラウザ側で動作するプログラムです。
一見接点が全くないプログラム同士ですが、やり方次第では互いに連携することができます。
実際に今回の例も、スクロール位置はブラウザ側のJqueryで求め、再表示時のスクロール位置はサーバー側のPHPで表示しています。
その分処理は複雑化してゆきますが、工夫することでプログラム制作の幅が広がります。