2008-04-18
こだわりのページ内リンクスムーズスクロール scrollsmoothly.js
PC |
「ページ内リンク スムーズスクロール」でググればいくらでも出てくるシロモノだけど、自分の要望をすべて満たすものが無かったので作ってみた。
以下のソースコードをサンプルページのようにhead内で読み込むだけでOK。
- ソースコード(Javascript)
- scrollsmoothly.js
読み込み例
<script type="text/javascript" src="scrollsmoothly.js"></script>
特徴
- 縦横斜めにスクロール可能
- スクロール中にもリンクをクリック可能
- 別のページからのリンクでも指定の場所までスムーズスクロールします
- MIT License
動作確認ブラウザ
関連エントリー
トラックバック - http://d.hatena.ne.jp/KAZUMiX/20080418/scrollsmoothly
- [CSS][その他]巡回
- 【ライブラリ】ページ内リンクスムーズスクロール scrollsmoothly.js
- KAZUMiX memo - scrollsmoothly.jsを更新しました
- scrollsmoothly.jsでページ内スムーズスクロール
- 独自レイアウト|素晴らしいページ内リンクのスムーズスクロール
- 反応のあった販促物は
- スクロールをスムーズにしてくれるJavascript scrollsmoothly.js
- KAZUMiX memo - ものすごい勢いで横スクロールさせるJavaScript
- KAZUMiX memo - 面白いだけで役に立たないUI
- KAZUMiX memo - iPhoneのタッチスクリーンを再現するブックマークレ...
- ページ内リンクのスムーズスクロールはもうこれに決めた!動作感が...
- Cli@ - こだわりのページ内リンクスムーズスクロール scrollsmoothl...
- NOTE; @napoleon_na - jqueryで斜めもスクロール
- NOTE; @napoleon_na - 縦横斜めスクロール
- ちょめちょめ - Javascript・CoffeeScriptの学習に見たサイトのまと...
- うさぎキャンバス - javascript【scrollsmoothly.js】
これを利用させていただくことにより、問題が解決しました。
今後のご活躍をお祈り申し上げます。
どもです。このスクリプトは動きの気持ちよさにもこだわってみました。
何より他のライブラリに依存していないところが素晴らしいです。
拝借して色々実験していたのですが、
「別のページからのリンクでのスクロール」が
一旦、そのアンカー部分を表示した後で、
また一番上からスクロールし直すという挙動のようですね。
(スクロール動作までの時間を弄んでいて気づいた)
これだとなんかスクロールする意味が希薄かもしれませんね…。
<a href=”ホニャララ.html#ホゲホゲ”>のそもそもの動作を
捻じ曲げるわけですから、やっぱり難しいのかな…。
そもそもの挙動をのっとるのは難しくてひとまず諦めました。何か方法が見つかれば何とかしたいです。
他のものもいろいろ試しましたが、動きがなんとといっても1番気持ちいいですね。
少し初歩的な質問なのですが、よろしいでしょうか。
JavaScriptコード内の、
(function(){
var easing = 0.25;
var interval = 20;
の部分なのですが、
他のブラウザはこのままでいいけれど、
例えば、ある特定のブラウザに対してだけその数値を変えたかったとすると、どういったコードの表記になるのでしょうか。
初歩的な質問で恐縮ですが、どうかよろしくお願いします。
ビールの一箱でも贈呈したいくらいです。
こういう無償で活動されている方にお礼をしたい場合は
どうしたら良いのか社内のプログラマに聞いた所
「神!」と呼べば良いと言われました。。
ありがとうございます神様。
ライセンスはいかがいたしましょうか・・。
活用させていただきます!
スライドショー的なページならそういうインターフェースも有りですね。
ひとつだけ、、
飛び先のアンカーが文書の最下部に近いと、イーズアウトされないのが残念。
飛び先が表示の先頭になることを前提に座標の処理をしていたので、改良の余地有りですね。
早速実装してみたのですが、
flash上のボタンからだとスクロールせずに、
通常のアンカーのようになるのですが、
スルスルっと動かすにはどうすればよいでしょうか?
やろうとするとFlashからJavaScriptを呼び出し、JavaScript側もそれに対応するようにするかたちになります。埋め込んだだけで使えるこのスクリプトの仕様とは別物になってしまいます。
スムーススクロール系で一番残念に思うのが強制的に飛び先までいってしまうものが多いのでぜひとも改良してください!!
スムーズスクロール・・・いろいろ検索して試行錯誤して漂流してこちらにたどり着きました。
素敵です!!自分が理想としていたモノができそうです!!いや、できます!!
ありがとうございました。
今度の仕事のサイトで活用させていただきます。どうもありがとうございます!!
サイト制作初心者なので初歩的な質問かもしれませんが、
「こだわりのページ内リンクスムーズスクロール scrollsmoothly.js 動作サンプル」
のソースを写して、勉強させてもらっているのですが、(悪魔で自分のPC内での使用ですが、もし違反行為でしたらすみません)
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
の部分を入れると文字化けになってしまうのですが、何故なのでしょうか?
「こだわりのページ内リンクスムーズスクロール scrollsmoothly.js 動作サンプル」のページを見ても文字化けしませんが、自分のPCに写して見ると文字化けしてしまいます。
それと<?xml version="1.0" encoding="utf-8"?>の記述が無いのも気になります。
変な質問ですが、どうかよろしくお願いします。
文字化けの原因は文字コードだと思います。元ソースの文字コードはutf-8ですが、保存した時にshift_jisになってしまったのではないでしょうか?
<?xml version="1.0" encoding="utf-8"?>の記述は、あえて入れていません。これを入れるとIE6が後方互換モード(IE5.5相当)の動作になってしまうためです。対策が面倒になるためため、私に限らず入れていないサイトがほとんどだと思います。
初歩的なミスで質問してしまって失礼しました。
<?xml version="1.0" encoding="utf-8"?>の記述は
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>で対処していますが、やはり入れないほうが良いのでしょうか?
連続的に質問してしまって申し訳ないですが、よろしくお願いします。
通常ブラウザの場合、「#」だけでページトップに移動します。
対応できませんか?m(_)m
IE6の場合は出力しないという分岐をしているのであれば問題ありません。そもそもIE6で正常表示されなくても気にしないというスタンスもありです。 Googleが今後はIE6のサポートををしないという立場のように。
>yoshiさん
今のところ空のアンカー名に対応する予定はありません。
初歩的な質問で恐縮ですが、質問させてください。
基本横だけにスクロールし、たまに注釈等のコンテンツを下などに配置したりするページ(基本は一方通行)をつくっているのですが、スクロール先の場所の指定はCSSのtopやleftのところで指定すればいいのですよね?セクション4の場所をセクション3の隣に書き変えてもデフォルトの1の下に移動してしまうのですが…
初心者の質問ですいません。よろしくお願いいたします。
スクロール先の指定はhtml内のidです。
CSSの方で見た目のレイアウトの指定をします。
とてもすてきなライブラリですね。
基本的な事を聞いて申し訳ありません。
scrollsmoothly.jsをダウンロードをしたいのですが、何処から
ダウンロードすることが出来るのですか?
印刷がSection1しかできないのですがどうしたら、他のSectionも印刷できるようになりますか?
大変すばらしいスクリプトをありがとうございます。
operaでは、斜め移動するときナビゲーションの部分がぶれるものが多かったので重宝しております。
2つ質問ですが、
ブラウザの「前へ戻る」ボタンを押下した場合、今まで表示させたSectionへ戻らせるのではなく、普通に前に表示させていたサイトに戻るようにすることは可能でしょうか?
また、ブラウザの「前へ戻る」ボタンを押下した場合、今まで表示させたSectionへ戻らないときが御座いますが改善する方法は御座いますでしょうか?
Sectionへ戻るのではなく、前のページへ戻るようにするのは簡単に対応できます。
124行目に以下の記述があります。
location.hash = targetHash;
これを削除すればOKです。
現状の前のSectionへ戻らないことがある挙動は確かに気持ち悪いですね。
すぐに対処法が思いつかないので、解決法を発見しだいなんとかしたいです。
活用させていただいております。
さて、スクリプトの動きについてですが、
(function(){
var easing = 0.20;
var interval = 100;
このあたりの数字を変えれば動きがゆっくりになったり速くなったりするのはわかるのですが、動きに変化をつけるにはどうすればよいでしょうか?
たとえば、
はじめはゆっくりスタートして、途中は加速し、最後またゆっくり着地するようなイメージの動きが理想的です。
現在は、スタートが速く、最後がゆっくり着地するような感じになっています。
お忙しいとは存じますがご教授いただければ幸甚です。
var vx = (targetX - currentX) * easing;
var vy = (targetY - currentY) * easing;
var nextX = currentX + vx;
var nextY = currentY + vy;
逆に最初が遅いのがイーズイン。
で、このスクリプトはイーズアウトのことしか考えていないので、両方組み合わせるとなると少し面倒です。単純に両方を組み合わせるとなると、目標座標の半分まではイーズイン、半分から最後まではイーズアウトという風になります。
この辺、柔軟に対応するための方法や式などは「イージング」で調べるとといろいろありますので、がんばって改造してみて下さい。
一つ質問してもよろしいでしょうか?
KAZUMiXのこだわりのページ内リンクで、それぞれのセクションでコンテンツを中心揃え(縦横共に)で配置したいと思っています。横はCSSで単純にできるのですが、縦で苦しんでいます。。。どうかお知恵をお貸しください。よろしくお願いいたします。
「CSS 縦 センタリング」で検索すると様々な手法が見つかりますので、そこから目的に合うものをアレンジして使用するのが良いと思います。
やっぱり難しいですか。
section1のセンタリングはできてるのですが、
section7のセンタリングがどうしてもうまくいかなくて。。
もう少し調べてみます。
何かほんの些細なヒントでもありましたら、またお教え下さい。
ありがとうございました。
アンカー部分にスクロールした際、URLの最後に「#アンカー名」が付いてしまいますが、これを付加されないようにはできないものでしょうか。
location.hash = targetHash;
素早い回答ありがとうございます。
先日このスクリプトを見つけ自サイトに適応してみようと思ったのですが、サイズ指定(500x500)した<div>内にサンプルページっぽいもの(500x500の9マス)を組み込んだのですが機能しませんでした。
<div>のサイズ指定を無くすと機能しますがこれは仕様がないのでしょうか。
テレビ窓っぽくしたいのですが、自己解決出来ませんでした。ご教授お願いします。
とても気持ち良く動いてくれますね!
横にもキレイに動いてくれて、さっそく使わせていただきます。(*^_^*)
一つ質問なのですが、
#アンカー名を付加させないようにできるというやり取りを拝見し、
この箇所をコメントアウトしました。
location.hash = targetHash;
同一ページ内では確かにURLにid名が表示されないのですが、
他のページからのリンクではid名が付加されてしまいました。
これを回避する方法はありますか…?
ほかの主要ブラウザ(最新版)では問題なく稼働しました。
ひとつだけ…
画面の一番上に行くよく使う動きなんですが、
動きの最後に「カクッ」と動いてしまうのを
なんとかできないでしょうか??
smoothScroll.jsという下記のプラグイン
http://blog.webcreativepark.net/2007/07/12-143406.html
こちらにある機能の、他のScriptでアンカータグを使っている場合に特定のリンクではこのscrollsmoothlyをアクションさせない回避方法は用意されてませんか?
もしなければ、どこに回避させる条件文を書くといいかのヒントだけでももらえれば・・・と思います!
宜しく御願いします。
スクロールもそうですが、常にブラウザーにあった表示をするにはどのようにすればよいのでしょうか?
お気に入りが左側にあるときとないときでも正常に表示されておりますが、スタイルシートの作成が不可欠になりますでしょうか?
★前述の"てつ"さんと同じ要望になります〜
今回Fancybox(jQueryプラグイン)と一緒に使用したところ、意図しない動きをしてしまい悩んでいます。
http://ameblo.jp/shun-jp/entry-11174778648.html
↑上記サイトに特定の要素にのみ適用させる方法というのはあったのですが、そうではなく、特定のリンクにのみ適用させたくない場合の方法がわかりません。
javascriptはこれから勉強しないと・・・と思っておりますが、まだ素人なのでできるだけ詳しく教えていただけると助かります。何卒ご教授くださいませ。
私もmomoさんとまったく同じ現象で悩んでおります。
すでにscrollsmoothly.jsを使用しているページにfancyboxを入れたところ、バッティングしてページトップにスムースリンクしてしまいます。動かしたい要素のclassにe.preventDefault();を記述してもダメでした。
使いやすいのでできればこのままscrollsmoothly.jsを使わせていただきたいのですが、やはり共存させるのは難しいのでしょうか・・・。
知識が浅くて大変申し訳ないのですが、無理なのかどうかだけでも教えていただけるととてもありがたいです。
私もmomoさんとまったく同じ現象で悩んでおります。
すでにscrollsmoothly.jsを使用しているページにfancyboxを入れたところ、バッティングしてページトップにスムースリンクしてしまいます。動かしたい要素のclassにe.preventDefault();を記述してもダメでした。
使いやすいのでできればこのままscrollsmoothly.jsを使わせていただきたいのですが、やはり共存させるのは難しいのでしょうか・・・。
知識が浅くて大変申し訳ないのですが、無理なのかどうかだけでも教えていただけるととてもありがたいです。
私もmomoさんとまったく同じ現象で悩んでおります。
すでにscrollsmoothly.jsを使用しているページにfancyboxを入れたところ、バッティングしてページトップにスムースリンクしてしまいます。動かしたい要素のclassにe.preventDefault();を記述してもダメでした。
使いやすいのでできればこのままscrollsmoothly.jsを使わせていただきたいのですが、やはり共存させるのは難しいのでしょうか・・・。
知識が浅くて大変申し訳ないのですが、無理なのかどうかだけでも教えていただけるととてもありがたいです。
私もmomoさんとまったく同じ現象で悩んでおります。
すでにscrollsmoothly.jsを使用しているページにfancyboxを入れたところ、バッティングしてページトップにスムースリンクしてしまいます。動かしたい要素のclassにe.preventDefault();を記述してもダメでした。
使いやすいのでできればこのままscrollsmoothly.jsを使わせていただきたいのですが、やはり共存させるのは難しいのでしょうか・・・。
知識が浅くて大変申し訳ないのですが、無理なのかどうかだけでも教えていただけるととてもありがたいです。
私もmomoさんとまったく同じ現象で悩んでおります。
すでにscrollsmoothly.jsを使用しているページにfancyboxを入れたところ、バッティングしてページトップにスムースリンクしてしまいます。動かしたい要素のclassにe.preventDefault();を記述してもダメでした。
使いやすいのでできればこのままscrollsmoothly.jsを使わせていただきたいのですが、やはり共存させるのは難しいのでしょうか・・・。
知識が浅くて大変申し訳ないのですが、無理なのかどうかだけでも教えていただけるととてもありがたいです。
私もmomoさんとまったく同じ現象で悩んでおります。
すでにscrollsmoothly.jsを使用しているページにfancyboxを入れたところ、バッティングしてページトップにスムースリンクしてしまいます。動かしたい要素のclassにe.preventDefault();を記述してもダメでした。
使いやすいのでできればこのままscrollsmoothly.jsを使わせていただきたいのですが、やはり共存させるのは難しいのでしょうか・・・。
知識が浅くて大変申し訳ないのですが、無理なのかどうかだけでも教えていただけるととてもありがたいです。
●イージング処理:スクロールを「開始 → 加速 → 減速 → 停止」に変更。
●スクロールの中断処理を追加。
また、改造した物をライセンスを継承して公開した事を報告します。