🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

HTML

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

CSS

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

Q&A

解決済

3回答

1877閲覧

繰り返す特定要素の表示・非表示を条件に、classの付与・削除を行いたい

yMarch

総合スコア17

JavaScript

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

jQuery

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

HTML

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

CSS

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

0グッド

1クリップ

投稿2019/12/02 08:45

特定の要素(何度もでてくる)が画面に表示されている間はclassをつけ、表示されなくなったらclassを削除するようにしたいです。

具体的には
背景が黒のときは、fixedしたタイトルを白に、
背景が白のときは、タイトルを黒にしたいです。

黒背景が表示されているときは、タイトルからclassを取り、
白背景が表示されているときに、タイトルにclassをつけようと考えました。

hteml

1<div class="container"> 2<p class="title">タイトル</p> 3 <div class="content01"> 4  <div class="bg_black"> 5   <!-- 黒背景・略 --> 6  </div> 7  <div class="bg_white"> 8   <!-- 白背景・略 --> 9  </div> 10 </div><!-- /content01 --> 11 12 <div class="content02"> 13  <div class="bg_black"> 14   <!-- 黒背景・略 --> 15  </div> 16  <div class="bg_white"> 17   <!-- 白背景・略 --> 18  </div> 19 </div><!-- /content02 --> 20</div>

css

1.container{positoin:relative; color:#fff;} 2.title {position:fixed; left:0; top:0; color:#fff;} 3.bg_black {background: #000;} 4.bg_white {background: #fff;} 5.is_black {color: #000 !important;}

下記のサイトを参考にしましたが、bg_blackとbg_whiteが1つづつしかない場合はうまくいったのですが、
複数あると、一番最後のbg_whiteが表示されたときにしか、is_blackのclassが付与されませんでした。

https://into-the-program.com/scroll-disp-elem/

javascript

1$(window).on('scroll', function (){ 2 3 var bgWhite = $('.bg_white'); 4 var isBlack = 'is_black'; 5 6 bgWhite.each(function () { 7 var elemOffset = $(this).offset().top; 8 var scrollPos = $(window).scrollTop(); 9 if(scrollPos > elemOffset){ 10 $('.title').addClass(isBlack); 11 }else { 12 $('.title').removeClass(isBlack); 13 } 14 }); 15}); 16

繰り返す要素に対してはどのように対応したら良いでしょうか?
当方、プログラム系は初心者のため、うまく伝えられなくて申し訳ありませんが
ご教示いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

別解を。
document.elementFromPoint() で指定位置の要素を取得できます。

CSS

1.title { 2 pointer-events: none; 3}

jQuery

1 var element = document.elementFromPoint(32, 10); 2 if (!element) { 3 return true; 4 } 5 6 $('.title').toggleClass(isBlack, !!$(element).closest('.bg_white').length);

https://developer.mozilla.org/ja/docs/Web/API/Document/elementFromPoint

mix-blend-mode もありますが実際に試してみるとズレが見られるなど、こちらは実装にやや難がありそうです。

CSS

1.title { 2 color: #fff; 3 mix-blend-mode: difference; 4}

https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode

投稿2019/12/03 02:34

x_x

総合スコア13749

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

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

0

自己解決

教えていただいた考え方をもとに、waypoints.jsを使って解決しました。
つたないコードでお恥ずかしいのですが、もしかしたらなにかのお役に立つかもと思いましたので
載せておきます

javascript

1 2var $black01 = $('.content01 .bg_black'); 3var title = $('.title'); 4$black01.waypoint(function(direction) { 5 if (direction === 'down') { 6 title.removeClass('is_black'); 7 } 8 }, { 9 offset: '0%' 10}); 11$black01.waypoint(function(direction) { 12 if (direction === 'up') { 13 title.removeClass('is_black'); 14 } 15}, { 16 offset: '100%' 17}); 18 19var $white01 = $('.content01 .bg_white'); 20$white01.waypoint(function(direction) { 21 if (direction === 'down') { 22 title.addClass('is_black'); 23 }else{ 24 title.removeClass('is_black'); 25 } 26}, { 27 offset: '0%' 28}); 29 30var $black02 = $('.content02 .bg_black'); 31var title = $('.title'); 32$black02 .waypoint(function(direction) { 33 if (direction === 'down') { 34 title.removeClass('is_black'); 35 }else{ 36title.addClass('is_black'); 37} 38 }, { 39 offset: '0%' 40}); 41 42var $white02 = $('.content02 .bg_white'); 43$white02.waypoint(function(direction) { 44 if (direction === 'down') { 45 title.addClass('is_black'); 46 }else{ 47 title.removeClass('is_black'); 48} 49}, { 50 offset: '0%' 51}); 52 53

投稿2019/12/02 12:57

yMarch

総合スコア17

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

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

yMarch

2019/12/02 12:59

はちゃめちゃなコードだと思うので、もしアドバイスがあったらいただけると大変助かります!
guest

0

「画面に表示されている間」ということは、提示のif文では足りません。画面に入る前、画面内、画面より下で処理を分けて、クラスを付け外しするのは「画面内」のみにする必要があります。(画面外にいる要素が付け外しをすると画面内の状況と関係の無いclassがつくことになるので)

inview js」で検索するか、ターゲットブラウザが最近のものなら Intersection Observer API を利用するのが確実だと思います。

【Intersection Observer API - Web API | MDN】
https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API

【IntersectionObserverで要素が画面内に入ってきたかを判定する】
https://sbfl.net/blog/2017/07/04/javascript-intersection-observer/

【Intersection Observer が良さそうなので試してみた - Qiita】
https://qiita.com/yamanoku/items/027308e23cfc69845d7e

投稿2019/12/02 09:24

kei344

総合スコア69596

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

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

yMarch

2019/12/02 12:52

ありがとうございます!! IE11も対象のため、「Intersection Observer API」が使えず、 また、inview.jsは、仕様が変わったようで、「要素が画面上部にきたら」という設定が出来なくなっていました。 (言葉足らずですみません。タイトルは画面上部にfixedなので、要素が画面上部にきたらclassをつける仕様にしたかったです。) ただ、kei344様のおかげで、考え方がいろいろとスッキリしました!!! ありがとうございます! waypoint.jsを使って無理やり頑張ってみました! もっとスマートな書き方があると思うのですが、いかんせん初心者で・・・お恥ずかしい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問