回答編集履歴
4
コードの修正
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
説明文の修正
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
全ソース公開を受けて、コードの修正
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
|
-
|
8
|
+
$(function () {
|
9
|
-
|
9
|
+
/*FOR STICKY NAVIGATION*/
|
10
|
-
|
10
|
+
var offsetY;
|
11
|
-
|
11
|
+
if (!$("nav").hasClass("sticky")) {
|
12
|
-
|
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
|
-
|
13
|
+
$("nav").removeClass("sticky");
|
14
|
+
} else {
|
20
|
-
|
15
|
+
offsetY = $("nav").outerHeight();
|
21
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
73
|
+
1000,
|
32
|
-
|
33
|
-
|
74
|
+
function () {
|
34
|
-
|
75
|
+
// Callback after animation
|
35
|
-
|
76
|
+
// Must change focus!
|
36
|
-
|
77
|
+
target.focus(); //targetは既にjQueryオブジェクトになっているから変換は不要
|
37
|
-
$target.focus();
|
38
|
-
|
78
|
+
if (target.is(":focus")) {
|
39
|
-
|
79
|
+
// Checking if the target was focused
|
40
|
-
|
80
|
+
return false;
|
41
|
-
|
81
|
+
} else {
|
42
|
-
|
82
|
+
target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
|
43
|
-
|
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
説明を修整
answer
CHANGED
@@ -51,4 +51,7 @@
|
|
51
51
|
}
|
52
52
|
}
|
53
53
|
});
|
54
|
-
```
|
54
|
+
```
|
55
|
+
|
56
|
+
HTMLが提示されてないので動作確認は出来てません。ひょっとしたら```event.preventDefault();
|
57
|
+
```は必要かもしれません。そちらで動作確認し、適宜対応してください。
|