回答編集履歴

4

コードの修正

2020/07/08 08:55

投稿

nekora
nekora

スコア501

test CHANGED
@@ -150,6 +150,16 @@
150
150
 
151
151
  // Must change focus!
152
152
 
153
+ var oldScroll = $(window).scrollTop();
154
+
155
+ $(window).one('scroll', function() { //focus()の直前に一度だけ機能するscrollのイベントリスナを設定
156
+
157
+ $(window).scrollTop(oldScroll); //focus()によるスクロールを一度だけ上書きして無効化する。
158
+
159
+ });
160
+
161
+
162
+
153
163
  target.focus(); //targetは既にjQueryオブジェクトになっているから変換は不要
154
164
 
155
165
  if (target.is(":focus")) {
@@ -162,6 +172,14 @@
162
172
 
163
173
  target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
164
174
 
175
+ var oldScroll = $(window).scrollTop();
176
+
177
+ $(window).one('scroll', function() { //focus()の直前に一度だけ機能するscrollのイベントリスナを設定
178
+
179
+ $(window).scrollTop(oldScroll); //focus()によるスクロールを一度だけ上書きして無効化する。
180
+
181
+ });
182
+
165
183
  target.focus(); // Set focus again
166
184
 
167
185
  }
@@ -318,12 +336,6 @@
318
336
 
319
337
 
320
338
 
321
- ~~HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
322
-
323
- ```は必要かもしれません。そちらで動作確認し、適宜対応してください。~~
324
-
325
-
326
-
327
339
  firefoxのみ正しく動いて見えたのはfirefoxにバグがあってスクロールしなかったからで
328
340
 
329
341
  firefox以外のブラウザの動作が正常動作です。
@@ -335,3 +347,31 @@
335
347
 
336
348
 
337
349
  はぁ、プラグインもテストしてて予想外に疲れた・・・
350
+
351
+
352
+
353
+ ### 追記:更なる改良でほぼfocus()のスクロールをIE以外で無効化できましたので、再再度ソースを差し替えました
354
+
355
+
356
+
357
+ focus()の直前に以下のコードを入れておくと最後に追加しているイベントハンドラと合わせて
358
+
359
+ ほぼ無効化できました。
360
+
361
+ focus()の直前に以下のコードを入れ込む
362
+
363
+ ```javascript
364
+
365
+ var oldScroll = $(window).scrollTop();
366
+
367
+ $(window).one('scroll', function() { //focus()の直前に一度だけ機能するscrollのイベントリスナを設定
368
+
369
+ $(window).scrollTop(oldScroll); //focus()によるスクロールを一度だけ上書きして無効化する。
370
+
371
+ });
372
+
373
+ ```
374
+
375
+
376
+
377
+ このコードと、最後に追加した'focusin focus'イベントリスナの2重のガードで、IE以外は完全に動作が正常化されました。

3

説明文の修正

2020/07/08 08:54

投稿

nekora
nekora

スコア501

test CHANGED
@@ -324,6 +324,10 @@
324
324
 
325
325
 
326
326
 
327
+ firefoxのみ正しく動いて見えたのはfirefoxにバグがあってスクロールしなかったからで
328
+
329
+ firefox以外のブラウザの動作が正常動作です。
330
+
327
331
  動作確認してみたところ、IEはバグっててダメでした、edge(WEBから落としてきた最新版のedge),chrome,firefoxでは一応問題ありませんでしたが、chromeでまれにスクロールする事がありましたが再度クリックで直ります。
328
332
 
329
333
  その他についてはソースにコメントを入れてあるので参照してください。

2

全ソース公開を受けて、コードの修正

2020/07/08 00:57

投稿

nekora
nekora

スコア501

test CHANGED
@@ -1,113 +1,333 @@
1
- HTMLが提示されてないので仮のクラス名を使ってます。
1
+ ~~HTMLが提示されてないので仮のクラス名を使ってます。~~
2
+
3
+ ### 全ソース公開を受けてソースコードを差し替えました
4
+
5
+ jQueryプラグインSTICKY NAVIGATIONを使っているんですね。
6
+
7
+
8
+
9
+ **プラグインを使用している場合はそのことを明記し、プラグインの公式へのリンクも記述してください。またスクリプトの一部だけではなく、全文を公開してください。おかげでプラグインあるのかー。ちゃんと問題ないかプラグインに影響を与えていないかテストしてて回答が遅れました**
2
10
 
3
11
 
4
12
 
5
13
  ```JavaScript
6
14
 
7
- $('a[href*="#"]')
8
-
9
- // Remove links that don't actually link to anything
10
-
11
- .not('[href="#"]')
12
-
13
- .not('[href="#0"]')
14
-
15
- .click(function (event) {
16
-
17
- // On-page links
18
-
19
- if (
20
-
21
- location.pathname.replace(/^//, "") ==
22
-
23
- this.pathname.replace(/^//, "") &&
24
-
25
- location.hostname == this.hostname
26
-
27
- ) {
28
-
29
- // Figure out element to scroll to
30
-
31
- var target = $(this.hash);
32
-
33
- target = target.length
34
-
35
- ? target
36
-
37
- : $("[name=" + this.hash.slice(1) + "]");
38
-
39
- // Does a scroll target exist?
40
-
41
- if (target.length) {
42
-
43
- // Only prevent default if animation is actually gonna happen
44
-
45
- //event.preventDefault(); //下で return false;でデフォルトの処理を無効化しているので不要
46
-
47
- // スクロールのオフセット値
48
-
49
- var offsetY = jQuery('.nav-header').outerHeight(); //ナビゲーションバーのクラス名ないしはIDなどで特定し要素の高さを得る。PCとスマホでナビゲーションバーの高さが違ってもこういう取得の仕方であれば問題ない
50
-
51
-
52
-
53
- $("html, body").animate(
54
-
55
- {
56
-
57
- scrollTop: target.offset().top - offsetY, //ナビゲーションバーの高さ分手前でスクロール
58
-
59
- },
60
-
61
- 1000,
62
-
63
-
64
-
65
- function () {
66
-
67
- // Callback after animation
68
-
69
- // Must change focus!
70
-
71
- var $target = $(target);
72
-
73
- $target.focus();
74
-
75
- if ($target.is(":focus")) {
76
-
77
- // Checking if the target was focused
78
-
79
- return false;
80
-
81
- } else {
82
-
83
- $target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
84
-
85
- $target.focus(); // Set focus again
15
+ $(function () {
16
+
17
+ /*FOR STICKY NAVIGATION*/
18
+
19
+ var offsetY;
20
+
21
+ if (!$("nav").hasClass("sticky")) {
22
+
23
+ offsetY = $("nav").addClass("sticky").outerHeight();
24
+
25
+ $("nav").removeClass("sticky");
26
+
27
+ } else {
28
+
29
+ offsetY = $("nav").outerHeight();
30
+
31
+ }
32
+
33
+
34
+
35
+ $(".js--section-features").waypoint(
36
+
37
+ function (direction) {
38
+
39
+ if (direction == "down") {
40
+
41
+ $("nav").addClass("sticky");
42
+
43
+ } else {
44
+
45
+ $("nav").removeClass("sticky");
46
+
47
+ }
48
+
49
+ },
50
+
51
+ {
52
+
53
+ offset: offsetY,
54
+
55
+ }
56
+
57
+ );
58
+
59
+ $(".js--scroll-to-plans").click(function () {
60
+
61
+ $("html,body").animate(
62
+
63
+ {
64
+
65
+ scrollTop: $(".js--section-plans").offset().top - offsetY,
66
+
67
+ },
68
+
69
+ 1000
70
+
71
+ );
72
+
73
+ });
74
+
75
+
76
+
77
+ $(".js--scroll-to-start").click(function () {
78
+
79
+ $("html,body").animate(
80
+
81
+ {
82
+
83
+ scrollTop: $(".js--section-features").offset().top - offsetY,
84
+
85
+ },
86
+
87
+ 1000
88
+
89
+ );
90
+
91
+ });
92
+
93
+
94
+
95
+ $('a[href*="#"]')
96
+
97
+ // Remove links that don't actually link to anything
98
+
99
+ .not('[href="#"]')
100
+
101
+ .not('[href="#0"]')
102
+
103
+ .click(function (event) {
104
+
105
+ // On-page links
106
+
107
+ if (
108
+
109
+ location.pathname.replace(/^//, "") ==
110
+
111
+ this.pathname.replace(/^//, "") &&
112
+
113
+ location.hostname == this.hostname
114
+
115
+ ) {
116
+
117
+ // Figure out element to scroll to
118
+
119
+ var target = $(this.hash); //ここでjQueryオブジェクトに変換済み
120
+
121
+ target = target.length
122
+
123
+ ? target
124
+
125
+ : $("[name=" + this.hash.slice(1) + "]");
126
+
127
+ // Does a scroll target exist?
128
+
129
+ if (target.length) {
130
+
131
+ // Only prevent default if animation is actually gonna happen
132
+
133
+ //event.preventDefault();
134
+
135
+
136
+
137
+ $("html,body").animate(
138
+
139
+ {
140
+
141
+ scrollTop: target.offset().top - offsetY,
142
+
143
+ },
144
+
145
+ 1000,
146
+
147
+ function () {
148
+
149
+ // Callback after animation
150
+
151
+ // Must change focus!
152
+
153
+ target.focus(); //targetは既にjQueryオブジェクトになっているから変換は不要
154
+
155
+ if (target.is(":focus")) {
156
+
157
+ // Checking if the target was focused
158
+
159
+ return false;
160
+
161
+ } else {
162
+
163
+ target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
164
+
165
+ target.focus(); // Set focus again
166
+
167
+ }
86
168
 
87
169
  }
88
170
 
171
+ );
172
+
89
- }
173
+ }
90
-
91
- );
92
-
93
- // ハッシュ書き換えとく、これで戻るボタンでページ内移動の履歴にしたがって戻ってくれる。
94
-
95
- window.history.pushState(null, null, this.hash);
96
-
97
- // デフォルトの処理はキャンセル
98
-
99
- return false;
100
174
 
101
175
  }
102
176
 
177
+ });
178
+
179
+
180
+
181
+ $(".js--wp-1").waypoint(
182
+
183
+ function (direction) {
184
+
185
+ $(".js--wp-1").addClass("animated animate__fadeIn");
186
+
187
+ },
188
+
189
+ {
190
+
191
+ offset: "50%",
192
+
193
+ }
194
+
195
+ );
196
+
197
+
198
+
199
+ $(".js--wp-2").waypoint(
200
+
201
+ function (direction) {
202
+
203
+ $(".js--wp-2").addClass("animated animate__fadeInUp");
204
+
205
+ },
206
+
207
+ {
208
+
209
+ offset: "50%",
210
+
211
+ }
212
+
213
+ );
214
+
215
+
216
+
217
+ $(".js--wp-3").waypoint(
218
+
219
+ function (direction) {
220
+
221
+ $(".js--wp-3").addClass("animated animate__fadeIn");
222
+
223
+ },
224
+
225
+ {
226
+
227
+ offset: "50%",
228
+
229
+ }
230
+
231
+ );
232
+
233
+
234
+
235
+ $(".js--wp-4").waypoint(
236
+
237
+ function (direction) {
238
+
239
+ $(".js--wp-4").addClass("animated animate__pulse");
240
+
241
+ },
242
+
243
+ {
244
+
245
+ offset: "50%",
246
+
247
+ }
248
+
249
+ );
250
+
251
+
252
+
253
+ $(".js--nav-icon").click(function () {
254
+
255
+ var nav = $(".js--main-nav");
256
+
257
+ var icon = $(".js--nav-icon i");
258
+
259
+
260
+
261
+ nav.slideToggle(200);
262
+
263
+
264
+
265
+ if (icon.hasClass("ion-navicon-round")) {
266
+
267
+ icon.addClass("ion-close-round");
268
+
269
+ icon.removeClass("ion-navicon-round");
270
+
271
+ } else {
272
+
273
+ icon.addClass("ion-navicon-round");
274
+
275
+ icon.removeClass("ion-close-round");
276
+
103
277
  }
104
278
 
105
279
  });
106
280
 
281
+ });
282
+
283
+
284
+
285
+ // フォーカス系のイベントでのスクロール処理をキャンセルする。
286
+
287
+ //
288
+
289
+ // firefox以外のブラウザは要素がフォーカスされた場合、フォームのテキストエリアなど入力がスムーズに
290
+
291
+ // 出来るように、その要素をスクロールさせる。(正常な動き)その後その要素に対してselectが
292
+
293
+ // 発生します。
294
+
295
+ // firefoxはバグっててスクロールせずにフォーカスだけがあたる。
296
+
297
+ //
298
+
299
+ // コード内で要素.focus()する場合は、この解決策でも回避できない場合があります
300
+
301
+ // これでもたまにスクロールすることがあり、もう一度クリックすれば直ります。
302
+
303
+ // ブラウザ側の実装の問題なのでこれ以上は対処できません。
304
+
305
+ //
306
+
307
+ // 問題が無ければ、要素.focus()ではなく、要素.select()を検討してみて下さい
308
+
309
+ // そうすれば、スクロールの問題は解決するはずです。
310
+
311
+ $('section').bind('focusin focus', function(event){
312
+
313
+ event.preventDefault();
314
+
315
+ });
316
+
107
317
  ```
108
318
 
109
319
 
110
320
 
111
- HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
321
+ ~~HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
112
-
322
+
113
- ```は必要かもしれません。そちらで動作確認し、適宜対応してください。
323
+ ```は必要かもしれません。そちらで動作確認し、適宜対応してください。~~
324
+
325
+
326
+
327
+ 動作確認してみたところ、IEはバグっててダメでした、edge(WEBから落としてきた最新版のedge),chrome,firefoxでは一応問題ありませんでしたが、chromeでまれにスクロールする事がありましたが再度クリックで直ります。
328
+
329
+ その他についてはソースにコメントを入れてあるので参照してください。
330
+
331
+
332
+
333
+ はぁ、プラグインもテストしてて予想外に疲れた・・・

1

説明を修整

2020/07/07 22:13

投稿

nekora
nekora

スコア501

test CHANGED
@@ -105,3 +105,9 @@
105
105
  });
106
106
 
107
107
  ```
108
+
109
+
110
+
111
+ HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
112
+
113
+ ```は必要かもしれません。そちらで動作確認し、適宜対応してください。