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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

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

HTML

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

Q&A

解決済

1回答

287閲覧

テキストアニメーション複数対応

teta

総合スコア16

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

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

HTML

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

0グッド

0クリップ

投稿2018/08/15 17:32

編集2018/08/16 02:09

前回の質問で<br>はspanで囲わないというのは解決できたのですが
同じクラスが複数有る場合だとeachはcontentsで使っているためすべてのtext_animateクラスから探してきて
とってくるため複数のクラスの配列が処理一つのクラスに同時に出力されるためうまく動きません
プラグイン化、もしくはdate属性を使えばこの問題は解決するかもしれませんが何か良い
解決はないでしょうか?

html

1<p class="text_animate">te<br>st</p> 2<p class="text_animate">te<br>st</p> 3<p class="text_animate">te<br>st</p> 4<p class="text_animate">te<br>st</p> 5<p class="text_animate">te<br>st</p>

scss

1.text_animate{ 2 span{ 3 transition: 1s; 4 opacity: 0; 5 &.text_animate_on{ 6 transition: 1s; 7 opacity: 1; 8 9 } 10 } 11 &.text_animate_rotate span{ 12 transform: rotate(-45deg); 13 display: inline-block; 14 &.text_animate_rotate_on{ 15 transform: rotate(0deg); 16 } 17 } 18 &.text_animate_size span{ 19 font-size: 22px; 20 &.text_animate_size_on{ 21 font-size: 10px; 22 } 23 } 24}

javascript

1$(function () { 2 // 子ノード3つそれぞれに対して処理 3 $(".text_animate").contents().each(function (_, node) { 4 // 子ノードを一旦DOMツリーから除去 5 // 変数`node`はjQueryオブジェクトではないので`node.remove();`とは書けません。 6 node.parentNode.removeChild(node); 7 8 // ノードの種類によって条件分岐 9 switch (node.nodeType) { 10 // テキストノードなら質問文にある処理を適用 11 case Node.TEXT_NODE: 12 // テキストノードの文字列を取得 13 var text_split = node.textContent.split(""); 14 15 function animate() { 16 text_split.forEach(function (val) { 17 $(".text_animate").append("<span>" + val + "</span>"); 18 }); 19 } 20 animate(); 21 break; 22 // テキストノード以外(HTML要素)ならappendし直す 23 default: 24 $(".text_animate").append(node); 25 } 26 }); 27 28 // 以下、変更点なし 29 $(window).load(function () { 30 $(".text_animate span").each(function (index) { 31 $(this).css({ 32 transitionDelay: index * 0.6 + "s" 33 }).addClass("text_animate_on"); 34 }); 35 }); 36});

追記:こちらの方法で行けるみたいですが
できるみたいですが処理の内容がいまいちわかりません

javascript

1$(".text_animate").children().andSelf().contents().each(function () { 2 if (this.nodeType == 3) { 3 $(this).replaceWith($(this).text().replace(/(\S)/g, '<span>$1</span>')); 4 } 5 });

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

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

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

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

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

guest

回答1

0

ベストアンサー

元のコードを直す方法

「複数のクラスの配列が処理一つのクラスに同時に出力される」原因は、以下の部分です。

javascript

1$(".text_animate").append("<span>" + val + "</span>"); 2$(".text_animate").append(node);

APIドキュメントによれば、.append()メソッドは、マッチするすべての要素に対して要素を追加するようになっているので、.each()のループによって複数回.append()が適用されたという寸法です。
$(".text_animate").append()のようにセレクタではなく$(parentNode).append()のようにすれば要素を追加する対象は常に1つなので複数回適用される問題は解決されます。

javascript

1$(".text_animate").contents().each(function (_, node) { 2 var parentNode = node.parentNode; 3 parentNode.removeChild(node); 4 switch (node.nodeType) { 5 case Node.TEXT_NODE: 6 var text_split = node.textContent.split(""); 7 8 function animate() { 9 text_split.forEach(function (val) { 10 $(parentNode).append("<span>" + val + "</span>"); 11 }); 12 } 13 animate(); 14 break; 15 default: 16 $(parentNode).append(node); 17 } 18});
追記のコードについて解説

書いてあるコードを日本語に翻訳すると、セレクタ.text_animateにマッチする要素とその要素の子ノードそれぞれについて、ノードがテキストノードなら、ノードに含まれる文字列の空白文字でない文字すべてを<span>要素で囲ったものに置き換えるといった処理になります。

読み解くのに必要な前提知識は下記があると思います。

  • jQueryオブジェクトが持つメソッド.children().andSelf().contents()はすべてjQueryオブジェクトを返すメソッドです。.children().andSelf().contents()のように続けて書くことをメソッドチェーンと呼びます。
  • 3という謎の数値は定数Node.TEXT_NODEのことです。参考: MDNドキュメント
  • 文字列が持つメソッド.replace()の引数に与えられている/(\S)/g正規表現と呼ばれるものです。置き換え後の文字列に含まれる$1は正規表現にマッチした文字に置き換えられます。参考: MDNドキュメント

投稿2018/08/16 09:04

reosablo

総合スコア339

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

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

teta

2018/08/17 00:26

回答ありがとうございます。 質問なのですが parentNodeとすると親要素のノードここでは要素毎の.text_animateを返すので個別に処理できるということなのでしょうか? 後、追記の質問の仕方が悪かったです。 .children().andSelf().contents( この下りなのですがcontestsのみで書かずに.children().andSelf().contents()と書いているのはandSelfで要素ごとに処理し、尚かつ小要素にも適用させるためでしょうか? .children().andSelf()と書けばこのままでいいがそれだとノードが取得できないのでcontentsを書いているということなのでしょうか? 質問多くてすみません
reosablo

2018/08/17 14:56

1つ目の質問について、その理解で合っていると思います。 ループで走査しているノードは変数`node`に代入されているので、`node.parentNode`でノード毎の親ノードを得られます。 2つ目の質問についても、その通りです。 今回の例であれば`.children().andSelf().contents()`と書かなくても`.contents()`だけで十分です。 `.children().andSelf()`が必要となるのは例えば`<p class="text_animate">t<a href="#">e<br>st</a></p>`のような場合です。 ただし、`.children()`は子要素(要素直下の要素)なので、子孫要素すべてに対応させるために`.find("*")`がよいかもしれません。
teta

2018/08/19 13:33

分かりました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問