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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

3回答

3158閲覧

jQuery:スクロールして画像が可視範囲に入ったらアニメーションをスタートさせたい。

rrgsn

総合スコア9

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/05/02 09:21

編集2020/05/02 11:24

前提・実現したいこと

スクロールして画像が可視範囲に入ったらアニメーションをスタートさせたい。

section3にある、imgが表示範囲に入った際に、画像がフェードインするようにしたい。

発生している問題・エラーメッセージ

画像が可視範囲に入る以前に
サイトを開いた時点でアニメーションが作動してしまう。

該当のソースコード

HTML

1<section id="section3" class="section section3"> 2 <h1>Company Profile</h1> 3 <div class="img-wrap3"> 4 <img src="/Users/xxxx/Desktop/xx/images/header_image.jpg"> 5 </div> 6</section> 7

CS

1 2 3 .img-animation { 4 animation: img-opacity 2s cubic-bezier(.4, 0, .2, 1); 5 overflow: hidden; 6 position: relative; 7 } 8 9 10 .img-animation:before { 11 animation: img-animation 2s cubic-bezier(.4, 0, .2, 1) forwards; 12 background: #fff; 13 bottom: 0; 14 content: ''; 15 left: 0; 16 pointer-events: none; 17 position: absolute; 18 right: 0; 19 top: 0; 20 z-index: 1; 21 } 22 23 @keyframes img-opacity { 24 0% { 25 opacity: 0; 26 } 27 } 28 29 @keyframes img-animation { 30 100% { 31 transform: translateX(100%); 32 } 33 } 34 35 36

JS

1 2$(window).on(function() { 3 const image = document.querySelectorAll('.img-wrap3'); 4 5 const observer = new IntersectionObserver(function(entries) { 6 entries.forEach(function(entry) { 7 if (entry.intersectionRatio > 0) { 8 entry.target.classList.add('img-animation'); 9 } else { 10 entry.target.classList.remove('img-animation'); 11 } 12 }); 13 }); 14 15 Array.prototype.forEach.call(image, function(img) { 16 observer.observe(img); 17 }); 18 }) 19

補足情報(FW/ツールのバージョンなど)

https://firstlayout.net/css-animation-of-images/
上記サイトのスクロールアニメーションを参考にしています。

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

【jQuery】特定の位置まで来たらイベントを実行 | blog del Teorico

とか、参考になりませんでしょうか。検索したキーワードは、「jquery スクロール イベント」です。

【追記】

javascript

1$(window).on(function() {

javascript

1$(window).on('load', function() {

に変更したら、意図通りに動きませんか?

投稿2020/05/02 09:28

編集2020/05/02 11:36
Yasumichi

総合スコア1773

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

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

rrgsn

2020/05/02 10:01

正直よくわかりません。。。。 $(window).on(function() { として変更してみましたが、どうにも治らないですね.......
Yasumichi

2020/05/02 10:11 編集

jQuery 云々よりも CSS との整合が取れていないような? img-animation クラスでアニメーションを実現したいんですよね? css 側で該当クラスの宣言がないような? .img-ani は、示された html の外側で付与されているのでしょうか?
rrgsn

2020/05/02 11:26

失礼しました。 色々と試行錯誤しており、以前のコードを載せてしまいました。 編集しましたが、こちらではいかがでしょうか
Yasumichi

2020/05/02 11:37

元の回答に【追記】で修正案を載せました。確認してみてください。
rrgsn

2020/05/02 11:43

ああああ!なんと!! 望む通りの挙動になりました!!!! この挙動を得るために数日費やしました...... 本当にありがとうございます!!!!
rrgsn

2020/05/02 12:00

ちなみに、同じ仕様で、別アニメーションを他の画像に反映させるにはどうしたらよいですか? const image = document.querySelectorAll('img-wrap2, .img-wrap3'); としたり、 entry.target.classList.add('img-animation2','img-animation3'); その他丸々コピーして、やったりしましたが、 うまく別のアニメーションを反映できず
rrgsn

2020/05/02 12:11

上記解決しました。 Array.prototype.forEach.call(image, function(img) { observer.observe(img); });  }) の部分を除外したものをコピーしていたので、 該当ソースコードJSの全てコピーして、class名だけ変えて反映できました。
Yasumichi

2020/05/02 12:14

恥ずかしい話、Intersection Observer API 自体を今回、初めて知りました。 それぞれ、別の Intersection Observer を立てるか、entry.target.classList.add の前に 'img-animation2' を持ってるかどうかとか、判定して付与するクラスを変えるかぐらいですかね。
rrgsn

2020/05/02 12:18

本当にご丁寧にありがとうございました。 これで作業が進められます。。。。
guest

0

$(window).on('load', function() に変更することで解決。
(ベストアンサーの方の助言により解決)

(補足)
下記は複数のクラスに別々のアニメーションを付与する場合のコード。

JS

1 $(window).on('load', function() { 2 const image = document.querySelectorAll('.img-wrap2'); 3 4 const observer = new IntersectionObserver(function(entries) { 5 entries.forEach(function(entry) { 6 if (entry.intersectionRatio > 0) { 7 entry.target.classList.add('img-animation2'); 8 } else { 9 entry.target.classList.remove('img-animation2'); 10 } 11 }); 12 }); 13 14 15 16 Array.prototype.forEach.call(image, function(img) { 17 observer.observe(img); 18 }); 19 }) 20 21 22 $(window).on('load', function() { 23 const image = document.querySelectorAll('.img-wrap3'); 24 25 const observer = new IntersectionObserver(function(entries) { 26 entries.forEach(function(entry) { 27 if (entry.intersectionRatio > 0) { 28 entry.target.classList.add('img-animation3'); 29 } else { 30 entry.target.classList.remove('img-animation3'); 31 } 32 }); 33 }); 34 35 36 37 Array.prototype.forEach.call(image, function(img) { 38 observer.observe(img); 39 }); 40 })

投稿2020/05/02 12:15

rrgsn

総合スコア9

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

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

0

JS

1 2 $(window).on('load', function() { 3 const image = document.querySelectorAll('.img-wrap2'); 4 5 const observer = new IntersectionObserver(function(entries) { 6 entries.forEach(function(entry) { 7 if (entry.intersectionRatio > 0) { 8 entry.target.classList.add('img-animation2'); 9 } else { 10 entry.target.classList.remove('img-animation2'); 11 } 12 }); 13 }); 14 15 16 17 Array.prototype.forEach.call(image, function(img) { 18 observer.observe(img); 19 }); 20 }) 21 22 23 $(window).on('load', function() { 24 const image = document.querySelectorAll('.img-wrap3'); 25 26 const observer = new IntersectionObserver(function(entries) { 27 entries.forEach(function(entry) { 28 if (entry.intersectionRatio > 0) { 29 entry.target.classList.add('img-animation3'); 30 } else { 31 entry.target.classList.remove('img-animation3'); 32 } 33 }); 34 }); 35 36 37 38 Array.prototype.forEach.call(image, function(img) { 39 observer.observe(img); 40 }); 41 }) 42

on('load', を追記することで解決。

投稿2020/05/02 12:12

rrgsn

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問