- 2006-08-08 (火)
- action script
「減速して止まるバージョン」など、他にもいろんなバリエーションのFlashスクロールバーを公開してますので、trick7トップページのスクロールバーの項よりご覧ください。
FlashPlayer7以上で動作する、簡単に設置できるスクロールバーセットを置いておきます。 インスタンス名を設定するだけで動き、デザインのカスタマイズも結構しやすいのではないでしょうか。 機能としては、
- スクロールバーをドラッグでスクロールできます。
- スクロールバーの背景をクリックすると、スクロールバーが所定の位置まで移動します。
- 上下カーソルキーを押しても移動できます。(押しっぱなしOK)
11/9追記:
サンプルで、コンテンツがマスクよりも短い場合の処理を忘れていたので、記事のコード末尾に書き足しました。
2/7追記:
Windowsのみのサポートとなりますが、マウスホイールのスクロールに対応させました。
ソースはこちら:scrollBar.fla(mx2004形式)
ステージ上にコンテンツとなるインスタンス名content_mc(テキスト、グラフィック、ムービー、何を内包してもOKです)、表示領域となるマスク:インスタンス名mask_mc、スクロールバーセット:インスタンス名scrollSet(スクロールバーsBarとスクロールバーの稼動エリアsBackを内包している)、上下カーソルキーcursor_upとcursor_downを設置し、フレームスクリプトを以下のように記述します。
(サンプルflaファイルはsetというMCでくるんでいますが、上記構成さえ守れば_rootでもどこでも動きます。)
//スクロールバーの背景をクリックしたときの抵抗
var backFriction = 0.05;
//上下カーソルを押下時の移動量
var coursorMove = 3;
//マウスホイール回転時の移動係数(Windowsのみ)
var wheelMove = 1.5;
//---------------------------------------------
//マスクを設定
content_mc.setMask(mask_mc);
//相関する比率を求める
var mPc = mask_mc._height/content_mc._height;
var mPb = mask_mc._height/scrollSet.sBack._height;
//比率に応じてスライダーバーの高さを伸縮
scrollSet.sBar._height = scrollSet.sBack._height*mPc;
//スライダーの移動範囲の下限
yMax = scrollSet.sBack._height-scrollSet.sBar._height;
//---------------------------------------------
//スライダーバーの位置に応じて、コンテンツの位置を移動させる関数
function activeScroll() {
content_mc._y = -scrollSet.sBar._y/mPc*mPb;
if (sliderbackPress == true) {
if ((scrollSet.sBar._y-scrollSet.sBack._ymouse)*stepMove<0) {
scrollSet.sBar._y += stepMove;
}
}
if (pressUp == true) {
scrollSet.sBar._y -= coursorMove;
}
if (pressDown == true) {
scrollSet.sBar._y += coursorMove;
}
if (scrollSet.sBar._y<0) {
scrollSet.sBar._y = 0;
content_mc._y = 0;
}
if (scrollSet.sBar._y>yMax) {
scrollSet.sBar._y = yMax;
content_mc._y = -yMax/mPc*mPb;
}
}
//スライダーのバーをドラッグした時
scrollSet.sBar.onPress = function() {
this.onEnterFrame = activeScroll;
this.startDrag(false, this._x, 0, this._x, yMax);
};
scrollSet.sBar.onRelease = scrollSet.sBar.onReleaseOutside=function () {
this.onEnterFrame = null;
this.stopDrag();
};
//スライダーの後ろの部分をクリックした時
scrollSet.sBack.onPress = function() {
this.onEnterFrame = activeScroll;
sliderbackPress = true;
stepMove = (this._ymouse-this._parent.sBar._y)*backFriction;
};
scrollSet.sBack.onRelease = scrollSet.sBack.onReleaseOutside=function () {
this.onEnterFrame = null;
sliderbackPress = false;
};
//上カーソルをクリックした時
cursor_up.onPress = function() {
this.onEnterFrame = activeScroll;
pressUp = true;
};
cursor_up.onRelease = cursor_up.onReleaseOutside=function () {
this.onEnterFrame = null;
pressUp = false;
};
//下カーソルをクリックした時
cursor_down.onPress = function() {
this.onEnterFrame = activeScroll;
pressDown = true;
};
cursor_down.onRelease = cursor_down.onReleaseOutside=function () {
this.onEnterFrame = null;
pressDown = false;
};
//11.9追記:マスクよりコンテンツが短い場合は、スクロールバーは非表示にする
if(mPc>=1){
scrollSet._visible=false;
cursor_up._visible=false;
cursor_down._visible=false;
};
//2007.2.7追記:マウスホイールでスクロールさせる(Windowsのみ対応)
var wheelListner:Object = new Object();
wheelListner.onMouseWheel = function(delta) {
scrollSet.sBar._y -= delta*wheelMove;
activeScroll();
};
Mouse.addListener(wheelListner);
スクロールバーの高さは、コンテンツMCとマスクのMCとの比率によって自動的に伸縮します。
カーソルキーとか、背景クリックでスクロールとかの機能が不要な場合は削除できます。該当スクリプトも削除しておいて下さい。
なにぶん昔に作ったものなので、スクリプティングが甘いかもしれません。
flaファイル上で気軽に使えるスクロールバーセット、みたいなノリで使っていただければと思います。
備考:「スクロール対象のMCにテキストフィールドを内包させる時の注意点」
スクロール対象となるムービークリップ(content_mc)の中に、テキストフィールドを下端ぎりぎりに配置する場合、テキストフィールドの高さがおかしくなる症状のために、予期しない部分までスクロールしてしまう事があります。
その場合は、スクリプト9行目:
var mPc = mask_mc._height/content_mc._height;
の部分を、
var mPc = mask_mc._height/(スクロール下端にしたい数値);
というふうに、数値を直接入力してください。
- Newer: ::Travelers - In Synch Challenge
- Older: ドメイン名の変更
Comment:32
- bioplay 2006-08-08 (火) 20:41
-
マウスのホイールスクロール対応ってできるんですかね?それあるとかなり便利!
- tera 2006-08-08 (火) 20:52
-
スクロールホイール忘れてましたね。
Macには対応してない(はず)ので、忘れがちです。
また実装してアップしますわ〜。 - bioplay 2006-08-10 (木) 22:10
-
Mightyなマウスで横スクロールなんかもできちゃうんですかね。楽しみです。
- hiyoko 2006-09-03 (日) 15:53
-
はじめまして。
素人の私にも分かりやすいスクリプトで参考になりました。
ところで、これを横位置にしたいと思いまして、yをすべてxにして、heightをwidthにするという、少々乱暴なことをしたところ、両側の▲を動かすと絵も動き、スライダーも対応するのですが、今度は、スライダーのつまみを動かすと、左右に動かず、変な動き方をして、絵もスクロールしなくなります。関係がありそうな部分だけピックアップして貼付けてみます。これでは、だめなのでしょうか?
//スライダーの移動範囲の下限
xMax = scrollSet.sBack._width-scrollSet.sBar._width;
//---------------------------------------------
//スライダーバーの位置に応じて、コンテンツの位置を移動させる関数
function activeScroll() {
content_mc._x = -scrollSet.sBar._x/mPc*mPb;
if (sliderbackPress == true) {
if ((scrollSet.sBar._x-scrollSet.sBack._xmouse)*stepMove scrollSet.sBar._x += stepMove;
}
}
if (pressUp == true) {
scrollSet.sBar._x -= coursorMove;
}
if (pressDown == true) {
scrollSet.sBar._x += coursorMove;
}
if (scrollSet.sBar._x scrollSet.sBar._x = 0;
}
if (scrollSet.sBar._x>xMax) {
scrollSet.sBar._x = xMax;
}
}
//スライダーのバーをドラッグした時
scrollSet.sBar.onPress = function() {
this.onEnterFrame = activeScroll;
this.startDrag(false, this._y, 0, this._y, xMax);
};よろしくお願い致します。
- hiyoko 2006-09-03 (日) 16:44
-
さきほどコメントした者です。
さきほど添付したスクリプトを
this.startDrag(false, 0, this._y, xMax, this._y);
と直したところ、動きました。
お騒がせ致しました。
ありがとうございました。 - tera 2006-09-03 (日) 18:59
-
気付くの遅れてすいませんです。
startDrag(ロック:Boolean, ドラッグ範囲の最小x, 最小y, 最大x, 最大y)なので、横スライドのときはy固定ということで、コメントいただいた通りのスクリプトでOKです。 - hiyoko 2006-09-06 (水) 15:11
-
いえいえ、とんでもない、補足まで頂いて、ありがとうございました。
- Hiroam 2007-02-07 (水) 12:44
-
初めてコメントします。
こちらのサンプルをDLさせて頂きまして、実際に自分でファイルを書き出してみました。
すると自分で書き出したswfだと、windowsでマウスホイールでスクロールしません。
(ちなみにteraさんが書き出したswfは問題なく動作します。)友達にも確認してもらったところ、その友達は自分で書き出してもwindowsでマウスホイールでスクロールするとの事です。
ちなみに僕は「Mac OS 10.4.8、Flash MX 2004」で書き出し、「Windows XP Professional SP1、IE6.0」で確認して、正常に動作しませんでした。
友達は「Mac OS 10.4.8、Flash MX 2004」で書き出し、「Windows XP Home edtion SP2、IE6.0」で確認して大丈夫との事です。
何か特別な書き出し設定などあるのでしょうか?
もしあるようでしたら、教えて頂けますでしょうか?宜しくお願いします。
- tera 2007-02-07 (水) 13:11
-
>>Hiroam様
はじめまして。とりいそぎご回答させていただきます。
こちらでも fla ファイルをダウンロードしてみたところ、なんとマウスホイール操作に関するコードが書かれていませんでしたので、Win & Mac ともにホイールには一切反応しないはずです。
おそらく、僕の方で、こっそり swfだけ更新して、fla側を更新し忘れていたようです。そして fla ファイルは僕の Mac の HDD が壊れたときに、一緒に消えてしまってるようです。ややこしいことをしてしまい、すいません。友達の方が何故動いたのかが不思議です。
- tera 2007-02-07 (水) 14:11
-
>>Hiroam様
更新しましたのでアップしておきました。なんかキャッシュの都合上か、サーバー上のファイルが更新されないので、「scrollBar2.fla」として別に置いておきます。
何かおかしな挙動があれば報告くだされば助かります。 - Hiroam 2007-02-07 (水) 15:59
-
早速の返信、ありがとうございます!
こんなに速く対応して頂きまして、ビックリです!早速、自分で試してみたら問題なく動作しました!
本当に助かりました。
ありがとうございます。>友達の方が何故動いたのかが不思議です。
はい、僕も不思議です。笑 - tera 2007-02-08 (木) 00:00
-
こちらこそ、記事の不備を修正できたので助かりました。
このスクロールバー、結構皆さんにダウンロードしていただいているみたいなので、新規エントリーにてお知らせさせていただきました。 - tawawa 2007-04-10 (火) 22:01
-
tera様
はじめまして。
tawawaと申します。スクロールバーのサンプルを利用させていただいています。
スクロールバーの機能そのものもさることながら
私のようにScriptに疎いものでもわかりやすく、
作例としても大変よく出来ていると思います。ただ1点だけどうしても私には解決できないことがありますので質問させていただきます。
実はデザインの都合上、スライダーバーの伸縮機能を停止したいのです。
//比率に応じてスライダーバーの高さを伸縮
scrollSet.sBar._height = scrollSet.sBack._height*mPc;この部分をコメントアウトすればスライダーバーの伸縮機能が停止するのはわかりますが、
今度は伸縮機能を停止したスライダーバーとコンテンツのスクロールの相関関係が崩れてしまうようです。//スライダーバーの位置に応じて、コンテンツの位置を移動させる関数
function activeScroll() {
content_mc._y = -scrollSet.sBar._y/mPc*mPb;
if (sliderbackPress == true) {
if ((scrollSet.sBar._y-scrollSet.sBack._ymouse)*stepMove scrollSet.sBar._y += stepMove;
}このあたりを変更すればよいであろうことはなんとなくわかるのですが
具体的には、どこをどう変更すればよいのかわかりません。お手数とは思いますがアドバイスをいただけないでしょうか?
よろしくお願いいたします。 - tera 2007-04-11 (水) 09:50
-
>tawawa様
こんにちは。
いじってみたら、それなりにできたっぽいのでエントリしておきました。
http://www.trick7.com/blog/2007/04/11-010329.php
試してみてください。よろしくです。 - tawawa 2007-04-11 (水) 11:10
-
tera様
こんにちは。
tawawaです。すばやいご回答ありがとうございます。
昨夜遅い時間に質問させていただいて
今朝一番でご回答いただけるとは思っていませんでした。
(いつ睡眠をとられているんでしょうか?)お体にお気をつけてこれからもよいサンプルを公開してください。
(そうしていただけると私も助かります)本当にありがとうございました。
- ゴダル 2007-05-08 (火) 16:11
-
teraさま
大変勉強になるサイトですね。
さっそくスクロールのflaサンプルをダウンロードさせていただきたいのですが、当方の環境がMX(+mac OSX)なので、サンプルを開くことができませんでした。
MX2004をMXにヴァージョンダウンしたものをいただけないでしょうか?
それともMX2004のみの対応でしょうか?お手数をお掛けいたします。
どうぞよろしくお願いいたします。
- tera 2007-05-11 (金) 01:06
-
ゴダル様
お返事遅れてすいませんです。昨日のtwitterフィーバーで、記憶が飛んでしまいました。
当方はFlash8のため、MX形式ができませんでした。
お手数ですが、環境を作ってソースをペーストしてくださいませ。すいませんです。
スクロールホイールは対応してなかったかな? - ゴダル 2007-05-12 (土) 01:58
-
teraさま
ご返事いただきありがとうございました。
なんとか環境を作ってぜひスクリプトのお勉強をさせていただきたいと思います。今後ともどうぞよろしくお願いいたします。
- kei 2007-08-23 (木) 19:09
-
こんにちは
flash横スクロールバーのflaファイルはありますか?
- tera 2007-08-23 (木) 19:56
-
>kei様
こんにちは。
すいません。ソースとしては用意していないので、上記コードの縦っぽいところを横に直して自作して下さいませ。よろしくです。 - Aya 2007-10-03 (水) 17:22
-
tera様
いつも本当にためになるサンプルありがとうございます。
初めて質問させていただきました。このスクロールバーを利用させていただいたのですが、別の場所にあるボタンからも、content_mcの_yを制御したいのです。
on(release){
this._parent.set.content_mc._y = -500;
}
と書いています。content_mcの位置指定は、上記で出来たのですが、スライダーに触るとcontent_mcの位置が元の状態に戻ってしまいます。
scrollSet.sBar._yの値を取得し直せばいいというのは分かるのですが、勉強不足で指定の仕方が分かりませんでした。
スクロールのスライダーの位置をcontent_mcの位置に同期させるには、どのように変更すれば宜しいでしょうか?ご教授いただけると嬉しいです。
お手数ですが宜しくお願いいたします。 - tera 2007-10-03 (水) 18:12
-
>Aya様
こんにちは。ちょっと今週は忙しくて、きちんとご回答できないのですが、仰る通り、スライダーの位置を動かせばいいと思いますが、仕組みとして「スライダーの位置に content_mc が追従する」イメージの方が正しいので;
on(release){
this._parent.set.content_mc._y = -500;
}
ではなく、
on(release){
this._parent.set.scrollSet.sBar._y = 数値
}
という感じで、バーだけを動かしてやればいいと思います。
ただ、バーの移動量はコンテンツとマスクの高さから算出しないといけないので、
・自力で近似値を探し出す
・僕のコード中のmPb、mPcみたいな比率を算出して、希望の位置を(掛けたり割ったりして)求める。
どちらかのアプローチになります。今熱があって頭が働かないのですが、
on(release){
var dest = 500 //コンテンツ移動目的座標
var mPc = this._parent.set.mask_mc._height/content_mc._height;
var mPb = this._parent.set.mask_mc._height/scrollSet.sBack._height;
var 数値 = (mPc, mPb, *-1とか使ってdest をいろいろいじってcontent_mc が 500動化したい時には sBar をどれだけ動かせばいいかを求める。)
this._parent.set.scrollSet.sBar._y = 数値
}
みたいな感じで一応どうにかなるかと思います。
コードは適当なのでmPbとかtraceして確認して下さい。パスとか間違えてたらすいません。頑張って下さい。説明下手ですいません。サンプルzipして下されば落ち着いた頃にきちんと回答できるかと思います。
- No Name 2007-10-04 (木) 00:07
-
tera様
お忙しいところ、早速ご返答いただきましてありがとうございました。
その上、熱を出されてるとは…。
本当に申し訳ないです。教えていただいたことを基にして、
以下のスクリプトを書いたところ、見た目ではちゃんと動いているようです。on(release){
var pageTo = -180;
this._parent.set.content_mc._y = pageTo;
var mPc = this._parent.set.mask_mc._height/this.set.content_mc._height;
var mPb = this._parent.set.mask_mc._height/this.set.scrollSet.sBack._height;
var scrollTo = pageTo*mPc/mPb*-1;
this._parent.set.scrollSet.sBar._y = scrollTo;
}合ってるかどうか、自信が無いのですが…。
ともかく、お大事にしてください。
ありがとうございました。
- iiyoninaru 2008-02-01 (金) 13:40
-
content_mcの長さをころころと変えるflashを製作したのですが、それでもスクロールバーが作動するように改造しました。
その際に作ったサンプルをUPしたいと思います。
長いので、コメントではなくtextでUPします。http://sakuratan.ddo.jp/uploader/source/date68841.txt
- tera 2008-02-01 (金) 13:49
-
>iiyoninaru様
ありがとうございます!改善していただいて感激です。
今後ともよろしくお願いいたします。とりいそぎ。 - しか 2008-03-09 (日) 02:20
-
初めまして。
簡単にスクロールバーを作れないかと調べていたらたどり着きました。
初心者ながら何とかカスタマイズして出来たのですが
スクロールバーの■の部分をクリックすると
マスクしているMC内が少しずれてしまいます
ASがよく分からないもので、数値の部分を変えてみたりしましたが直らず・・。作ろうと思っているものは、MC内にボタンを置いて
クリックしたら音楽が流れるというものを考えているので
中にはボタンを入れています。
作ったものはURLに入れています。
改善方法がありましたらお教え頂ければ幸いです・・。
色々と他のスクロールバーの作り方を探したり教わったりしたのですが
関数や変数が難しすぎて無理でした・・(泣 - tera 2008-03-09 (日) 09:04
-
>しか様
こんにちは。
ソースが見れないのではっきりとは言えませんが、どうも見たところスライダーをクリックした瞬間に中身の位置がずれてますね。ということは:
・ムービークリップのどれか(多分マスクされるMCかな)の基準点が左上(0,0)からずれている可能性があります。もしくはマスクする方のMCの"中身"のy座標を0以外に移動したかとか。スクリプトとしては「スクロールバーのつまみ部分が一番上の時、マスクされるMCのy座標をマスクするMCのy座標0の位置にする」ように設定してあるはずなので、そこがおかしくなってますね。駄目なようなら、一旦全MCのy座標0にしてみてそこから一つずつ確認しながら移動させてみてください。コツは「ムービークリップの中身を移動させず、考えられる限り外側を移動するようにする」です。
あと「スライダーバーを変形ツールで変形しないようにする」とかですね。
あとは過去のコメント回答にヒントがあるかもしれません。
- しか 2008-03-16 (日) 01:59
-
お返事が遅れましてすいません!
座標をあわせたらちゃんとなりました!
有難う御座いました^^ - nanana 2008-04-25 (金) 17:18
-
こんにちは、はじめまして。
いつも拝見してましたが、わからないことが出来たので質問させていただきます。
お時間がある時で宜しいので、目を通していただけると嬉しいです。こちらのスライドバーのASに手を加えて、ウィンドウサイズ(setを包んだmc)を変更(y軸方向のみ)できるようにしました。
ウィンドウ(mc)の角を持ってドラッグすることで表示領域が縦に伸縮し、スライドバーも表示されている領域に比例して伸縮します。
上手くいったかな~と思ったのですが、デフォルトの大きさ以外の状態でスライドバーをクリックすると、スライドバーのy座標が0に戻されてしまいます。
それと同時にcontent_mcも移動してしまい、ぐちゃぐちゃになってしまいました。上の方の質問のように
「スライダーをクリックした瞬間に中身の位置がずれてますね。ということは:
・ムービークリップのどれか(多分マスクされるMCかな)の基準点が左上(0,0)からずれている可能性があります。もしくはマスクする方のMCの"中身"のy座標を0以外に移動したかとか。スクリプトとしては「スクロールバーのつまみ部分が一番上の時、マスクされるMCのy座標をマスクするMCのy座標0の位置にする」ように設定してあるはずなので、そこがおかしくなってますね。」
この辺りが関係していると思うのですが…。
サイズを変更して、スライドバーもそれにくっついていくようにするにはどこをどういじったら良いのでしょうか?お手すきの時にでもアドバイスを頂けると嬉しいです。
- tera 2008-04-25 (金) 17:30
-
>nanana様
はじめまして。こんにちは。
すみません。ちょっとすぐにはとりかかれないのですが、ちょっと状況が掴みづらいのですが、Stage自体をドラッグ変形しているイメージでしょうか?onResizeイベントで再計算みたいな?「ほほうなるほど!キラーン!」ってな感じで検証サンプルを作り上げるスキルを僕はあいにく持っていないので、もし可能であれば途中サンプルとかソースをアップしていただけたりすると助かりますですー。
ではでは~。
- nanana 2008-04-25 (金) 20:51
-
こんばんわ、とても早い返事に驚いてます。
ありがとうございます。こちらにflaファイルをアップいたしました。
http://www11.axfc.net/uploader/20/so/He_94899.zip.html
passは flash です。試作品なので、素材などそのまま使用しております。
恐らくそのままムービープレビューして頂ければ、現状が把握できると思います。
お手数かけますが、どうか宜しくお願いします。
- tera 2008-04-26 (土) 00:54
-
>nanana様
サンプル拝見しましたー。gotoAndPlay(1); とかがちょっと効率悪いかもしれまれん。重要になるのは「比率を再計算する部分」なので、そこをひとくくりにして関数化させたりしてちょっとずつ改造していくとよいかと思います。オリジナルのソースから作り直したものをアップしたので参考にしてみてくださいー。
http://www.trick7.com/blog/2008/04/26-001806.php
このエントリのソースから変更した箇所もあるので(まとめて関数化した部分)、上記URLのソースの方をベースにして作業していただくといいかと思います。※コメント内iiyoninaru様のコメントも同じ事例っぽいですね。今リンク切れのようですが。確認漏れすいません。>iiyoninaru様
Trackback:0
- TrackBack URL for this entry
- http://www.trick7.com/blog/mt-tb.cgi/263
- Listed below are links to weblogs that reference
- Flashスクロールバーのサンプル(flaファイル付き) from trick7.com blog



