2016-08-30 5 views
0

ログメッセージの表示に使用するコンテナdivがあります。それが生成されるとき、私はそれぞれのメッセージを独立した子としてdiv要素の前に追加します。 divoverlay-y:autoに設定され、メッセージ要素が親コンテナの高さを超えた後にスクロールします。私が作成しようとしている動作は、メッセージがスクロールしない/スクロールしないメッセージの「履歴」をスクロールして親の可視領域から移動する場合を除いて、メッセージが通常どおりスクロールすることです。divメッセージリストの先頭に追加されます。divを挿入しているときにスクロール位置を保持します(ユーザーがスクロールしたときのみ)

私の現在の試みは、次のようになります。

HTML:

<div id='log'> 
    <h4>Log</h4> 
    <div id='log-rows'></div> 
</div> 

JS:

log: function(text) { 
    var messageHTML = "<div><span class='timestamp'>" + (new Date()).toISOString() + "</span> - <span class='message'>" + text + "</span></div>"; 

    this.$el.find("#log-rows").prepend(messageHTML); 

    var firstLogMessage = $('#log-rows').children().first(); 

    $('#log-rows').children().each(function(index, row) { 
    row.scrollTop += firstLogMessage.height(); 
    }); 

    ... 
} 

CSS:

#log-rows { 
    max-height: 250px; 
    overflow-y: auto; 
} 
+0

どのようにユーザーは「画面をスクロールできますか? –

+0

@RacilHilan:良い点、私の言語は明確ではありませんでした。基本的には、私がスクロールしたdivを親の子供に新しい行を追加するときに動かすことは望ましくありません。 –

答えて

2

log機能を編集します。これは私のために働きます:

function log(text) { 
    var messageHTML = "<div><span class='timestamp'>" + (new Date()).toISOString() + "</span> - <span class='message'>" + text + "</span></div>"; 

    $("#log").find("#log-rows").prepend(messageHTML); 

    var scrollTop = $("#log-rows").scrollTop(); 

    if (scrollTop > 0) { 
    var childHeight = $("#log-rows div").outerHeight(true); // get's the new element's full height including margin 
    var scrollDelta = scrollTop + childHeight; 
    $("#log-rows").scrollTop(scrollDelta); 
    } 
} 
+1

'.outerHeight(true)'は '.height'よりも使用するほうが、パディング、枠線、および余白(任意にマージン)を含んでいるので注意してください。参照:http://stackoverflow.com/questions/10787782/full-height-of-a-html-element-div-including-border-padding-and-margin –

関連する問題