2016-04-23 4 views
2

私は要素内のテキストを動的にアニメーション化しようとしていますが、これを行う方法を見つけることができません。これまでに試したことがありますが、それは最良の方法ではありません。スパンで文字を区切らずにテキストをアニメーション化する方法は?

私はsplitのようないくつかの方法を試してみましたが、それは配列の中にテキストを入れて、スパンで文字を押しますが、うまくいきません。

var i = -1, 
 
    spn = document.querySelectorAll('.spn'), 
 
    stInt; 
 

 

 
var setTO = setTimeout(function AnimTxt() { 
 
    stInt = setInterval(function() { 
 
    if (i <= spn.length) { 
 
     i += 1; 
 
     $('.spn').eq(i).css({ 
 
     color: "red", 
 
     marginTop: "-10px" 
 
     }); 
 

 
     return false; 
 
    } 
 
    }, 100); 
 
}, 2000);
.spn { 
 
    position: absolute; 
 
    transition: all 1s ease; 
 
    top: 8px; 
 
    left: 5px; 
 
    text-transform: uppercase; 
 
    letter-spacing: 0px; 
 
    margin-top: 40px; 
 
} 
 

 
.spn:nth-of-type(2) { 
 
    left: 16px 
 
} 
 

 
.spn:nth-of-type(3) { 
 
    left: 27px 
 
} 
 

 
.spn:nth-of-type(4) { 
 
    left: 42px 
 
} 
 

 
p { 
 
    margin-top: 30px; 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
 
<span class="placeholder-cont"> 
 
    <span class="spn">t</span> 
 
    <span class="spn">e</span> 
 
    <span class="spn">x</span> 
 
    <span class="spn">t</span> 
 
</span>

+1

だから、あなたが望む '<スパンクラス= "SPN">名前'して、手紙には、JavaScriptによって異なる 'span'タグに分けますか? – Bhumika107

+0

これは良いことであり、新しい要素を分けることなく、応答のおかげでより良いでしょう。 –

答えて

2

私は今のspanタグに文字を分離してみました。これについては、とすれば、新しい要素を分けることなく改善することができます。 - これを達成するための方法は、文字をspanに分けることができません。

for (i = 0; i < text.length; i++) { 
    $(".placeholder-cont").append("<span class='spn'>" + text[i] + "</span>"); 
} 

そしてこのfiddleを参照してください代わりにsetInterval

$(".spn").each(function(index, el) { 
    setTimeout(function() { 
    $(el).css({ 
     color: "red", 
     marginTop: "-10px" 
    }); 
    if (index == (text.length - 1)) { 
     setTimeout(function() { 
     $('p').show(); 
     }, 1000); 
    } 
    }, 100 * index); 
}); 

.each()setTimeout()を使用してそれらをアニメーション化。

EDIT

position: absoluteを除去するために、私は、タグにまたがるために追加した - そして

display: inline-block; 

とは、プロパティを '変換' を使用してアニメーション。ここで

Updated fiddle.

+0

偉大な仕事、それは私が何をしたから良いですが、私の問題は、それは左上に詰まったスパンに新しい文字を追加したので、絶対位置を設定せずにスパン内の任意の文字をアニメーションする方法を見つけたい場合は、助けて。 –

+0

@ El.oz私は 'display:inline-block'を追加し、' span'要素に 'position:absolute'を取り除いたので、' margin-top'はうまくいきません。代わりに 'transform' CSSプロパティを使用してアニメーション化しています。参考にしてください - https://jsfiddle.net/Bhumika107/rk3mzae8/1/ – Bhumika107

+0

おい!あなたは素晴らしいです!これはまさに私が欲しいものです、あなたのおかげでおかげさまです。 –

1

別のアプローチです。 split()を使用して文字から配列を作成し、map()およびreplace()を使用して、各文字をspanにラップし、次にjoin()を文字列に戻すことができます。

$('.text').html($('.text').text().split('').map(function(e) { 
 
    return e.replace(/[^ ]/g, "<span class='letter'>$&</span>"); 
 
}).join('')); 
 

 

 
$('.text .letter').each(function(i) { 
 
    setTimeout(() => { 
 
    $(this).css({ 
 
     'transform': 'translateY(-50px)', 
 
     'color': 'red' 
 
    }); 
 
    }, 100 * i); 
 
})
.text { 
 
    font-size: 25px; 
 
    text-transform: uppercase; 
 
} 
 
.letter { 
 
    margin-top: 50px; 
 
    transition: all 0.3s ease-in-out; 
 
    display: inline-block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="text">Lorem ipsum dolor.</div>

+0

ありがとう。 'map'関数の最初の引数には、白い空白を整えることがいくつか質問されています。 2番目の引数で '$&'は何をしますか?ありがとう。 –

+1

mapに 'e'引数を指定した場合、配列の各要素はマップを適用するか、この場合はそれぞれの文字になります。次に、適用する各文字に関数https://developer.mozilla.org/を置き換えますen-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace。置換では最初の引数は空白以外のすべてにマッチする正規表現で、2番目の引数は置き換えられるものなので、この場合はspanの各要素 '$&'をラップします。 –

関連する問題