質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

4826閲覧

javascriptのみでイージングの効いたアニメーションを実装したい

owl

総合スコア42

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2017/10/01 23:27

###前提・実現したいこと
jQueryなどのプラグインを使わずにJavaScriptのみでイージングの効いたアニメーションを実現させたいです。

現状としましてはsetIntervalを使い、0.01秒間隔でidがboxの要素のcssにプラス一づつ増やしていき、横に動かしています。
値が200以上になるとclearIntervalを使ってストップさせています。
ここまでは実装できたのですが、200に近づくにつれて移動速度を遅くしたい(イージングさせたい)と思っています。

###試したこと
プラス2づつ増やしていき、例えば150以上になったらプラス1づつに変更させてみたのですが、当たり前ですが、急にがくんと変化し、この考え方だと160以上ならプラス0.5づつ、170以上なら0.25ずつ増やすといったやり方になってしまうため、汎用性がないと思います。

該当のソースコードをjsfiddleにアップしていますので、
ご活用ください。
https://jsfiddle.net/ululami/54faxmgm/

ご回答、アドバイスよろしくお願いいたします。

###該当のソースコード

javascript

1var timer; 2var xPosition = 0; 3 4timer = setInterval('moveBox();', 10); 5 6function moveBox(){ 7 xPosition ++; 8 document.getElementById('box').style.left = xPosition + 'px'; 9 10 if(xPosition >= 200){ 11 clearInterval(timer); 12 } 13}

html

1<div id="box"></div>

css

1#box{ 2 width: 100px; 3 height: 100px; 4 background: tomato; 5 position: relative;; 6}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/02 00:46

CSS3 の animation (例: https://www.w3schools.com/css/css3_animations.asp ) は質問者さんの目的に使えないでしょうか? (検討したが使えないという結論になったとか、勉強のため JavaScript でやりたいということでしたら失礼しました。でも、その場合はそのことも質問に書いておいていただけると助かります)
owl

2017/10/02 00:52

ご返答ありがとうございます。SurferOnWwwさんの推察通り勉強のためにjsのみを使う感じです。記入不足で申し訳ないです。
guest

回答5

0

ベストアンサー

このようなアニメーションを実現する場合, アニメーション開始後の「位置を加算していく」のではなく「ある時刻の位置を計算する」(タイムラインアニメーション)ようにします.

こうするとアニメーションの進み具合(進捗度)を考えることが出来て, この値から実際のアニメーション位置を決定するイージング関数を挟むことが可能となります

これはCSSやjQuery等に共通するWEBにおけるアニメーションの標準的な考え方です.

https://jsfiddle.net/defghi1977/54faxmgm/5/

JavaScript

1document.addEventListener("DOMContentLoaded", function(){ 2 "use strict"; 3 //タイマー識別子 4 var timer; 5 //アニメーション開始時刻 6 var begin; 7 //アニメーション持続ミリ秒 8 var dur = 2000; 9 //アニメーション開始値 10 var from = 0; 11 //アニメーション終了値 12 var to = 200; 13 //アニメーション対象 14 var style = document.getElementById("box").style; 15 //イージング関数 16 function easing(progress){ 17 return Math.pow(progress, 0.5); 18 } 19 //アニメーションを行う関数 20 function moveBox(){ 21 //アニメーションの進捗(0〜1) 22 var progress = (Date.now() - begin) / dur; 23 if(progress > 1){ 24 progress = 1; 25 } 26 style.left = (from + (to - from) * easing(progress)) + 'px'; 27 //進捗が1になったら処理を停止 28 if(progress == 1){ 29 clearInterval(timer); 30 } 31 } 32 //アニメーションの実行 33 begin = Date.now(); 34 timer = setInterval(moveBox, 10); 35});

投稿2017/10/02 01:18

編集2017/10/02 02:57
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namnium1125

2017/10/02 02:42 編集

お節介かもしれませんがjsfiddleのほうでアニメーションがうまくいってないみたいです。 javascriptのLOAD TYPEを変更したらうまくいったので、もし暇がありましたら直してみてはいかがでしょうか?
owl

2017/10/04 13:16

ご回答ありがとうございます。 時刻の位置を計算する方法だととてもスムーズなアニメーションで感動しました。またこの考え方はWEBにおける標準的な考え方のようですので、しっかりと勉強します。 本当にありがとうございました。
guest

0

jsFiddleを更新してみました。
様々な種類のイージングを見れます。

https://jsfiddle.net/54faxmgm/3/

イージングとは、時間経過に対して特定の計算をすることで、グラフの曲線を得るものになっていますので、「スタート」「ゴール」「現在時刻」から割合を求めて特定の計算式に投げ込むことで結果を得られます。このグラフが参考になるでしょう。
http://easings.net/ja

投稿2017/10/02 01:12

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

owl

2017/10/04 13:21

ご回答ありがとうございます。 たくさんのサンプルをありがとうございます。 とてもわかりやすく、スムーズに動かすにはちゃんとした計算が必要だと理解できました。 本当にありがとうございます。
guest

0

この手の処理を自前で用意したいなら、0から1までの範囲を動くグラフを書いてみることです。
加速度的に処理を早めるならy=x^n、遅くするならy=x^(1/n)するといいでしょう

javascript

1<script> 2window.onload=function(){ 3 var hoge1=document.querySelector("#hoge1"); 4 var hoge2=document.querySelector("#hoge2"); 5 var hoge3=document.querySelector("#hoge3"); 6 var hoge4=document.querySelector("#hoge4"); 7 var hoge5=document.querySelector("#hoge5"); 8 var i=1; 9 var ms=1000;//ミリ秒 10 var stp=100;//刻み 11 var dst=300;//距離 12 var timerId=setInterval(function(){ 13 hoge1.style.marginLeft=(Math.pow(i/stp,1/3)*dst)+"px"; 14 hoge2.style.marginLeft=(Math.pow(i/stp,1 )*dst)+"px"; 15 hoge3.style.marginLeft=(Math.pow(i/stp,2 )*dst)+"px"; 16 hoge4.style.marginLeft=(Math.pow(i/stp,3 )*dst)+"px"; 17 hoge5.style.marginLeft=(Math.pow(i/stp,10 )*dst)+"px"; 18 i++; 19 if(i>stp){ 20 clearInterval(timerId); 21 } 22 },ms/stp); 23} 24</script> 25<div id="hoge1" style="position:relative;background-Color:blue;width:100px;height:100px"></div> 26<div id="hoge2" style="position:relative;background-Color:aqua;width:100px;height:100px"></div> 27<div id="hoge3" style="position:relative;background-Color:lime;width:100px;height:100px"></div> 28<div id="hoge4" style="position:relative;background-Color:yellow;width:100px;height:100px"></div> 29<div id="hoge5" style="position:relative;background-Color:gray;width:100px;height:100px"></div> 30

投稿2017/10/02 01:45

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

owl

2017/10/04 13:18

ご回答ありがとうございます。 まずはグラフから考える必要があると改めて奥の深さに感動しました またサンプルもあり非常にわかりやすかったです。 本当にありがとうございます。
guest

0

transform は使わないですか?

javascript

1element.style.transition = 'transform 1s ease'; 2element.style.transform = 'translateX(200px)';

もしくはleft

javascript

1element.style.transition = 'left 1s ease'; 2element.style.left = '200px';

ease -> ease-out, ease-in に変更など

投稿2017/10/02 01:09

編集2017/10/02 02:03
kimurayu

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

owl

2017/10/04 14:23

ご回答ありがとうございます。 できるだけjavascriptで計算をしてやりたかったのですが、 この方法もあると勉強になりました。 本当にありがとうございます。
guest

0

調べてみたところ2次関数を使ったりするのが一般的みたいですね。

フォークして試しに2次関数を組み込んでみました。

ちょっと変数がごちゃついてしまいましたが。。(^ ^;
新たに定義したquad()がミソです。

javascript

1var timer; 2var intrvl = 10; 3var t = 0; 4var xPosition = 0; 5var end = 200; 6var endSec = end*intrvl; 7 8timer = setInterval('moveBox();', intrvl); 9 10function moveBox(){ 11 t += intrvl; 12 xPosition = quad(t); 13 document.getElementById('box').style.left = xPosition + 'px'; 14 15 if(xPosition >= end){ 16 clearInterval(timer); 17 } 18} 19 20function quad(time){ 21 return -(Math.pow((time-endSec),2))/(endSec*intrvl)+end; 22}

jsfiddle

投稿2017/10/02 01:09

編集2017/10/02 01:10
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

owl

2017/10/04 13:23

ご回答ありがとうございます。 実際のサンプルはとても参考になりました。 2次関数が鍵みたいですので、これから勉強してみます。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問