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

回答編集履歴

4

コードの修正

2020/07/08 08:55

投稿

nekora
nekora

スコア501

answer CHANGED
@@ -74,12 +74,21 @@
74
74
  function () {
75
75
  // Callback after animation
76
76
  // Must change focus!
77
+ var oldScroll = $(window).scrollTop();
78
+ $(window).one('scroll', function() { //focus()の直前に一度だけ機能するscrollのイベントリスナを設定
79
+ $(window).scrollTop(oldScroll); //focus()によるスクロールを一度だけ上書きして無効化する。
80
+ });
81
+
77
82
  target.focus(); //targetは既にjQueryオブジェクトになっているから変換は不要
78
83
  if (target.is(":focus")) {
79
84
  // Checking if the target was focused
80
85
  return false;
81
86
  } else {
82
87
  target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
88
+ var oldScroll = $(window).scrollTop();
89
+ $(window).one('scroll', function() { //focus()の直前に一度だけ機能するscrollのイベントリスナを設定
90
+ $(window).scrollTop(oldScroll); //focus()によるスクロールを一度だけ上書きして無効化する。
91
+ });
83
92
  target.focus(); // Set focus again
84
93
  }
85
94
  }
@@ -158,12 +167,23 @@
158
167
  });
159
168
  ```
160
169
 
161
- ~~HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
162
- ```は必要かもしれません。そちらで動作確認し、適宜対応してください。~~
163
-
164
170
  firefoxのみ正しく動いて見えたのはfirefoxにバグがあってスクロールしなかったからで
165
171
  firefox以外のブラウザの動作が正常動作です。
166
172
  動作確認してみたところ、IEはバグっててダメでした、edge(WEBから落としてきた最新版のedge),chrome,firefoxでは一応問題ありませんでしたが、chromeでまれにスクロールする事がありましたが再度クリックで直ります。
167
173
  その他についてはソースにコメントを入れてあるので参照してください。
168
174
 
169
- はぁ、プラグインもテストしてて予想外に疲れた・・・
175
+ はぁ、プラグインもテストしてて予想外に疲れた・・・
176
+
177
+ ### 追記:更なる改良でほぼfocus()のスクロールをIE以外で無効化できましたので、再再度ソースを差し替えました
178
+
179
+ focus()の直前に以下のコードを入れておくと最後に追加しているイベントハンドラと合わせて
180
+ ほぼ無効化できました。
181
+ focus()の直前に以下のコードを入れ込む
182
+ ```javascript
183
+ var oldScroll = $(window).scrollTop();
184
+ $(window).one('scroll', function() { //focus()の直前に一度だけ機能するscrollのイベントリスナを設定
185
+ $(window).scrollTop(oldScroll); //focus()によるスクロールを一度だけ上書きして無効化する。
186
+ });
187
+ ```
188
+
189
+ このコードと、最後に追加した'focusin focus'イベントリスナの2重のガードで、IE以外は完全に動作が正常化されました。

3

説明文の修正

2020/07/08 08:54

投稿

nekora
nekora

スコア501

answer CHANGED
@@ -161,6 +161,8 @@
161
161
  ~~HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
162
162
  ```は必要かもしれません。そちらで動作確認し、適宜対応してください。~~
163
163
 
164
+ firefoxのみ正しく動いて見えたのはfirefoxにバグがあってスクロールしなかったからで
165
+ firefox以外のブラウザの動作が正常動作です。
164
166
  動作確認してみたところ、IEはバグっててダメでした、edge(WEBから落としてきた最新版のedge),chrome,firefoxでは一応問題ありませんでしたが、chromeでまれにスクロールする事がありましたが再度クリックで直ります。
165
167
  その他についてはソースにコメントを入れてあるので参照してください。
166
168
 

2

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

2020/07/08 00:57

投稿

nekora
nekora

スコア501

answer CHANGED
@@ -1,57 +1,167 @@
1
- HTMLが提示されてないので仮のクラス名を使ってます。
1
+ ~~HTMLが提示されてないので仮のクラス名を使ってます。~~
2
+ ### 全ソース公開を受けてソースコードを差し替えました
3
+ jQueryプラグインSTICKY NAVIGATIONを使っているんですね。
2
4
 
5
+ **プラグインを使用している場合はそのことを明記し、プラグインの公式へのリンクも記述してください。またスクリプトの一部だけではなく、全文を公開してください。おかげでプラグインあるのかー。ちゃんと問題ないかプラグインに影響を与えていないかテストしてて回答が遅れました**
6
+
3
7
  ```JavaScript
4
- $('a[href*="#"]')
5
- // Remove links that don't actually link to anything
6
- .not('[href="#"]')
7
- .not('[href="#0"]')
8
- .click(function (event) {
8
+ $(function () {
9
- // On-page links
9
+ /*FOR STICKY NAVIGATION*/
10
- if (
10
+ var offsetY;
11
- location.pathname.replace(/^//, "") ==
11
+ if (!$("nav").hasClass("sticky")) {
12
- this.pathname.replace(/^//, "") &&
12
+ offsetY = $("nav").addClass("sticky").outerHeight();
13
- location.hostname == this.hostname
14
- ) {
15
- // Figure out element to scroll to
16
- var target = $(this.hash);
17
- target = target.length
18
- ? target
19
- : $("[name=" + this.hash.slice(1) + "]");
13
+ $("nav").removeClass("sticky");
14
+ } else {
20
- // Does a scroll target exist?
15
+ offsetY = $("nav").outerHeight();
21
- if (target.length) {
16
+ }
22
- // Only prevent default if animation is actually gonna happen
23
- //event.preventDefault(); //下で return false;でデフォルトの処理を無効化しているので不要
24
- // スクロールのオフセット値
25
- var offsetY = jQuery('.nav-header').outerHeight(); //ナビゲーションバーのクラス名ないしはIDなどで特定し要素の高さを得る。PCとスマホでナビゲーションバーの高さが違ってもこういう取得の仕方であれば問題ない
26
17
 
27
- $("html, body").animate(
18
+ $(".js--section-features").waypoint(
19
+ function (direction) {
20
+ if (direction == "down") {
21
+ $("nav").addClass("sticky");
22
+ } else {
23
+ $("nav").removeClass("sticky");
24
+ }
25
+ },
28
- {
26
+ {
27
+ offset: offsetY,
28
+ }
29
+ );
30
+ $(".js--scroll-to-plans").click(function () {
31
+ $("html,body").animate(
32
+ {
29
- scrollTop: target.offset().top - offsetY, //ナビゲーションバーの高さ分手前でスクロール
33
+ scrollTop: $(".js--section-plans").offset().top - offsetY,
30
- },
34
+ },
35
+ 1000
36
+ );
37
+ });
38
+
39
+ $(".js--scroll-to-start").click(function () {
40
+ $("html,body").animate(
41
+ {
42
+ scrollTop: $(".js--section-features").offset().top - offsetY,
43
+ },
44
+ 1000
45
+ );
46
+ });
47
+
48
+ $('a[href*="#"]')
49
+ // Remove links that don't actually link to anything
50
+ .not('[href="#"]')
51
+ .not('[href="#0"]')
52
+ .click(function (event) {
53
+ // On-page links
54
+ if (
55
+ location.pathname.replace(/^//, "") ==
56
+ this.pathname.replace(/^//, "") &&
57
+ location.hostname == this.hostname
58
+ ) {
59
+ // Figure out element to scroll to
60
+ var target = $(this.hash); //ここでjQueryオブジェクトに変換済み
61
+ target = target.length
62
+ ? target
63
+ : $("[name=" + this.hash.slice(1) + "]");
64
+ // Does a scroll target exist?
65
+ if (target.length) {
66
+ // Only prevent default if animation is actually gonna happen
67
+ //event.preventDefault();
68
+
69
+ $("html,body").animate(
70
+ {
71
+ scrollTop: target.offset().top - offsetY,
72
+ },
31
- 1000,
73
+ 1000,
32
-
33
- function () {
74
+ function () {
34
- // Callback after animation
75
+ // Callback after animation
35
- // Must change focus!
76
+ // Must change focus!
36
- var $target = $(target);
77
+ target.focus(); //targetは既にjQueryオブジェクトになっているから変換は不要
37
- $target.focus();
38
- if ($target.is(":focus")) {
78
+ if (target.is(":focus")) {
39
- // Checking if the target was focused
79
+ // Checking if the target was focused
40
- return false;
80
+ return false;
41
- } else {
81
+ } else {
42
- $target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
82
+ target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
43
- $target.focus(); // Set focus again
83
+ target.focus(); // Set focus again
84
+ }
44
85
  }
86
+ );
45
- }
87
+ }
46
- );
47
- // ハッシュ書き換えとく、これで戻るボタンでページ内移動の履歴にしたがって戻ってくれる。
48
- window.history.pushState(null, null, this.hash);
49
- // デフォルトの処理はキャンセル
50
- return false;
51
88
  }
89
+ });
90
+
91
+ $(".js--wp-1").waypoint(
92
+ function (direction) {
93
+ $(".js--wp-1").addClass("animated animate__fadeIn");
94
+ },
95
+ {
96
+ offset: "50%",
52
97
  }
98
+ );
99
+
100
+ $(".js--wp-2").waypoint(
101
+ function (direction) {
102
+ $(".js--wp-2").addClass("animated animate__fadeInUp");
103
+ },
104
+ {
105
+ offset: "50%",
106
+ }
107
+ );
108
+
109
+ $(".js--wp-3").waypoint(
110
+ function (direction) {
111
+ $(".js--wp-3").addClass("animated animate__fadeIn");
112
+ },
113
+ {
114
+ offset: "50%",
115
+ }
116
+ );
117
+
118
+ $(".js--wp-4").waypoint(
119
+ function (direction) {
120
+ $(".js--wp-4").addClass("animated animate__pulse");
121
+ },
122
+ {
123
+ offset: "50%",
124
+ }
125
+ );
126
+
127
+ $(".js--nav-icon").click(function () {
128
+ var nav = $(".js--main-nav");
129
+ var icon = $(".js--nav-icon i");
130
+
131
+ nav.slideToggle(200);
132
+
133
+ if (icon.hasClass("ion-navicon-round")) {
134
+ icon.addClass("ion-close-round");
135
+ icon.removeClass("ion-navicon-round");
136
+ } else {
137
+ icon.addClass("ion-navicon-round");
138
+ icon.removeClass("ion-close-round");
139
+ }
53
140
  });
141
+ });
142
+
143
+ // フォーカス系のイベントでのスクロール処理をキャンセルする。
144
+ //
145
+ // firefox以外のブラウザは要素がフォーカスされた場合、フォームのテキストエリアなど入力がスムーズに
146
+ // 出来るように、その要素をスクロールさせる。(正常な動き)その後その要素に対してselectが
147
+ // 発生します。
148
+ // firefoxはバグっててスクロールせずにフォーカスだけがあたる。
149
+ //
150
+ // コード内で要素.focus()する場合は、この解決策でも回避できない場合があります
151
+ // これでもたまにスクロールすることがあり、もう一度クリックすれば直ります。
152
+ // ブラウザ側の実装の問題なのでこれ以上は対処できません。
153
+ //
154
+ // 問題が無ければ、要素.focus()ではなく、要素.select()を検討してみて下さい
155
+ // そうすれば、スクロールの問題は解決するはずです。
156
+ $('section').bind('focusin focus', function(event){
157
+ event.preventDefault();
158
+ });
54
159
  ```
55
160
 
56
- HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
161
+ ~~HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
57
- ```は必要かもしれません。そちらで動作確認し、適宜対応してください。
162
+ ```は必要かもしれません。そちらで動作確認し、適宜対応してください。~~
163
+
164
+ 動作確認してみたところ、IEはバグっててダメでした、edge(WEBから落としてきた最新版のedge),chrome,firefoxでは一応問題ありませんでしたが、chromeでまれにスクロールする事がありましたが再度クリックで直ります。
165
+ その他についてはソースにコメントを入れてあるので参照してください。
166
+
167
+ はぁ、プラグインもテストしてて予想外に疲れた・・・

1

説明を修整

2020/07/07 22:13

投稿

nekora
nekora

スコア501

answer CHANGED
@@ -51,4 +51,7 @@
51
51
  }
52
52
  }
53
53
  });
54
- ```
54
+ ```
55
+
56
+ HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
57
+ ```は必要かもしれません。そちらで動作確認し、適宜対応してください。