teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード変更/文章変更

2021/11/07 11:16

投稿

sasa_
sasa_

スコア140

answer CHANGED
@@ -1,153 +1,23 @@
1
- 先のコメントにありましたように、最低限問題の事象が再現できるコードをご提示いただくと良いと思います。ご自身の開発環境でご質問のコードのみで構成されたhtmlファイルを作成してみたとき、質問内容と同じ状況は確認できないはずです。
2
- お急ぎ気持ちは大変よく分かりますが、問題の切り分ができていないと別な部分に問題がある場合に解決できません
1
+ コード修正を受、再度回答させていただきま
3
- また、回答者に「丸投げの質問」に感じられることがあります。そのような場合はサイトの趣旨と異なるため回答は少なくなります。
4
- 、試したことは「意味がありませんでした」では構文エラーなのか動かなかったのか、動いが期待する動作でなくどのように動いたのかが分かりません。ご期待に沿う回答をするために、意味がなかった「理由・原因」を知りたのです。
2
+ 開いメニュー側をトップに戻したいとのことなの、「openをクリックしたときメニューを入れ要素スクロール位置を0にする」まは「closeするとき、メニューを入れ要素スクロール位置0にする」処理行うと良かと思います。
5
- 以下、ちょっと長いのですが...読みにくかったらごめんなさい。
6
- JavaScriptは問題と思われる部分のみ解説しています。clickイベントやfunctionの意味や書き方について不明な点はご自身でお調べ頂けますと幸いです。
7
3
 
8
- 下記CSSはご質問内容から最低限必要思われるCSSで
4
+ 現在JavaScriptは「クローズしたき、`.bl_panel`のスクロール位置を0にす」となっています。しかし、`.bl_panel`にはCSSで`height: 100vh`が設定されているため、そもそもスクロールが発生しません
9
- (ご相談内容と異なっていたらすみせん!)
5
+ 実際にスクロールが発生するは`overflow: auto`を設定している`.bl_panel.panelactive .bl_panel_inner`なので、`.bl_panel_inner`にscrollTopを指定しす。
10
- ```CSS
11
6
 
12
- .bl_panel {
13
- width: 100%;
14
- height: 100vh;
15
- background-color: rgba(266,162,172,0.8);
7
+ `$('.el_headerNav_btn__open').click(`または`$('.el_headerNav_btn__close, .bl_headerNav_link').click()`のどちらかで`$('.bl_panel_inner').scrollTop(0);`を実行します。
16
- position: fixed;
17
- top: 0;
18
- left: 0;
19
- transition: all .5s;
20
- opacity: 0;
21
- z-index: -1;
22
- }
23
- .bl_panel.panelactive {
24
- opacity: 1;
25
- z-index: 999;
26
- }
27
- .bl_panel.panelactive .bl_panel_inner {
8
+ CSSが`.bl_panel.panelactive .bl_panel_inner`なので、実行位置は`panelactive`をつけた後か、外す前です。
28
- position: fixed;
29
- top: 0;
30
- left: 0;
31
- width: 100%;
32
- height: 100vh;
33
- overflow: auto;
34
- -webkit-overflow-scrolling: touch;
35
- }
36
- .bl_panel_inner nav {
37
- z-index: 999;
38
- width: 100%;
39
- }
40
- /* 再現用 */
41
- /* ヘッダーを可視化 */
42
- header#ly_header {
43
- width: 100%;
44
- height: 100px;
45
- position: sticky;
46
- top: 0;
47
- left: 0;
48
- background: #333;
49
- }
50
- .el_headerNav_btn.el_headerNav_btn__open {
51
- width: 100px;
52
- height: 100px;
53
- background: #ccc;
54
- }
55
- .el_headerNav_btn.el_headerNav_btn__close {
56
- width: 100px;
57
- height: 100px;
58
- background: #0ff;
59
- }
60
- /* コンテンツに高さを追加 */
61
- .content {
62
- height: 50vh;
63
- }
64
- ```
65
9
 
66
- 下記HTMLはbody内に必要と思われるCSSです。
67
- ```HTML
68
10
 
69
- <header id="ly_header">
70
- <div class="ly_header_inner">
71
- <div class="el_headerNav_btn el_headerNav_btn__open"></div>
72
- <div class="bl_panel">
73
- <div class="bl_panel_inner">
74
- <div class="el_headerNav_btn el_headerNav_btn__close"></div>
75
- <nav>
76
- <ul class="bl_headerNav">
77
- <li class="bl_headerNav_item blurTrigger">
78
- <a href="#top" class="bl_headerNav_link">TOP</a>
79
- </li>
80
- <li class="bl_headerNav_item blurTrigger">
81
- <a href="#about" class="bl_headerNav_link">ABOUT</a>
82
- </li>
83
- <li class="bl_headerNav_item blurTrigger">
84
- <a href="#menu" class="bl_headerNav_link">MENU</a>
85
- </li>
86
- <li class="bl_headerNav_item blurTrigger">
87
- <a href="#contact" class="bl_headerNav_link">CONTACT</a>
11
+ 下記は開くときにつけたパターン。オープン時はclassが付いていないので、addClass`でclassをつけた後に実行します。クローズ時に実行するなら、classを外す前にscrollTopでトップに戻しておきます。
88
- </li>
89
- <li class="bl_headerNav_item blurTrigger">
90
- <a href="#blog" class="bl_headerNav_link">BLOG</a>
91
- </li>
92
- </ul>
93
- </nav>
94
- </div><!--.bl_panel_inner-->
95
- </div><!--.bl_panel-->
96
- </div><!--.ly_header_inner-->
97
- </header>
98
- <div class="content" id="top">TOP</div>
99
- <div class="content" id="about">ABOUT</div>
100
- <div class="content" id="menu">MENU</div>
101
- <div class="content" id="contact">CONTACT</div>
102
- <div class="content" id="blog">BLOG</div>
103
- ```
104
12
 
105
- 問題のJavaScriptですが、どの要素に対してscrollTopを指定しましたか?
106
- close用の要素にscrollTopを指定することでTOPに戻ることができます。
107
- 下記は`.el_headerNav_btn__close` をクリックしたとき、「トップにスクロールする」「`.panelactive` を削除する」の2つの処理を実行します。
108
-
109
13
  ```JavaScript
110
-
111
- $('.el_headerNav_btn__close').on('click', function() {
14
+ $('.el_headerNav_btn__open').click(function(){
112
- $('body, html').animate({
15
+ scrollPosition = $(window).scrollTop();
113
- scrollTop: 0
16
+ $('body').addClass('fixed').css({'top': -scrollPosition});
114
- }, 300);
115
- $('.bl_panel').removeClass('panelactive');
17
+ $('.bl_panel').addClass('panelactive');
18
+ $('.bl_panel_inner').scrollTop(0);
116
- });
19
+ });
117
20
  ```
118
21
 
119
- このとき、下記のように`.el_headerNav_btn__close, .bl_headerNav_link` と指定すると期待通りに動きません。ナビゲーションリンクをクリックしたときも動作対象に含まれるためです。
120
- ナビゲーションリンクをクリックしてTOPに戻っては意味がありません。
121
22
 
122
- ```JavaScript
123
-
124
- $('.el_headerNav_btn__close, .bl_headerNav_link').on('click', function() {
125
- $('body, html').animate({
126
- scrollTop: 0
23
+ お体ご自愛くださいませ。
127
- }, 300);
128
- $('.bl_panel').removeClass('panelactive');
129
- });
130
- ```
131
-
132
-
133
- この問題は、たとえば「開くボタンをクリックしたとき「閉じるボタンをクリックしたとき」「リンクをクリックしたとき」それぞれに処理を指定することで解決できます。
134
- 分かりやすくそれぞれのclickイベントに対して個別に処理したものが下記です。
135
- ご相談の、「閉じるボタンでTopに戻る」はこちらで解決できるのではないかと推察いたします。
136
- ```JavaScript
137
-
138
- // 開くボタンをクリックしたとき
139
- $('.el_headerNav_btn__open').on('click', function() {
140
- $('.bl_panel').addClass('panelactive');
141
- });
142
- // 閉じるボタンをクリックしたとき
143
- $('.el_headerNav_btn__close').on('click', function() {
144
- $('body, html').animate({
145
- scrollTop: 0
146
- }, 300);
147
- $('.bl_panel').removeClass('panelactive');
148
- });
149
- // ナビリンクをクリックしたとき
150
- $('.bl_headerNav_link').on('click', function() {
151
- $('.bl_panel').removeClass('panelactive');
152
- });
153
- ```