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

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

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

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

Q&A

解決済

2回答

2934閲覧

表示領域に入ったらクラスを付けて、表示領域から外れると、クラスを外す

jyoze

総合スコア48

JavaScript

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

0グッド

0クリップ

投稿2020/05/31 07:08

タイトルのとおりなのですが、
表示領域に入ったらクラスを付与し、画面から外れると、クラスも外れる仕組みを作りたいのですが、
いろいろ調べて下記の用に記述したろころ、表示領域よりも上にスクロールした時は、クラスが外せました。
ただ、下にスクロールした時は外れてません。

JavaScript

1 2 $(window).scroll(function (){ 3 $(".js-ani").each(function(){ 4 var articlePos = $(this).offset().top; 5 var scroll = $(window).scrollTop(); 6 var windowHeight = $(window).height(); 7 var endPos = articlePos + $(window).outerHeight(); 8 if (scroll > articlePos - windowHeight + windowHeight/5 && scroll < endPos){ 9 $(this).addClass("js-ani-on"); 10 } else { 11 $(this).removeClass("js-ani-on"); 12 } 13 }); 14 }); 15

下にスクロールした時に外す仕組みを「endPos」で定義してみたのですが、ここの式がおかしいようです。
ご教示いただければ幸いです。
いろいろな要素にクラスを付与できればと考えています。

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

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

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

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

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

guest

回答2

0

jQuery

1 //var endPos = articlePos + $(window).outerHeight(); 2 var endPos = articlePos + $(this).outerHeight();

以前同様の質問に回答しました。
https://teratail.com/questions/229131

今回は対象の片方が viewport なので Intersection Observer を使うとわかりやすいかと思います。
https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API

jQuery

1 let observer = new IntersectionObserver(changes => { 2 for (let change of changes) { 3 $(change.target).toggleClass('js-ani-on', change.isIntersecting); 4 } 5 }, { 6 rootMargin: '0px 0px -20% 0px', 7 delay: 100 // Inersection Obeserver v2 8 }); 9 $('.js-ani').each((_index, element) => observer.observe(element));

Inersection Obeserver v2 に delay オプションがあり、Chrome で実装済みです。
https://w3c.github.io/IntersectionObserver/v2/#dom-intersectionobserverinit-delay

投稿2020/06/01 04:42

x_x

総合スコア13749

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

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

jyoze

2020/06/01 06:31

ご教示くださりありがとうございます。 勉強不足で申し訳ありません。こちらの記述だけで動くのですね。 まだ試しておりませんが、びっくりです。 Intersection Observerの理解を深め、対応してみたいと思います。 Intersection ObserverはIE11には対応していないようですね。 ここが対応していたら完璧でした^^;
guest

0

ベストアンサー

詳しい仕様がわかりませんが、以下の理解で実装したデモをおいておきます。

  1. .js-aniクラスをもつ要素は、要素が画面内に表示されているとき、.js-ani-onクラスが追加される
  2. 1.に該当しない場合、.js-ani-onクラスが削除される
  3. PCのみ動作対応
  4. windowのリサイズ対応やら、細かい条件はなし

デモ

引数のoptions.offsetについて

「要素のすべてが画面内に表示されているとき」という部分があいまいだったので、関数の引数で変えられるようにしておきました。画面の上の方の「fork」とある部分をクリックするとデモをコピーして適当にいじれます。

offsetを固定値でなくて、もっと要素ごとに変化させたい場合は、以下のデモを参考にしてください。

デモ2


ここまで言っておいてなんですが、下記の選択肢も検討の価値があると思います。

対応ブラウザによっては、Intersection Observer APIの使用も検討できます。画面(viewport)と要素の位置関係に関するAPIです。

もしくは、scrollに関すること(スマホ対応とかwindowがリサイズしたときに要素の座標が動いた時の判定とか)を色々やってくれるScrollMagicというライブラリもあります。「Made with ScrollMagic」という部分に実際の事例が載っているのと、こちらに公式のサンプルがあります。日本語情報も多いです。ただ、目的によっては、手段がおおげさかもしれません。

投稿2020/05/31 12:31

NozomuIkuta

総合スコア1260

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

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

jyoze

2020/06/01 06:23

大変わかりやすくご教示くださりありがとうございます。 ソースのコメントのおかげて、とてもわかり易く理解できました。 ScrollMagicは利用したことがあるのですが、おっしゃる通り、少しおおげさに感じましたので、今回は少ないJSの記述とCSSで対応できればと考えておりました。 Intersection Observer APIについても初めて聞きましたので、是非勉強してみたいと思います! 本当にありがとうございます。
NozomuIkuta

2020/06/01 07:43

解決したようでよかったです。 x_xさんの回答のコメントを見るとIntersectionObserver APIはブラウザの対応で今回は使えないようですが、polyfillも用意されているようなので、調べてみるといいかもしれません。 https://github.com/w3c/IntersectionObserver 詳しい使い方やpolyfillそのものの意味などは適当に調べてください。 「api名 polyfill」などで調べると出てきると思います。
jyoze

2020/06/02 02:35

ご親切にありがとうございます。 私も昨日からIntersectionObserverについて、調べておりまして、 Polyfillで非対応のブラウザにも対応できることを知りました。 下記を記述することで、対応できると記載があるのですが、 <script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver"></script> IE11で確認したところ、動きませんでした。 もう少し調べてみます!いろいろとありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問