Javascript初心者です。よろしくお願いします。
コンテンツをふわふわと上下に動かしたいです。
下記サイトの「ふわふわしてるコンテンツ」を参考にしました。
http://kaelab.ranadesign.com/mtctrl/mt-search.cg …
複数(20個程)のコンテンツを動かしたいのですが
それぞれに速度やふり幅を変えるにはどうすれば良いでしょうか。
今は、上記ブログに書いてあった下記コードを20個記載しています。
(function(){
var i = 0;
(function move(){
i = i > 0 ? -1 : 1;
var p = $("#test01").position().top;
$("#test01").animate({ top: p + i * 3 }, {
duration: 500,
complete: move
});
})();
})(jQuery);
また一定ではなく
animate({ top: p + i * 3 }と
animate({ top: p + i * 8 }
というふうに、ふり幅も2種類を繰り返し設定したい場合は
どうすれば良いのでしょうか。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
かいとうがつきませんね。
jQuery をつかっていません。
ふりはばは、[[x,y],[x1,y1],......]のように 相対的な座標をしてい します
さゆうにも、えんけいにも、うごけます
ぜんかくくうはくは、はんかくにおきかえてください
<!DOCTYPE html>
<title></title>
<meta charset="UTF-8">
<body>
<div id="hoge">
<p>test</p>
<img src="" alt="" id="g0">
<img src="" alt="" id="g1">
<img src="" alt="" id="g2">
<img src="" alt="" id="g3">
</div>
<script>
(function () {
var DEFAULT_OFFSET_POSITION = [[0,0], [2,1], [4,3], [2,1], [0,0], [-2,1], [-4,3], [-2,1]];
function getPosition (e) {
for (var x = 0, y = 0; e; e = e.offsetParent)
x += e.offsetLeft, y += e.offsetTop;
if ('undefined' === typeof this.x) this.x = x;
if ('undefined' === typeof this.y) this.y = y;
return this;
}
function Dancer (target, offsetAryPoint, interval, position) {
this.target = target;
this.point = offsetAryPoint;
this.interval = interval;
this.position = position;
this.timerId = null;
this.index = 0;
this.max = offsetAryPoint.length;
}
function LOOP () {
var n = this.index;
var s = this.target.style;
s.top = this.position.y + this.point[n][1] + 'px';
s.left = this.position.x + this.point[n][0] + 'px';
this.index = (n + 1) % this.max;
}
function start () {
var that = this;
if (! this.timerId)
this.timerId = setInterval (function () { LOOP.call (that) }, this.interval);
return this;
}
function stop () {
clearInterval (this.timerId);
this.timerId = null;
return this;
}
function create (target, offsetAryPoint, interval, position) {
if (1 > arguments.length)
throw new Error;
var p = getPosition.call (position || { }, target);
var s = target.style;
s.position = 'absolute';
s.top = p.y + 'px';
s.left = p.x + 'px';
var obj = new Dancer (
target,
offsetAryPoint || DEFAULT_OFFSET_POSITION,
interval || 50,
p
);
return obj.start ();
}
Dancer.prototype.start = start;
Dancer.prototype.stop = stop;
Dancer.create = create;
this.Dancer = Dancer;
}) ();
var src = 'data:image/gif;base64,' +
'R0lGODlhGAAYALMAAPr4+wBlAQaPARF9CSylD0K9Gk3OHlqzNFnSG23WMHa/TKHfXa3lbczs' +
'ocDpgf///yH5BAEAAA8ALAAAAAAYABgAAATZ8Mkpg72Wah3GWYzjMMsxBBtlKU7jvq6jZFvH' +
'wPjLnNzQxoyg8Ndw8CaBW4O0aDqdPwaqoig+r02GAFFozCSDJfaqBZgPjcEjcHCMn2UzQNA4' +
'WJhvkEAOaAhAdyAMH1h7cn4kUgNMewIGCJAIhmZ+BYkDiwuTW5CTfQIFCAkgmAwJngIEnpWR' +
'CTsDCVyefJ+hkQYJmLaqtJSgkZEFagQIj7x8lQbKywgEYMsGBZPJ0MtqEgTQ0p/V0M4TBMTQ' +
'Ao7dxt/g2ebd4Snh697o7gQF3QXtKRvh+/v5EQA7';
var imgs = document.getElementById ('hoge').getElementsByTagName ('img');
imgs[0].src = imgs[1].src = imgs[2].src = imgs[3].src = src;
var circle = (function (r, n) {
for (var a = [], i = 0; i < n * 2; i++)
a[i]=[Math.sin (i * Math.PI / n) * r |0, Math.cos (i * Math.PI / n) * r];
return a;
}) (50, 60);
Dancer.create (imgs[3], circle, 30, {x:300, y: 200});
Dancer.create (imgs[2], [[0,1], [0,2], [0,4], [0,6], [0,4], [0,2], [0,1], [0,0]], 50);
Dancer.create (imgs[1], [[0,1], [0,2], [0,4], [0,6], [0,4], [0,2], [0,1], [0,0]], 100);
Dancer.create (imgs[0]);
</script>
babu_baboo様
回答ありがとうございます。
お礼が遅くなってしまい申し訳ありません。
すすすすごいです!!!!
正直にいうと、半分くらい書いてもらったコードが理解出来ていないのですが
こまかく調整できて、まさに自分がやりたいことでした。
ありがとうございました!
No.2
- 回答日時:
>上記ブログに書いてあった下記コードを20個記載しています
基本的にはそれでも問題はないと思います。
数を増減したり、変更したりするときにコードをいちいち修正しなければならないのが、面倒といえば面倒ですが…
もう少し効率よく行ないたいというのであれば、可変にしたい部分を引数で定義できるような形にして、オブジェクト化しておくと、あとは個数分そのオブジェクトをnewなどで作れば良くなります。
オブジェクト化に関しては、以下あたりをご参考になさってください。
http://www.graviness.com/javascript/object.html
http://ja.wikibooks.org/wiki/JavaScript_%E3%82%A …
http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs0 …
http://www.graviness.com/virgo/javascript/object …
No1様がすでにその例を提示なさっていますが、ほぼ似たような例を…
(jQueryを使用していないのと、三角関数で動かす点も同じアイデアになっちゃってますが…)
周期(時間)、ふり幅(配列指定可能)、基準の表示位置、移動変換用関数などを指定可能な引数にしてあります。
停止用のボタンはおまけです。(あってもなくても問題ありません)
とりあえずのサンプルなので、解説はなしです。
(全角空白は半角に)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head><title>sample</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
</head>
<body>
<div id="hoge">
<img src="A.jpg" alt="A">
<img src="B.jpg" alt="B">
<img src="C.jpg" alt="C">
<input type="button" value="stop1" onclick="fuga[0].stop();">
<input type="button" value="stop2" onclick="fuga[1].stop();">
<input type="button" value="stop3" onclick="fuga[2].stop();">
</div>
<script type="text/javascript">
<!--
var moveImage = function(elm, p){
this.element = typeof elm === "string"?
document.getElementById(elm):elm;
this.moveFlag = false;
this.params = {
duration : p.duration || 1000,
amplitude : p.amplitude.length?p.amplitude:[p.amplitude],
top : p.top || 0,
left : p.left || 0,
locus : p.locus || function(d){
return Math.sin(2 * d * Math.PI);
}
}
this.index = 0;
this.augument = 30 / this.params.duration;
this.element.style.position = "absolute";
this.element.style.top = this.params.top + "px";
this.element.style.left = this.params.left + "px";
}
moveImage.prototype = {
start : function(){
if(this.moveFlag) return;
this.moveFlag = true;
this.move();
return this;
},
stop : function(){
this.moveFlag = false;
},
move : function(){
var t = this;
var e = t.element, i = t.index;
var a = t.augument, p = t.params;
var amp = p.amplitude[t.index];
var d = 0;
var t_id = setInterval(function(){
d += a;
if(d>1) d = 1;
var tmp = (p.top + p.locus(d) * amp) | 0;
e.style.top = tmp + "px";
if(d == 1){
clearInterval(t_id);
t.index = ++t.index % p.amplitude.length;
if(t.moveFlag) t.move();
}
}, 30);
}
}
var hoge = document.getElementById("hoge").getElementsByTagName("img");
var fuga = [];
fuga[0] = new moveImage(hoge[0], { amplitude:[10, 30, 60], top:100 }).start();
fuga[1] = new moveImage(hoge[1], { duration:2000, amplitude:30, top:200, left:200 }).start();
fuga[2] = new moveImage(hoge[2], { amplitude:[30, 10], top:300, left:300 }).start();
hoge = null;
//-->
</script>
</body>
</html>
fujillin様回答ありがとうございます。
お礼が遅くなってしまい申し訳ありません。
オブジェクト化は良く分からないので、早速リンクしてくださったサイトを読ませていただきます。
No1様もそうでしたが、fujillin様もオブジェクトを自由自在に動かせて
本当に本当にすごいです!!
書いてくださったコードを元に、ふわふわしたコンテンツを頑張ってみます。
ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
ジェネレーターの作り方
-
ASP.NETのコントロールの値をJa...
-
なぜmatchメソッドがエラーにな...
-
html javascript リンク先アド...
-
毎日日付の変わるタイミングを...
-
canvas上で画像を移動する方法...
-
GASでundefinedエラーが出ます
-
フォームで電話番号の判定を行...
-
C#OpenCv V4にのエラーに関する...
-
JavaScriptでテーブル内?に矢...
-
javascriptでiframeのURL変更は?
-
setTimeoutによる繰り返しが途...
-
JavaScriptを使って毎日決まっ...
-
指定日数経過でHTML上のデータ...
-
【javascript】正規表現で括弧...
-
javascriptで同文字の出現回数...
-
javaScript textareaの一行あた...
-
特定のclassを表示、非表示にする
-
ホームページの最終更新日を他...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
ジェネレーターの作り方
-
GASでundefinedエラーが出ます
-
ASP.NETのコントロールの値をJa...
-
C#で、ContextMenuStripに動的...
-
翌月を取得するGASが分かりません
-
gas スプレッドシートがアクテ...
-
ASP.NET MVCでObjectをjsに渡す
-
シンプルなweb版スタンプラリー...
-
ローカルにあるファイルを検索...
-
なぜmatchメソッドがエラーにな...
-
VSCODE[Python]の設定について
-
1日1回だけ引けるjavascriptお...
-
javascriptでiframeのURL変更は?
-
html javascript リンク先アド...
-
lengthが読めない理由が分からない
-
googleスプレッドシートのApps ...
-
【javascript】正規表現で括弧...
-
HTMLにWSHを組み込む
おすすめ情報