LoginSignup
1
2

More than 3 years have passed since last update.

文字を1文字ずつ表示する

Last updated at Posted at 2020-12-15

作成したもの

transformを使って、文字列を1文字ずつ表示させると同時に表示した文字を上下させる

追記:2020/12/17
空白文字を飛ばして表示してしまうことが分かったので、後に追記、もしくは新たにコードを追加します

用いた言語

js、jqeury

完成したコード

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./jump_text.css">
  <script src="../../jquery/jquery-3.5.1.min.js"></script>
</head>

<body>
  <div class="one_dis">
    <p class="btn" id="btn">testボタン</p>
    <p class="text" id="text">1文字ずつテキストを表示します</p>
    <div class="jump_char" id="jump_char">
      <p class="text add_text" id="add_text"></p>
    </div>
  </div>

  <script>
    $(function() {
      $('#btn').click(function() {

        //表示する文字列のタグを設定しておく
        let get_text = $('#text').text();
        //countで文字毎にクラス設定するための変数
        let count = 0;
        //文字を動かす量の変数
        let move_char = 20;
        //文字を追加する間隔の変数
        let addTime_char = 500;
        //文字が動く時間の変数 ※addTIme_charより大きくした場合正常な動きをしない可能性あり
        let moveTime_char = 1000;
        //文字を上に移動させる時間、下に移動させるタイミングの設定
        let moveUpTime_char = 100;
        let moveDownTime_char = 200;

        //メインの関数
        //のちにclearsetITmeOutを使うため変数に代入しておく
        var text_display = function() {

          //文字列を1文字ずつ追加するための用意
          let add_char_tag = $('<span class="char" id="char"></span>');
          add_char_tag.addClass('char' + count);
          $('#add_text').append(add_char_tag);

          // 文字の単体のcssを設定
          //inline-blockを指定することでtransformを有効化
          $('.char' + count).css({
            display: 'inline-block',
            opacity: 0,
            transform: 'translateY(' + move_char + 'px)',
            transition: moveTime_char + "ms"
          });
          //charAt関数を用いて1文字ずつ文字をspanタグに追加
          $('.char' + count).text(get_text.charAt(count));

          //setTimeout関数を用いて、時間差をつけ文字を上下させる
          setTimeout(moveUp($('.char' + (count - 1))), moveUpTime_char);
          setTimeout(moveDown($('.char' + (count - 2))), moveDownTime_char)


          count = count + 1;
          var setTimeout_id = setTimeout(text_display, addTime_char);
          //文字列の長さまでcountが進んだらストップ
          if (count > get_text.length) {
            clearTimeout(setTimeout_id);
          }
        }
        //発火させるアクションがないので関数を呼び出す
        text_display();

        function moveUp(charNum) {
          $(charNum).css({
            opacity: 1,
            transform: 'translateY(0px)',
            transition: moveTime_char + 'ms'
          });
        }

        function moveDown(charNum) {
          $(charNum).css({
            transform: 'translateY(' + move_char + 'px)',
            transition: moveTime_char + 'ms'
          });
        }
      });
    });
  </script>
</body>

</html>

動きが見れるものも置いておきます。

See the Pen ZEpeWJG by ぺこ太🐊 (@pecotaro1089) on CodePen.

個人的にハマった個所

setTImeout関数を複数用いた際のtransformの挙動

上に動いた文字を再び下に戻すために、setTimeout関数の中にsetTImeout関数を使い、その中でcssメソッドを使うと何故かtransformだけ上手く動かなくなった。
対策:setTimeOut関数の引数を関数として定義し、入り子ではなく別々に使う。(理由がわからない)

transformが効かなくなった

transfromはインラインブロックで動くらしく、spanタグでは動かないらしい。
対策:spanタグにdisplay: inline-blockを追加することで解決。

transformにdelayが効かない

cssだけか分からないが、delayが効かないメソッドがあるらしい。
対策:setTimeout関数を使う。

最後に

2か月前からコーディングを始めた初心者で今回の記事が初めてなので、コード自体とても拙く、見づらい部分が多々あると思います。
この記事は、自分が見直す際に使えるような目的に置いているため、丁寧すぎる部分、わかりづらい部分もあると思いますが、目をつぶってくれたら幸いです。

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2