如果我理解正确,那么为消息设置绝对底部位置,直到消息多于垂直空间将解决新消息出现在底部的第一个要求。
这需要更改 CSS 和 JavaScript:
CSS
#messagesWrapper {
position:absolute;
bottom:0;
}
JavaScript
var $messages = $('#messages');
var $messagesWrapper = $('#messagesWrapper');
var $messagePageContent = $('#messagePageContent');
function populateMessages(){
var newMessage = $('<div id="msg-'+i+'" class="aMessage">Another Message<br>Message ID: '+i+'</div>');
i++;
newMessage.hide().appendTo('#messages').stop().fadeIn(400);
if ($messages.height() >= $messagePageContent.height()){
messagesWrapper .css({position:'static'});
$messagePageContent.stop().animate({ scrollTop: $messages.outerHeight() }, 700);
}
}
如果然后调整窗口大小,也需要发生滚动,因此还需要将句柄附加到调整大小事件。
$(window).resize(function() {
$messagePageContent.stop().animate({ scrollTop: $messages.outerHeight() }, 700);
});
但是,这还不够好,因为缺少高度计算,这会将 CSS 重置position
为其默认值。这是enscroll
jQuery 插件(我怀疑任何类型的滚动)工作所必需的。
但是我们可以简单地重构并将所有代码移动到一个通用函数中,例如:
var $messages = $('#messages');
var $messagesWrapper = $('#messagesWrapper');
var $messagePageContent = $('#messagePageContent');
function populateMessages(){
var newMessage = $('<div id="msg-'+i+'" class="aMessage">Another Message<br>Message ID: '+i+'</div>');
i++;
newMessage.hide().appendTo('#messages').stop().fadeIn(400);
scrollMessages();
}
function scrollMessages() {
if ($messages.height() >= $messagePageContent.height()){
$messagesWrapper.css({position:'static'});
$messagePageContent.stop().animate({ scrollTop: $messages.outerHeight() }, 700);
}
}
$(window).resize(scrollMessages);
这是我在这个演示中使用的代码。这可能不是最好的解决方案,我正在考虑使用-webkit-transform: scaleY(-1)
来翻转容器,然后将消息翻转回来,但它弄乱了滚动(即它是向后的!)。使用 CSS 转换可能会有更好的解决方案。