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

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

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

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

Q&A

解決済

4回答

2192閲覧

【JavaScript】イラストや文章等を時間をずらして表示させるには?

umauman

総合スコア57

JavaScript

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

0グッド

0クリップ

投稿2017/08/12 12:50

###前提・実現したいこと
イラストや文章等の要素を時間をずらして表示させるような効果を付けたいと思っています。
遅延時間に法則性はありません。

思いついたのが、「setTimeout」を使う方法です。

とりあえず下記2パターンで思い通りの動きにはなりました。

###HTML

html

1<p id="text01">1番目の文章(1秒後に表示)</p> 2<p id="text02">2番目の文章(1.5秒後に表示)</p> 3<p id="text03">3番目の文章(4.5秒後に表示)</p>

###CSS

css

1p {display: none;}

###パターン1

JavaScript

1setTimeout(function (){ 2 document.getElementById('text01').style.display = 'block'; 3}, 1000); 4setTimeout(function (){ 5 document.getElementById('text02').style.display = 'block'; 6}, 1500); 7setTimeout(function (){ 8 document.getElementById('text03').style.display = 'block'; 9}, 4500);

###パターン2

JavaScript

1setTimeout(function() { 2 document.getElementById('text01').style.display = 'block'; 3 setTimeout(function() { 4 document.getElementById('text02').style.display = 'block'; 5 setTimeout(function() { 6 document.getElementById('text03').style.display = 'block'; 7 }, 3000); 8 }, 500); 9}, 1000);

ただ、このような記述が良いものかがわかりません。
下記についてご教授いただけないでしょうか?

-「setTimeout」を使用した場合の良い記述
-「setTimeout」以外でこのような効果を付ける記述

通常このような効果を付けるにはどのような記述をするのが一般的であるか知りたく思っています。
もしくは生のJavaScriptでこのような効果をつけることはあまり無かったりするのでしょうか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

個人的には非同期処理を同期処理のようにしたい場合はPromiseを利用して記述しています。
※IE11はPromiseに対応していないので、こちらのpolyfillを読み込むことで同様の処理が可能です。
babelやTypescriptの変換環境があるのであれば、await/asyncを利用すればより簡素に記述できます。

javascript

1var anime = function (target, delay) { 2 return new Promise(function (resolve, reject) { 3 setTimeout(function () { 4 document 5 .querySelector(target) 6 .setAttribute('class', 'show'); 7 8 resolve(); 9 }, delay); 10 }); 11} 12 13anime('#text01', 1000) 14 .then(function () { 15 anime('#text02', 500) 16 }) 17 .then(function () { 18 anime('#text03', 3000) 19 });

https://jsfiddle.net/takmatz/b7ugohwq/

投稿2017/08/12 13:36

編集2017/08/12 13:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

umauman

2017/08/12 17:39

ご回答ありがとうございます。(サンプルコードも感謝いたします!) PromiseについてMDNの記事等少し読んでみました。ちょっと初心者にはハードルが高そうですが勉強してみようと思います。 スタイルを付与するように書いてくださったので、CSSの方でもう少し工夫もできるかもしれません。
guest

0

仕様としてどちらを実現したいのでしょうか?

  • text2は画面表示後1.5秒後に表示したい
  • text2はtext1が表示されてから0.5秒後で表示したい

この2つは似ているようで大きく異なります。
前者ならパターン1、後者ならパターン2ですね

JavaScriptの経験も浅いということなので
わかりやすさ重視でsetTimeoutをつかうのはありだと思います

ただDOMのスタイルを直接操作することはやめましょう
初期値でis-hidden的なクラスをつけておき時間が来たら外すのが良いと思います
あと、共通の処理になる場合は関数にまとめたほうが良いです

HTML

1<p id="text01" class="is-hidden">1番目の文章(1秒後に表示)</p> 2<p id="text02" class="is-hidden">2番目の文章(1.5秒後に表示)</p> 3<p id="text03" class="is-hidden">3番目の文章(4.5秒後に表示)</p>

CSS

1.is-hidden { display: none; }

JavaScript

1function show(id, delay, next) { 2 setTimeout(function() { 3 var target = document.getElementById(id) 4 target.classList.remove('is-hidden') 5 if (next) next() 6 }, delay) 7} 8// パターン1 9show('text01', 1000) 10show('text02', 1500) 11show('text03', 4500) 12 13// パターン2 14show('text01', 1000, function() { 15 show('text02', 500, function() { 16 show('text03', 3000) 17 }) 18}) 19

ちゃんと動かしていないですがおそらく動くはずです
classList.removeはブラウザによっては使えないため注意

投稿2017/08/12 18:31

taqm

総合スコア65

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

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

umauman

2017/08/13 05:00

ご回答ありがとうございます。 初心者向けに考えてくださって感謝いたします。 処理としては今作っているものに関しては、順番に表示したい(前のアニメーションが終わってから)なので、後者の「text2はtext1が表示されてから0.5秒後で表示したい」に当たるのかなと思います。 >ただDOMのスタイルを直接操作することはやめましょう そうなのですね。普通にこのような書き方をしてしまっていました。 調べてみたのですが、「拡張性に欠ける」「数が多くなると負荷がかかる」といった感じの内容が出てきますね。(という認識で大丈夫でしょうか?) classのつけ外しで調整してみようと思います。 関数にまとめる方法も教えていただき、とても助かります。 ソースを見て思ったのですが、要素の取得はIDで行って、実際の表示部分の制御はclassのつけ外しで行うといった役割分担もテクニックなのかなと思いました。 (要素取得はIDで行うのが速い、と入門書で学習したので…)
guest

0

方法は他の方が示されているので、JavaScriptの簡単な説明を記載しておきます。

パターン1の場合、1番目の文章と2番目の文章の間に新たに文章を追加したいときに非常に手間になります。なぜなら、以降の処理すべての秒数をずらす必要があり保守性に欠けます。
また、setTimeout() は、指定ミリ秒後に実行するという単純な仕組みなので、実行順序が保証されているわけでもありません。

パターン2の場合、パターン1とは違い実行順序は保証されています。しかし、処理が増えるにつれて入れ子(ネスト)になり、1つの関数が肥大化する傾向にあります。ゆえに、途中に処理を追加するときに一見してどこに挿入したらよいのか分かりにくいという問題があります。
このような問題をコールバック地獄といいます。

このコールバック地獄の問題を解決するのが、ECMAScript6から追加されたPromiseオブジェクトです。
対応ブラウザに問題がなければ、こちらを利用されたほうがすっきりとした記述で実現できるかと思います。
Tak_Matzさんが紹介してくれているのでそちらが分かりやすいかと思います。

Promise - JavaScript | MDN
Promises - Can I use

参考になれば幸いです。

投稿2017/08/13 03:27

編集2017/08/13 03:31
syuus

総合スコア403

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

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

umauman

2017/08/13 05:23

補足説明ありがとうございます。 とてもわかりやすい解説です。 setTimeoutは理解しやすくて良いな、と思ったもののおっしゃるとおり、順序を保証したい場合(パターン2)は永遠とネストしていくのかな?と考えていたところでした。 コールバック地獄…まさに… Promiseオブジェクトに挑戦してみようと思います。 ちょっと本題から反れるのですが、入門の時点で、ECMAScript6の記法を学習する方がいいのかな?と思っていたりします。(なかなか初心者向けの情報が見当たらないですが) ブラウザ対応等の参考リンクもありがとうございました!
syuus

2017/08/13 05:32

ECMAScript6 + Babelで解説されているJavaScriptの入門書がいくつか出ているので、JavaScriptを学習したいのであればそういった書籍を購入されるのが良いかと思います。
umauman

2017/08/13 05:43

何度もありがとうございます。 手元にある「JavaScript本格入門」という書籍が比較的、JavaScript初学者向けにもわかりやすく解説されているといった印象ですが、「Babel」のキーワード込で他の書籍も当たってみようと思います。 今のところ、Babel公式サイトの変換ツールでちょっと遊んでみている程度なのですが;
syuus

2017/08/13 05:50

お持ちの書籍の最新版「改訂新版JavaScript本格入門」では、Babelの解説やトランスコンパイラーとしてBabelを採用して検証したコードが記載されているようです。もしかしたらお手元の書籍に解説があるかもしれません。
umauman

2017/08/13 06:11

手元にあるのは「改訂新版」です。おっしゃる通り、Babelの項目等々あります。せっかくなので頑張ってみようかと思います。 何度もご親切にアドバイスいただきまして本当にありがとうございました!
guest

0

ある程度細かく動くのであればアニメーション系ライブラリを試すのも手だと思います。「アニメーション javascript ライブラリ」でいくつか出てくると思います(下記は一例です)。

【ウェブのアニメーション制作に役立つ! 流行りのJSライブラリのまとめ - ICS MEDIA】
https://ics.media/entry/14973

【最速のアニメーションライブラリはこれだ! JSライブラリの性能をDOMとWebGLで比較検証 - ICS MEDIA】
https://ics.media/entry/14993

【Googleも推奨!アニメーションライブラリTweenMaxの使い方 入門編 | un-Tech】
http://un-tech.jp/tweenmax-started/

投稿2017/08/12 15:00

kei344

総合スコア69400

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

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

umauman

2017/08/12 17:42

ご回答いただきありがとうございます。 アニメーションライブラリ、沢山ありすぎて悩みますが、今後、シンプル軽量なものを検討してみようと思います。色々なサンプルを見てみましたがとても面白いです。 添付いただいたページに、唯一使用しているjQueryが「幅広い環境で動作する枯れた技術」などと書かれており、ちょっと落胆していますが。jQuery、好きなのですが…。
kei344

2017/08/12 17:48

> jQuery、好きなのですが…。 私も常用していますよー。 大規模なフレームワークがいくつか出てきているので、それらと比較されてしまうのは仕方がないかなと思います。アニメーションについても同じ事で、jQueryはリッチなアニメーションを低負荷で処理することを目指しているわけではないため、アニメーション専用ライブラリに比べると見劣りするというだけだと思います。
zohnam

2017/08/13 00:25

「枯れた技術」というのは、悪い意味ではありませんよ。 長年使い込まれているのでもうトラブルの起きる余地がない、安定した技術という感じの、いい意味の言葉です。
umauman

2017/08/13 01:20

お二方ともコメントありがとうございます。 最近「jQuery」ダメダメ。もうすぐ無くなるよ、と煽る情報が多くて焦っていたりするのですが… おっしゃる通り記述のお手軽さと同時にトラブルが少ないのがとてもありがたいです。 アニメーションに特化したライブラリにも興味が湧きました。(ちょっと物理学できちゃうような錯覚に陥りそうですね…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問