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

質問編集履歴

2

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

2018/09/14 00:11

投稿

aKusano
aKusano

スコア3763

title CHANGED
File without changes
body CHANGED
@@ -53,4 +53,15 @@
53
53
  現状(1)(2)は問題なく適用されますが、(3)はSmoothScrollが適用されず、ただの遷移として動作してしまいます。
54
54
  通常のページ内リンクにおけるSmoothScrollはセレクタを`$('a[href^="#"]')`として「#で始まっているhref属性を持つa要素」を対象としていますので、パス付きアンカーにも適用させようと思って`$('a[href*="#"]')`として「#を含んでいるhref属性を持つa要素」を対象にしてページ内リンクしたらなー、と思ったのですが駄目のようです。
55
55
  (3)のパターンでSmoothScrollを適用するにはどうしたらいいのか分からず困っております。
56
- どなたかお知恵をお貸しいただけないでしょうか?
56
+ どなたかお知恵をお貸しいただけないでしょうか?
57
+
58
+ ---追記2---
59
+ すみません、イベント発生状況を調べていたら、(3)のパターンではそもそも記述したJSのイベントが全く発生していませんでした。。
60
+ で、よく考えたら(3)のパターンのアンカーリンクが存在する箇所はjQueryでHTMLをインクルードしている箇所でした。。
61
+ なので上記スムーススクロールを関数化して、インクルードファイルを読み込むところで
62
+ ```javaScript
63
+ $('#menu').load('/common/include/menu.html',function(){
64
+ smoothScroll();
65
+ });
66
+ ```
67
+ のようにしてみたのですが、クリックイベントは取得できますがやはりスムーススクロールは適用されず、普通の遷移としてしか動かないという状況でした。

1

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

2018/09/14 00:10

投稿

aKusano
aKusano

スコア3763

title CHANGED
File without changes
body CHANGED
@@ -4,4 +4,53 @@
4
4
  `$('a[href*="#"]').on("click",function(){.....})`と書いたところ
5
5
  通常のページ内リンクにしか効いていない状態でした。
6
6
  `a[href*="#"]`とすれば「#を含む」と判定されそうなものですが、
7
- なぜ効かないのでしょう…?
7
+ なぜ効かないのでしょう…?
8
+
9
+ ---追記---
10
+
11
+ ```HTML
12
+ <!-- 現在のページは/hoge/fuga/index.htmlという前提 -->
13
+ (1)<a href="/hoge/hage/#anchor">別ページのアンカーへリンク</a>
14
+ (2)<a href="#anchor">普通のページ内リンク</a>
15
+ (3)<a href="/hoge/fuga/#anchor">自分自身へのパス付きアンカーリンク</a>
16
+ ```
17
+
18
+ ```javaScript
19
+ $(function(){
20
+ //別ページのアンカーに遷移した時
21
+ var urlHash = location.hash;
22
+ if(urlHash) {
23
+ var w = $(window).width();
24
+ $('body,html').stop().scrollTop(0);
25
+ setTimeout(function(){
26
+ var target = $(urlHash);
27
+ if(w >= 768){
28
+ var position = target.offset().top-200;
29
+ }else{
30
+ var position = target.offset().top-50;
31
+ }
32
+ $('body,html').stop().animate({scrollTop:position}, 500);
33
+ }, 100);
34
+ }
35
+ //自分のページのアンカーに遷移した時
36
+ $('a[href*="#"]').on("click",function(){
37
+ w = $(window).width();
38
+ var h_sp = $('.header').height();
39
+ var h_pc = $('.site-header').height();
40
+ var href= $(this).attr("href");
41
+ var target = $(href);
42
+ if(w >= 768){
43
+ var position = target.offset().top-h_pc;
44
+ }else{
45
+ var position = target.offset().top-h_sp;
46
+ }
47
+ $('body,html').stop().animate({scrollTop:position}, 500);
48
+ });
49
+ });
50
+ ```
51
+ HTML(ダミー)とJSを追記しました。
52
+ HTMLには(1)〜(3)の3パターンのアンカーリンクが存在しており、その全てにSmoothScrollを適用したいのですが、
53
+ 現状(1)(2)は問題なく適用されますが、(3)はSmoothScrollが適用されず、ただの遷移として動作してしまいます。
54
+ 通常のページ内リンクにおけるSmoothScrollはセレクタを`$('a[href^="#"]')`として「#で始まっているhref属性を持つa要素」を対象としていますので、パス付きアンカーにも適用させようと思って`$('a[href*="#"]')`として「#を含んでいるhref属性を持つa要素」を対象にしてページ内リンクしたらなー、と思ったのですが駄目のようです。
55
+ (3)のパターンでSmoothScrollを適用するにはどうしたらいいのか分からず困っております。
56
+ どなたかお知恵をお貸しいただけないでしょうか?