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

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

ただいまの
回答率

90.51%

  • JavaScript

    20399questions

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

  • HTML

    11487questions

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

  • jQuery

    8154questions

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

【質問】webサイトにタイプライタのような効果を加えたい【大募集】

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 468

Usagino

score 4

 バラバラにならないようにするにはどうしたらいいのか

こんにちわ、普段は学生をしているusaginonikuです。

趣味でサイトを作っている時に大きな壁にぶち当たりました。

指定の高さに来たら文字をタイプライタのように表示させたいのですが

イメージ説明

なぜかこうなってしまいます!

どなたか...スクロールしてもバラバラにならないようにするにはどうしたらいいのか教えてください。。。

よろしくお願いします

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>test</title>
  </head>
  <body>
    <header>
      <div class="headerbox">
        header
      </div>
    </header>

    <main>
      <div class="mainbox">
        <p class="split">テストテストテストテストテストテストテストテストテストテストテストテストテスト</p>
      </div>
    </main>
    <footer>
      <div class="footerbox">
      </div>
    </footer>
    <style media="screen">
      header{
        display: block;
        height: 1000px;
      }
      .split{
        font-size: 30px;
      }
      footer{
        display: block;
        height: 1000px;
      }
    </style>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
    <script src="script.js"></script>
  </body>
</html>
jQuery(function($) {
// ---------------------------------------------------------------------------

    function fadein_type(setElm,delaySpeed,object_pass){
      var setElm = $(setElm),
        fadeSpeed = 0;

      var textlength = delaySpeed * $(setElm).text().length;

      setElm.css({
        visibility: 'visible'
      }).children().addBack().contents().each(function() {
        var elmThis = $(this);
        if (this.nodeType == 3) {
          var $this = $(this);
          $this.replaceWith($this.text().replace(/(\S)/g, '<span class="textSplitLoad">$&</span>'));
        }
      });

      $(window).scroll(function(){
         var obj_t_pos = $(object_pass).offset().top;
         var scr_count = $(document).scrollTop() + (window.innerHeight/2); // ディスプレイの半分の高さを追加
         var count = 0

         if(scr_count > obj_t_pos){

             splitLength = $('.textSplitLoad').length;
             setElm.find('.textSplitLoad').each(function(i) {
               splitThis = $(this);
               splitTxt = splitThis.text();
               splitThis.delay(i * (delaySpeed))
                 .css({
                   display: 'inline-block',
                   opacity: '0'
                 })
                 .animate({
                   opacity: '1'
                 }, fadeSpeed);
             });
             setTimeout(function() {
               setElm.html(setText);
             }, splitLength * delaySpeed + fadeSpeed);


         }
      })
    }

    fadein_type('.split',40,'.mainbox');

    // ---------------------------------------------------------------------------
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/03/15 15:48

    タイトルは要件のみを書かれたほうが良いです(急募・急ぎです・困っています などはあまり推奨されません)

    キャンセル

  • miyabi-sun

    2018/03/16 10:48

    Qiitaからteratailにやってきたんですね。teratailのスレッドは質問に決まりきってるので、5chみたいな装飾タグは不要ですよ

    キャンセル

回答 3

checkベストアンサー

+2

webサイトにタイプライタのような効果を加えたい

タイプライターのようなに関してですが、
スクロールのたびに文字が消えて表示されるせんせいみたいなお絵かきボードを想像しているのですか?
そうではなくて、純白の紙に1文字ずつ入力されていく様を想定しているはずです。

じゃあ、スクロールの度に消えてしまっては困りますよね?
1度だけ実行に変えましょう。
これだけである程度目標に近づけそうだと思いますので、まずはこの対応を入れてみてください。

jQuery(function($) {
  var enabledTypewriter = false;
  // 他の宣言

  $(window).scroll(function(){
    if (enabledTypewriter) return;
    enabledTypewriter = true;
    // 他の処理
  })
});

まぁ、1箇所だけタイプライター風表示を行っても統一感がなく微妙だと思います。
複数箇所対応にする場合は要素やフラグも配列毎に持たせるとか工夫が必要になるかと思いますので、
あれこれ試行錯誤しながら頑張ってみてください。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

おそらく、スクロールがちょっとでも発生する度に、
タイプの関数が実行されたから、タイプの途中から、新たに次のタイプが実行されごっちゃになったのだと思います。
下記でいかがでしょうか。

jQuery(function($) {
// ---------------------------------------------------------------------------

// スクロールの処理回数、タイミングを制御するための変数
var typeFlg = true,
  scrollTimer = null;


$(window).scroll(function(){
  // スクロール処理が二重発生しないよう、タイマーをクリア
  if(scrollTimer) {
    clearTimeout(scrollTimer);
  }
  // タイマーをセット(10ミリ秒ごとに関数を実行とする)
  scrollTimer = setTimeout(function(){
    if (typeFlg) {
      // タイプを実行していい状態なら、実行
      fadein_type('.split', 40, '.mainbox');
    }
  }, 10);
});
// 初期スクロールのための、初期実行
fadein_type('.split', 40, '.mainbox');

function fadein_type(setElm, delaySpeed, object_pass){
  var setElm = $(setElm),
    fadeSpeed = 0;

  var textlength = delaySpeed * $(setElm).text().length;

  setElm.css({
    visibility: 'visible'
  }).children().addBack().contents().each(function() {
    var elmThis = $(this);
    if (this.nodeType == 3) {
      var $this = $(this);
      $this.replaceWith($this.text().replace(/(\S)/g, '<span class="textSplitLoad">$&</span>'));
    }
  });


    var obj_t_pos = $(object_pass).offset().top;
    var scr_count = $(document).scrollTop() + (window.innerHeight/2); // ディスプレイの半分の高さを追加
    var count = 0

    if(scr_count > obj_t_pos){
      // スクロール条件が整って入れば、一度、タイプの実行をさせないようにする
      typeFlg = false;
      splitLength = $('.textSplitLoad').length;
      setElm.find('.textSplitLoad').each(function(i) {
      splitThis = $(this);
      splitTxt = splitThis.text();
      splitThis.delay(i * (delaySpeed))
        .css({
          display: 'inline-block',
          opacity: '0'
        })
        .animate({
          opacity: '1'
        }, fadeSpeed);
      });

      setTimeout(function() {
        //setElm.html(setText);
        // 終了したら、タイプの実行を許可にする
        typeFlg = true;
      }, splitLength * delaySpeed + fadeSpeed);


    }

}
    // ---------------------------------------------------------------------------
});

スクロールの関数を外に出し、
スクロールの処理を、タイマーに入れる、
タイプを実行していいかのフラグを設け、
一回のタイプが実行完了するまで、次のタイプを実行させない、
としました。
こちらでは、動作確認できております。

また、setText変数がどこにも定義されていないようだったので、
コメントアウトしています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 11:09

    手段は別意見だったので別回答をぶら下げたのですが、
    原因の箇所は納得しましたので参考にさせていただきました。

    キャンセル

  • 2018/03/16 11:11

    miyabi-sunさん>
    わざわざありがとうございます!
    私も、回答拝見いたしまして、
    そういや、そうだよな一回だけ実行にすべきだよな、と納得しました 笑

    キャンセル

0

スクロールのたびに先頭から書き換えればいいのでしょうか?

$(function(){
  var vals=$('.mainbox .split').text().split("");
  var timerId;
  $(window).scroll(function(){
    $('.mainbox .split').text("");
    clearInterval(timerId);
    var count=0;
    timerId=setInterval(function(){
      $('.mainbox .split').text($('.mainbox .split').text()+vals[count]);
      count++;
      if(vals.length<=count) clearInterval(timerId);
    },100);
  });
});

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • JavaScript

    20399questions

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

  • HTML

    11487questions

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

  • jQuery

    8154questions

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