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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

HTML

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

Q&A

解決済

1回答

1125閲覧

スクロールにより、要素を表示させたときの処理

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2018/02/18 16:43

編集2018/02/18 18:06

前提・実現したいこと

スクロール時に、複数ある特定クラス(クラス名 : slide__hidden)の親要素に新しい要素を追加し、
その後、その特定要素のクラスを削除するようにしたいと考えています。
該当ソースだと、スクロール時に現れる1つ目の親要素に追加され、
2つ目の要素のクラスが削除されてしまいます。ご教授願えないでしょうか。

該当のソースコード html

<section class="container__section01"> <div class="inner"> <h3 class="slide__txt"> <span class="slide__hidden">hidden</span> </h3> </div> </section> <section class="container__section02"> <div class="inner"> <h3 class="slide__txt"> <span class="slide__hidden">hidden</span> </h3> </div> </section>

該当のソースコード Javascript

function slide__txt() { var sl__h = document.querySelectorAll('.slide__hidden'); for (var i = 0; i < sl__h.length; i++) { var rect = sl__h[i].getBoundingClientRect(), sl__b = sl__h[i].parentNode, scroll__b = document.documentElement || document.body.parentNode || document.body; if(rect.bottom < scroll__b.clientHeight) { if(!trigger) { trigger = true, sl__b.innerHTML += '<div class="slide__move"></div>', setTimeout(function() { sl__h[i].classList.remove('slide__hidden'); }, 300) } } } } window.onscroll = function() { slide__txt(); }

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

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

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

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

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

kei344

2018/02/18 16:46

HTMLも質問文に追記してください。
退会済みユーザー

退会済みユーザー

2018/02/18 18:07

追記させていただきました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

  1. 変数triggerがグローバル変数になっているので1回trueになったらそれ以降の要素はすべてtrue
  2. for (var i = 0; i < sl__h.length; i++)iは関数slide__txtのスコープになるのでsetTimeoutに渡した関数内では常にi===sl__h.lengthになるはず
  3. sl__b.innerHTML+=とすることで要素が書き換わり、sl__h[i]のクラスを書き換えても表示に反映されない

スコープの問題は for (let i = 0; i < sl__h.length; i++)とすれば解消するとおもいます。
要素を書き換えないようにするにはinsertAdjacentHTMLを使えば解決できるでしょう。
triggerについてはDATA属性でも使ってください。(下記コードには実装していません)

JavaScript

1function slide__txt() { 2 let sl__h = document.querySelectorAll('.slide__hidden'); 3 for (let i = 0; i < sl__h.length; i++) { 4 let rect = sl__h[i].getBoundingClientRect(), 5 sl__n = sl__h[i], 6 sl__b = sl__h[i].parentNode, 7 scroll__b = document.documentElement || document.body.parentNode || document.body; 8 if(rect.bottom < scroll__b.clientHeight) { 9 //if(!trigger) { 10 //trigger = true, 11 //sl__b.innerHTML += '<div class="slide__move"></div>', 12 sl__b.insertAdjacentHTML( 'beforeend', '<div class="slide__move"></div>' ); 13 setTimeout(function() { 14 sl__n.classList.remove('slide__hidden'); 15 }, 300) 16 //} 17 } 18 } 19} 20window.onscroll = slide__txt; 21```**動くサンプル:**[https://jsfiddle.net/h1s6ew2t/1/](https://jsfiddle.net/h1s6ew2t/1/) 22 23--- 24 25【innerHTMLの代わりにinsertAdjacentHTML()を使ってみようか。(DOMおれおれAdvent Calendar 2015 01日目) | Ginpen.com】 26[http://ginpen.com/2015/12/01/insertadjacenthtml-instead-of-innerhtml/](http://ginpen.com/2015/12/01/insertadjacenthtml-instead-of-innerhtml/) 27 28【いまさら聞けない、HTML5カスタムデータ属性の基本と使いどころ - WPJ29[https://www.webprofessional.jp/how-why-use-html5-custom-data-attributes/](https://www.webprofessional.jp/how-why-use-html5-custom-data-attributes/)

投稿2018/02/18 18:54

kei344

総合スコア69398

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

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

退会済みユーザー

退会済みユーザー

2018/02/19 02:14

回答いただき、ありがとうございます。 無事解決することができました。 サンプルまでご用意いただき、本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2018/02/19 07:47

解決後に失礼いたします。 insertAdjacentHTMLによる追加を1度だけにしたいと考えているのですが、何か方法はありませんでしょうか。
kei344

2018/02/19 08:01

slide__moveが有るか無いかを確認すればよいのでは?
退会済みユーザー

退会済みユーザー

2018/02/20 01:41

解決することができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問