続々・ページ内リンク(ID)にするするっと移動する
- 2007年8月 8日 13:48
- web
なかなか最終版がかたまらずすいませんが、「続・ページ内リンク(ID)にするするっと移動する」のつづきというか、それに対して「leva」さんから、「サイト内リンクをスムーズに移動するJavascript プラスワン」というトラックバック記事をもらったことを承けて。同記事では、私が「続・ページ内リンク〜」の記事で紹介したスクリプトに対し、
これには1つ大きな問題があって肝心のサイト内リンクを踏んでも、URIの後ろにフラグメントID(#xxxみたいな)が付かないんですね。
Liner Note - サイト内リンクをスムーズに移動するJavascript プラスワン
という指摘がなされていて、それはまったくごもっとも、たしかに大きな欠点だった。で、つづけて同記事ではその点についての改良案を示してくれているのだが、当初書かれてあったその改造法を試したところ動作の具合がうまくなく、で、私のほうでも代案を示そうと思っていたところが、いまあらためて訪れてみると「leva」さん自身が改造法を修正していた。
その新しいほうの改造法は私が示そうとしていたものとほとんど同じで、つまり出番はなくなったのだが、一応こちらのほうでも修正版のソースを提示しておくほうがいいだろうと思い、以下にまとめておきます。
「leva」さんが示している改造法が、こちら。(元のソースの94行目あたり)
- if(Math.abs(top-fd.pageScroller.requestedY) <= 1 || fd.getScrollTop() == top) {
- window.scrollTo(0, fd.pageScroller.requestedY);
- //if(!document.all || window.opera) location.hash = fd.pageScroller.hash;
- //fd.pageScroller.hash = null;
- ++ location.href = '#' + fd.pageScroller.hash;
「05」行目のアタマにある「++」は「追加行」であることを示すもので、つまりこの「05」行目を書き加えるというのが改造部分。で、ソースをよく見てもらえばわかるように、ここで書き加えられている「05」行目のコードというのは、その直前、「03」行目のところでコメントアウトされているコードとほとんど同じものなのである(if文の条件分岐を伴っているところと、「location.href」でなく「location.hash」であるところがちがいますが)。
繰り返し説明しておくと、私が紹介しているこのJavaScriptは私のオリジナルではなくて、海外のサイト(「frequency decoder」)で使用されている外部jsファイルのなかにこれが組み込まれているのを見つけ、そこからページ内スクロール機能の部分だけを取り出して、単機能の外部jsファイルとして動くように手を加えたものです。そんなわけで、元のソースにおいてなぜこの部分がコメントアウトされていたのか、またなぜ条件分岐つきのかたちなのか、そこがちょっとわからないというか現時点で推測がつかないのですが、「これ、コメントアウトを外せば解決なんじゃない?(ただし条件分岐も取り払います)」というのが私の示そうと思う修正案です。
「leva」さんのコードとのちがいがわかるように示せば、こう。
- if(Math.abs(top-fd.pageScroller.requestedY) <= 1 || fd.getScrollTop() == top) {
- window.scrollTo(0, fd.pageScroller.requestedY);
- location.hash = fd.pageScroller.hash;
- fd.pageScroller.hash = null;
この修正を含めた最新版の全コードをあらためて提示しておけば、こうです。
あ、あと、別の話になりますが、「IE6および7で、スクロールダウンが極端に遅いのはなぜ?(スクロールアップは速いのに)」という質問をもらい、直接はここのコメント欄で答えたのですが、ここにも要点だけ書いておけば、これ、HTMLのアタマにXML宣言があると(IE6および7では)その症状が出るようです。どういう道理なのかはわかりませんが、検証の結果どうもそうらしいことが判明しました。
トラックバック(0)
トラックバックURL: http://web-conte.com/blue/mt-tb.cgi/160
コメント(5)
言及しましたlevaです。
実はjavascriptはめっぽう不案内なもので、それも大きいと思うのですが、コメントアウトされていた部分は普通にスルーしてました。お恥ずかしい限りです。
ともあれお返事ありがとうございました。
余談ですが、デフォルトのmaxstep値(≒スクロール速度?)は、どこに移動しているかが分かる程度としては若干早い気がしているので、私の方では値を低めに設定してたりします。
お久しぶりです。IDEA-Hの長谷川です。
このするするっとの話題、入りたかったんですが、他人のJavascriptはなかなか読めないので、今日まで入りませんでした。でも、長谷川が運営する「VERYROLL」というサイトでも違う方法でするするっとを実現しています。
http://veryroll.com/
ただ今までしばらくの間、IE6ではするするっとしていませんでした。ナビゲーションを固定にさせてるんですが、長谷川が知る固定方法では、するするっとのJavascriptとぶつかってどっちかを捨てる他ありませんでした。(話が長くなってすいません)で、ここのFeedを読ませていただいているんですが、del.icio.usの「IEで固定座標を指定する方法/ガタガタも回避する」で解決してしまいました。今はIE6でもするするっとしています。
一連の記事の流れからはズレたコメントですいません。ともかく教えていただいてありがとうと言いたくて書き込みました。ありがとうございます。
それから〈総理大臣といえば〉田中角栄は僕です。
hasegawahiroshiさん、どうも。
お役に立てて何よりです。
> それから〈総理大臣といえば〉田中角栄は僕です。
あれ?サイトのヘッダーにあるプロフィールによれば同い年(1975年生まれ)ですよね。何でまた角栄?
> 何でまた角栄?
長谷川、新潟人なんです。
> 新潟人なんです。
そういうことかあ。
コメントする