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