質問編集履歴

2

調査に進展があったので情報を追加

2018/09/14 00:11

投稿

aKusano
aKusano

スコア3763

test CHANGED
File without changes
test CHANGED
@@ -109,3 +109,25 @@
109
109
  (3)のパターンでSmoothScrollを適用するにはどうしたらいいのか分からず困っております。
110
110
 
111
111
  どなたかお知恵をお貸しいただけないでしょうか?
112
+
113
+
114
+
115
+ ---追記2---
116
+
117
+ すみません、イベント発生状況を調べていたら、(3)のパターンではそもそも記述したJSのイベントが全く発生していませんでした。。
118
+
119
+ で、よく考えたら(3)のパターンのアンカーリンクが存在する箇所はjQueryでHTMLをインクルードしている箇所でした。。
120
+
121
+ なので上記スムーススクロールを関数化して、インクルードファイルを読み込むところで
122
+
123
+ ```javaScript
124
+
125
+ $('#menu').load('/common/include/menu.html',function(){
126
+
127
+ smoothScroll();
128
+
129
+ });
130
+
131
+ ```
132
+
133
+ のようにしてみたのですが、クリックイベントは取得できますがやはりスムーススクロールは適用されず、普通の遷移としてしか動かないという状況でした。

1

HTMLとJSのコードを追記しました。

2018/09/14 00:10

投稿

aKusano
aKusano

スコア3763

test CHANGED
File without changes
test CHANGED
@@ -11,3 +11,101 @@
11
11
  `a[href*="#"]`とすれば「#を含む」と判定されそうなものですが、
12
12
 
13
13
  なぜ効かないのでしょう…?
14
+
15
+
16
+
17
+ ---追記---
18
+
19
+
20
+
21
+ ```HTML
22
+
23
+ <!-- 現在のページは/hoge/fuga/index.htmlという前提 -->
24
+
25
+ (1)<a href="/hoge/hage/#anchor">別ページのアンカーへリンク</a>
26
+
27
+ (2)<a href="#anchor">普通のページ内リンク</a>
28
+
29
+ (3)<a href="/hoge/fuga/#anchor">自分自身へのパス付きアンカーリンク</a>
30
+
31
+ ```
32
+
33
+
34
+
35
+ ```javaScript
36
+
37
+ $(function(){
38
+
39
+ //別ページのアンカーに遷移した時
40
+
41
+ var urlHash = location.hash;
42
+
43
+ if(urlHash) {
44
+
45
+ var w = $(window).width();
46
+
47
+ $('body,html').stop().scrollTop(0);
48
+
49
+ setTimeout(function(){
50
+
51
+ var target = $(urlHash);
52
+
53
+ if(w >= 768){
54
+
55
+ var position = target.offset().top-200;
56
+
57
+ }else{
58
+
59
+ var position = target.offset().top-50;
60
+
61
+ }
62
+
63
+ $('body,html').stop().animate({scrollTop:position}, 500);
64
+
65
+ }, 100);
66
+
67
+ }
68
+
69
+ //自分のページのアンカーに遷移した時
70
+
71
+ $('a[href*="#"]').on("click",function(){
72
+
73
+ w = $(window).width();
74
+
75
+ var h_sp = $('.header').height();
76
+
77
+ var h_pc = $('.site-header').height();
78
+
79
+ var href= $(this).attr("href");
80
+
81
+ var target = $(href);
82
+
83
+ if(w >= 768){
84
+
85
+ var position = target.offset().top-h_pc;
86
+
87
+ }else{
88
+
89
+ var position = target.offset().top-h_sp;
90
+
91
+ }
92
+
93
+ $('body,html').stop().animate({scrollTop:position}, 500);
94
+
95
+ });
96
+
97
+ });
98
+
99
+ ```
100
+
101
+ HTML(ダミー)とJSを追記しました。
102
+
103
+ HTMLには(1)〜(3)の3パターンのアンカーリンクが存在しており、その全てにSmoothScrollを適用したいのですが、
104
+
105
+ 現状(1)(2)は問題なく適用されますが、(3)はSmoothScrollが適用されず、ただの遷移として動作してしまいます。
106
+
107
+ 通常のページ内リンクにおけるSmoothScrollはセレクタを`$('a[href^="#"]')`として「#で始まっているhref属性を持つa要素」を対象としていますので、パス付きアンカーにも適用させようと思って`$('a[href*="#"]')`として「#を含んでいるhref属性を持つa要素」を対象にしてページ内リンクしたらなー、と思ったのですが駄目のようです。
108
+
109
+ (3)のパターンでSmoothScrollを適用するにはどうしたらいいのか分からず困っております。
110
+
111
+ どなたかお知恵をお貸しいただけないでしょうか?