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

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

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

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

Q&A

解決済

1回答

883閲覧

TweenMaxを使って要素が可視範囲に入ったらフェードインさせたい

hayakawatakuma

総合スコア21

JavaScript

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

0グッド

1クリップ

投稿2019/04/24 03:22

要素が可視範囲に入ったらTweenMaxを発火させたいです。(ソースもなるべくスマートに)

「TweenMax スクロール」で調べるとScrollMagicとの併用が書かれた記事がありますが、
下記実装するとフェードインさせたい要素ごとに"move1""move2"とクラスを付けていき、jsの記述が膨大になってしまいます。

html

1 <section> 2 <div class="section-in"> 3 <ul> 4 <li class="move1">フェードインで表示される</li> 5 <li class="move1">フェードインで表示される</li> 6 <li class="move1">フェードインで表示される</li> 7 </ul> 8 </div> 9 </section> 10 11 <section> 12 <div class="section-in"> 13 <ul> 14 <li class="move2">フェードインで表示される</li> 15 <li class="move2">フェードインで表示される</li> 16 <li class="move2">フェードインで表示される</li> 17 </ul> 18 </div> 19 </section> 20 21 <section> 22 <div class="section-in"> 23 <ul> 24 <li class="move3">フェードインで表示される</li> 25 <li class="move3">フェードインで表示される</li> 26 <li class="move3">フェードインで表示される</li> 27 </ul> 28 </div> 29 </section> 30

js

1 var controller = new ScrollMagic(); 2 var move1 = TweenMax.staggerFromTo(".move1", 1, { 3 opacity: 0, 4 y: 35 5 }, { 6 opacity: 1, 7 y: 0 8 }, 0.2); 9 var scene = new ScrollScene({ 10 triggerElement: ".move1", 11 reverse: false 12 }) 13 .setTween(move1) 14 .addTo(controller); 15 16 var move1 = TweenMax.staggerFromTo(".move2", 1, { 17 opacity: 0, 18 y: 35 19 }, { 20 opacity: 1, 21 y: 0 22 }, 0.2); 23 var scene = new ScrollScene({ 24 triggerElement: ".move2", 25 reverse: false 26 }) 27 .setTween(move2) 28 .addTo(controller); 29 30}); 31 32以下続く

jsの記述をもっとスマートにするため、ScrollMagicは使わず、下記実装しようとしたのですが、動作せず。。。。

html

1 <section> 2 <div class="section-in"> 3 <ul> 4 <li class="move">フェードインで表示される</li> 5 <li class="move">フェードインで表示される</li> 6 <li class="move">フェードインで表示される</li> 7 </ul> 8 </div> 9 </section> 10 11 <section> 12 <div class="section-in"> 13 <ul> 14 <li class="move">フェードインで表示される</li> 15 <li class="move">フェードインで表示される</li> 16 <li class="move">フェードインで表示される</li> 17 </ul> 18 </div> 19 </section> 20 21 <section> 22 <div class="section-in"> 23 <ul> 24 <li class="move">フェードインで表示される</li> 25 <li class="move">フェードインで表示される</li> 26 <li class="move">フェードインで表示される</li> 27 </ul> 28 </div> 29 </section> 30

js

1$(window).scroll(function (){ 2       var animationFlag = false; 3 $("section").each(function(){ 4 var imgPos = $(this).offset().top; 5 var scroll = $(window).scrollTop(); 6 var windowHeight = $(window).height(); 7 if (scroll > imgPos - windowHeight + windowHeight - 300){ 8          if(!animationFlag) { 9    animationFlag = true; 10 TweenMax.staggerFromTo(".move", 1, { 11 opacity: 0, 12 x: -35 13 }, { 14 delay: 0.8, 15 opacity: 1, 16 x: 0 17 }); 18    } 19            } 20 }); 21 });

解決方法のご教示をお願いいたします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

見た所、毎回同じアニメーションのようなので、ScrollMagicとTweenMaxに関わる共通処理を関数化するといいと思います。

以下、コードの参考です。

JavaScript

1var controller = new ScrollMagic(); 2 3function createScene(selector) { 4 var tween = TweenMax.staggerFromTo(selector, 1, { 5 opacity: 0, 6 y: 35 7 }, { 8 opacity: 1, 9 y: 0 10 }, 0.2); 11 12 var scene = new ScrollScene({ 13 triggerElement: selector, 14 reverse: false 15 }) 16 .setTween(tween) 17 .addTo(controller); 18 19 return scene; // 一応、処理した値を取得できるようにreturnしています 20} 21 22var scene1 = createScene(".move1"); 23var scene2 = createScene(".move2"); 24// 以下繰り返し宣言する...

もし最後の宣言部分をさらにまとめたければ、for文かArray.prototype.forEach()メソッドで複数のセレクタに対して処理を繰り返すのもいいと思います。

JavaScript

1// for文で .move1 から .move10 までのセレクタを処理する場合 2for (var i = 1; i < 11; i++) { 3 createScene(".move" + i); // ループ毎に ".move1", ".move2", ... となる 4}

JavaScript

1// Array.prototype.forEach()で、好きなセレクタを繰り返し処理する場合 2var selectors = [ 3 ".move1", 4 ".move2", 5 ".move3", 6 ".other-selector" 7] 8 9selectors.forEach(function(selector) { 10 createScene(selector); 11});

もし、セレクタ毎にアニメーションを変えたいなどの要望が出てきたらcreateScene()関数の引数を増やして、処理を少しかえれば対応できます。

下記のコードは、アニメーションの秒数をセレクタ毎に変える場合の参考です。

JavaScript

1var controller = new ScrollMagic(); 2 3function createScene(selector, duration) { 4 var tween = TweenMax.staggerFromTo(selector, duration, { 5 opacity: 0, 6 y: 35 7 }, { 8 opacity: 1, 9 y: 0 10 }, 0.2); 11 12 var scene = new ScrollScene({ 13 triggerElement: selector, 14 reverse: false 15 }) 16 .setTween(tween) 17 .addTo(controller); 18 19 return scene; // 一応、処理した値を取得できるようにreturnしています 20} 21 22var scene1 = createScene(".move1", 1); 23var scene2 = createScene(".move2", 2);

反復処理する場合は、以下のようにするのがひとつの手段です。

JavaScript

1var sceneOptions = [ 2 { selector: ".move1", duration: 1 }, 3 { selector: ".move2", duration: 2 }, 4 { selector: ".move3", duration: 3 }, 5 { selector: ".other-selector", duration: 4 } 6] 7 8sceneOptions.forEach(function(sceneOption) { 9 createScene( 10 sceneOption.selector, 11 sceneOption.duration 12 ); 13});

もちろん、createScene(options)のように、引数をひとつのオブジェクトにして、関数の中でTweenMax.staggerFromTo(options.selector)と展開してもいいです。引数で指定したい変数が増えてきたらオブジェクトにした方がいいと思います。


2019/04/26 追記

ScrollMagicのtriggerElementはCSSセレクタではなくHTML要素(Element)そのものを指定することができます。また、TweenMax.staggerFromTo()の第1引数も、CSSセレクタではなく、HTML要素(Element)の配列を指定することができます。

それぞれに別々のクラスを付与するのではない場合、特定のクラスがついている要素を取得して反復処理をすればいいです。

以下、jQueryを使用した場合の参考です。

JavaScript

1var controller = new ScrollMagic(); 2 3function createScene(element) { 4 var tween = TweenMax.staggerFromTo([ element ], 1, { 5 opacity: 0, 6 y: 35 7 }, { 8 opacity: 1, 9 y: 0 10 }, 0.2); 11 12 var scene = new ScrollScene({ 13 triggerElement: element, 14 reverse: false 15 }) 16 .setTween(tween) 17 .addTo(controller); 18 19 return scene; // 一応、処理した値を取得できるようにreturnしています 20} 21 22// 特定のCSSクラスを持つ要素のjQueryオブジェクトを取得 23var $targets = $('.move'); 24 25// jQueryの`each()`メソッドで、要素一つ一つを処理 26$targets.each(function() { 27 // このfunctionの中で`this`は'move'クラスを持つ要素です 28 createScene(this); 29});

ところで、複数の要素を連続してアニメーションさせるのでなく、それぞれ独立して動かすのであれば、TweenMax.staggerFromTo()ではなくて、TweenMax.fromTo()でよいのではないですか?
(注:TweenMax.fromTo()の場合は、要素の配列ではなく、要素を指定します)

投稿2019/04/24 13:54

編集2019/04/25 16:32
NozomuIkuta

総合スコア1260

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

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

hayakawatakuma

2019/04/25 03:16

ご回答ありがとうございます! JSの記述は短くなったのですが、 やはり同じ動きだとしてもmove1、move2 ・・・とclass名が増えてくるのがちょっと。。。 1つのクラスだけでなんとかできないでしょうか? 下記サイトの様にclassに「js-scrollShow」を指定してあげれば tweenmaxが発火する様なイメージです。 http://goodlife-inc.co.jp/
hayakawatakuma

2019/04/27 06:41

ご丁寧にありがとうございます! 希望とする挙動となりました!
NozomuIkuta

2019/04/27 10:21

解決したようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問