質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

7914閲覧

scrollTop使用時、値の取得はできるが、値を挿入し移動させようとすると"is not defined"となってしまう

u_Tagae

総合スコア15

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/03/14 01:27

前提・実現したいこと

スマホ向けサイトで、モーダルウィンドウを使ったメニュー表示を作っています。

メニューボタン自体は__position:fixed__でウィンドウ上端に固定してあります。

ページをスクロールした状態で
1.メニューを開いた時
2.メニューを閉じた時
にそれぞれ表示中の背景部分を維持する予定です。

発生している問題・エラーメッセージ

メニューを開いた際の固定は__$(window).scrolltop()__から取得した値と__position:fixed__でうまく行っているのですが、
メニューを閉じる際にページ最上部に移動してしまいます。

以下、Chromeのデベロッパーツールで確認したエラーとなります。

ReferenceError: scrollTop is not defined at eval (eval at <anonymous> (http://○○○/:16:5), <anonymous>:1:1) at HTMLAnchorElement.<anonymous> (http://○○○/:264:5) at HTMLAnchorElement.dispatch (http://○○○/wp-includes/js/jquery/jquery.js?ver=1.12.4:3:12444) at HTMLAnchorElement.r.handle (http://○○○/wp-includes/js/jquery/jquery.js?ver=1.12.4:3:9173) message:"scrollTop is not defined" stack:"ReferenceError: scrollTop is not defined at eval (eval at <anonymous> (http://○○○/:16:5), <anonymous>:1:1) at HTMLAnchorElement.<anonymous> (http://○○○/:264:5) at HTMLAnchorElement.dispatch (http://○○○/wp-includes/js/jquery/jquery.js?ver=1.12.4:3:12444) at HTMLAnchorElement.r.handle (http://○○○/wp-includes/js/jquery/jquery.js?ver=1.12.4:3:9173)" __proto__:Error

該当のソースコード

html

1<script type='text/javascript' src='http://○○○/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script> 2<script type='text/javascript' src='http://○○○/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script> 345<script type="text/javascript"> 6 jQuery(document).ready(function ($) { 7 var current_scrollY; 8 var scroll2; 9 var switch_menu = false; 10 $('#menuButton').on('click', function () { 11 current_scrollY = $(window).scrollTop(); 12 $('#menuButton').toggleClass('Closed Open'); 13 $('#menuContainer').toggleClass('Closed Open'); 14 $('#container').toggleClass('Close Open') 15 16 if (switch_menu) { 17 $('#container').removeAttr('style'); 18$('body').prop({scrollTop: scroll2}); 19 ② switch_menu = false; 20 } else { 21 scroll2 = $(window).scrollTop(); 22 $('#container').css({ 23 position: 'fixed', 24 width: '100%', 25 top: -1 * current_scrollY, 26 }); 27 switch_menu = true; 28 } 29}); 30 }); 31</script>

試したこと

ソース①__$('body').prop({scrollTop: scroll2});__ を
①'  $(window).scrollTop(scroll2);
と変更した所、②、③に設置したブレークポイントでは見た目上想定位置に移動しているようなのですが、最終的にページ上部に移動しています。

補足情報(FW/ツールのバージョンなど)

WordPress 4.9.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、scrollTopというのはjQueryが生み出した存在なので、.propでの操作はできません。直接.scrollTop(値)で制御するか、.animate({scrollTop: 値})のようにするか、となります。

そして、「最終的にページ上部に移動」するのは、1つの可能性として「デフォルト操作」ということが考えられます。'#menuButton'<a href='#~~~'>のようなタグだと、「そのハッシュ位置に移動する」という機能がありますので、イベントで位置を制御したい場合にはreturn falseなどで打ち消す必要があります。

投稿2018/03/14 01:39

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

u_Tagae

2018/03/14 02:06

ご指摘の通り#menuButtonのhrefが#になっておりました。 <a href="javascript:void(0);" onClick="xxxx();">と変更した所想定通りの動きをしてくれました。 この度はありがとうございます。
guest

0

どちらかというと、
JavaScriptというより、CSSの当て方の方に原因があるように思えます。
そもそも、position: fixedを効かせているのなら、
top値を移動させる意味があるのか、という疑問があります。

ボタンを押すと、モーダルウィンドウが、右から左に出てくるという動きだと想定して、
モーダルウィンドウの初期CSSを、
下記にし、

css

1#modal { 2 position: fixed; 3 left: 100%; 4 top: 0; 5 width: 100%; 6 height: 100%; 7} 8 9#modal > div { 10 position: absolute; 11 left: 0; 12 top: 0; 13 width: 100%; 14 height: 100%; 15}

jQueryにて、ボタンを押した時の動作は、

javascript

1$("#modal > div").css({ 2 left: "-100%" 3});

とするのはいかがでしょうか。
要は、最初からモーダルウィンドウ自体は、fixedにして、スクロールに追従させて、
かつ画面外に追いやっておき、
ボタンを押すと、モーダルの子要素が、顔を出す、って感じです。
こっちの方が、javascriptでpositionをいちいち変えるより、うまくいきやすいと思います。

投稿2018/03/14 01:51

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

u_Tagae

2018/03/14 02:10

ご回答ありがとうございます。 position:fixedの件はメニュー表示中の背面のスクロールを禁止するために入れておりました。 本題にはあまり関係ない部分だったかもしれません。 誤解を招く表記をしてしまいすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問