class指定もいらない超お手軽スムーズスクロール

最近ようやくjQueryに目覚めました。
面倒な指定がこれほど楽々と出来てしまうと笑いが止まりません。

言い過ぎました。そんなに笑えません。

あったらよさげなプラグインを一つ思いついたのでちくちく書いてたんですが、いつの間にかclass指定もrel指定もいらないスムーズスクロールのコードを書いていました。

interface.jsという有名なjQueryライブラリの応用です。

interface.jsについてはEmotional Webさんが解りやすい記事を書かれていたので、interface.jsの導入までのご参考にどうぞ。

普通はPageTopとかに「#top」を指定したりすると思うのですが、それだけではもったいないなーと。
当サイトで実際に使っているソースを書いておきます。

以下のソースはIEで動かない場合があります。 ちゃんと動くコードは追記しました。

Javascript
  1. $(function() {
  2. $('a').click(function() {
  3. var jumpTo = $(this).attr('href');
  4. if(jumpTo == '#siteId') {
  5. $(document.body).ScrollTo(1000, 'easein'); return false;
  6. }
  7. else if(jumpTo.charAt(0) == '#') {
  8. $(jumpTo).ScrollTo(1000, 'easein'); return false;
  9. }
  10. });
  11. });

HTMLソースはいたってシンプル。というか何も特別なことはしません。アンカー貼るだけ。

HTML
  1. <p id="hoge">ほげ(ここにスクロール)</p>
  2. <p><a href="#hoge">ほげにスクロール</a></p>

Emotional Webさんのソースとどう違うか少し解説していきます。

まず、2行目で「a」要素をクリックした時にもう関数が動くようにしています。
3行目でクリックしたaタグのhrefを変数にしています。
4行目で「ページトップへ」用の振り分けです。ページトップだけは、サイトの一番上にスクロールしないと困るので、hrefつまりリンク先URLの指定に「#siteId」と入っている場合は、5行目で一番上(body要素)に飛ぶようになっています。
うちの場合は、ロゴを「siteId」というIDにしているので、「#siteId」ですが、ここは#headerでも#topでも実際に当たっているIDならば自由に変更可能です。

7行目からが今回のポイントですね。
リンク先URLの0番、つまり1文字目が「#」の時にスムーズスクロールの関数が動くようになっています。
ページ内リンクの場合、必ず1文字目は「#」になることを利用しています。
8行目は言わずもがな、クリックしたURL(アンカー)に向かってスクロールしていきます

まぁ、非常に単純なのですが、いちいちclass振らないで良いし、便利かなと思ったのでした。

動きはmixiリニューアルに伴う改悪の記事内でアンカーをいっぱい貼っているので試してみてください。現在は動きません。

ソースは上記のみなので、もし使いたい方はコピーして新規JSファイルに貼るなり、interface.js内に直接貼り付けちゃってください。

追記

スムーススクロールについてポストした後も調べていたら、こんな記事が。

なんてこったい…。こんなシンプルなソースで実現できたのね…。

で、ページトップ用の条件分けを追加してテストしてみたら、動きがバグってしまった。なんでだろう…。
いまいちわからなかったりします。KADOYAN.comさんで言われているようなMac Safariでのバグも起こらないので、とりあえずこのままで良さそう。

追記2

jQuery1.2.1ではinterface.jsのスムーズスクロール機能はエラーが発生するので、jQueryバージョンに注意してください。

追記2.1

interface.jsのコードを修正することで対応できるようです。
no2xさんからアドバイスをコメントにて頂きましたので、そちらを参照してください。

追記3

2008/2/11追記
2008/3/4修正。アンカーのあるURLへのリンクが作動しなかったため、1~5行目までを修正しました。

新しく書き直したので、こっちのソースを参照してください。
(このエントリーはアクセス数が多かったので、ちゃんと動くものにしておきたかったので…)

Javascript
  1. var url = "http://" + location.hostname + location.pathname;
  2. $('a[@href*="#"]').click(function() {
  3. var id = this.href.substring(this.href.indexOf('#'),this.href.length);
  4. var hrefUrl = this.href.split(id);
  5. if(hrefUrl[0] == url) {
  6. if(id == '#header') {
  7. $('body').addClass('body');
  8. $('.body').ScrollTo('slow');
  9. $('body').removeClass();
  10. return false;
  11. }else{
  12. $(id).ScrollTo('slow');
  13. return false;
  14. }
  15. }
  16. });

5行目の条件文は、ページトップにID(name)名指定なしでスクロールするためだけに書いてあるものなので、一律「#」に飛ばしたいだけの方には不要です。 内容としては、一度bodyタグに「body」というclass名を与えてスクロールさせ、その直後にclass名を削除します。結構無理矢理ですが…。

  • コメント(2)
  • トラックバック(1)
  • Mixi Check
  • はてなブックマーク数 はてなブックマークコメント

Track back

このエントリーのトラックバックURL

簡単に実装できるjQueryのスクリプト5選

イロイロとプラグインやらナンやら巷に溢れていますが、「そんな高機能はいらない」「もっとシンプルなのがいい」って思ってるあなたへ。今回はシンプルで簡単に実装...

Web Mugen - 2010年08月20日 23:03

Comments

1:no2x 2008年02月28日 03:26

はじめまして、「追記2」の記事の件ですが、jQueryのバージョンが上がって、仕様が一部変更になったみたいです。最近、JavaScript&jQueryを使い始めたので正しいのかはよく解りませんが、以下にinterface.jsの実際に行った修正点を書いておきます。

-----
interface.js のソースファイルの「ifxscrollto.js」内を下記のように修正
jQuery.dequeue(z.e, 'interfaceFX')
    ↓
jQuery(z.e).dequeue('interfaceFX')
-----

これだけで、いけるようになります。(他のinterfaceパッケージも利用している場合は、ポイント部分を参照してください)
原因は、古いバージョンのjQueryには、拡張部分にdequeueがプロトタイプ宣言されていましたが、新しいバージョンになって、dequeueが独立して宣言されていました。

ポイントは、
jQuery(ここにオブジェクト).dequeue('タイプ')

ですので、interface.js のすべてのソースをこのように変更すれば、新しいバージョンのjQueryでも使えるようになります。
Linuxとかお使いでしたら、
-----
#interface1.2ソースの置き場のディレクトリに移動
unzip interface_1.2.zip
cd interface\ 1.2/
cat source/*.js > interface.src.js
#置換作業(下記1行で)
perl -pe 's/(jQuery)\.dequeue\((.+), (.+)\)/\1\(\2\)\.dequeue\(\3\)/i' -i.backup ./interface.src.js
-----

パックするには、
http://dean.edwards.name/packer/
とかのpackerを使えば快適になりますよね。余談でした。
以上報告でした。

2: 2008年02月28日 10:59

>no2xさん
コメントありがとうございます。

うわー!このinterface.jsの修正ポイントは本当に嬉しいです。助かります!
ありがとうございます!
パッケージの仕方まで細かく解説ありがとうございました^^

Your Comment





Tag Cloud

About

drop

Author:飴(drop)

web技術に関するtipsや主にweb関連のニュースなどをメモ的に記していきます。

このサイトについて

RSS購読