【发布时间】:2014-07-26 05:18:46
【问题描述】:
我有一个工作任务,我必须为 Intranet 实现一个简单的基于浏览器的聊天系统。后端已准备就绪,现在我正在尝试创建 UI 部分,但这让我很头疼,因此我的头撞在桌子上好几个小时:(
这是我的 JSFiddle:http://jsfiddle.net/2PMvM/(它使用 JQuery + JQueryUI - 1.x)
从语义上讲,HTML 看起来不错,但效果不如看起来那么好。这个想法是窗口(红色边框 div)应该包含它的所有元素。我不知道为什么列表的水平滚动条然后我的 textarea 会跳出窗口,好像有一些我没有考虑到的偏移量?
我正在尝试用最少的 JS 来做这件事,但是如果 CSS 方式太复杂,我愿意采取 JS 解决方案。
有什么问题呢?在此先感谢:)
--- 所以需要我把代码放在这里:
注意:请务必包含此 JS:https://github.com/AndrewDryga/jQuery.Textarea.Autoresize/raw/master/js/jquery.textarea.autoresize.js,因为它是必需的,因此我的 textarea 在获得更多文本时会自动调整大小。即使调整大小,窗口也应该包含文本区域。似乎 CSS 可以做到,但没有?
解决了!!感谢@Trevor: 这是更新后的代码 + Fiddle HERE。谢谢!
HTML:
<div class="window">
<div style="height: 20px;" class="wndHandle">Some username :D</div>
<div class="content" id="chatDiv" style="background:#fff;overflow: scroll;">
<ul class="ulChat">
<li class="msg in">Test message for testing 1</li>
<li class="msg out">Test message for testing 2</li>
<li class="msg out">Test message for testing 3</li>
<li class="msg in">Test message for testing 4</li>
</ul>
</div>
<div class="footer">
<textarea style="width: 100%; resize: none; overflow-x: hidden;" rows="1" cols="1"></textarea>
</div>
</div>
CSS:
.ui-resizable-handle
{
background: #f5dc58; border: 1px solid #FFF;
width: 9px; height: 9px;
z-index: 2;
}
.ui-resizable-se { right: -5px; bottom: -5px; }
.window
{
position: absolute;
display: inline-block;
width: 150px;
height: 200px;
border: 1px solid #bb0000;
}
.wndHandle {
cursor: move;
font-size: 9pt;
background: #888;
color: #fff;
padding-left: 1px;
}
Javascript:
var refresh = function() {
var objWindow = $('.window');
var objHandle = objWindow.find('.wndHandle');
var objContent = objWindow.find('.content');
var objFooter = objWindow.find('.footer');
var objResize = objWindow.find(".ui-resizable-handle.ui-resizable-se");
objResize.removeClass("ui-resizable-autohide");
objContent.height(
objWindow.innerHeight() -
objHandle.outerHeight() -
(
(objFooter.length == 0) ?
(objResize.length == 0) ? 0 : objResize.outerHeight()
: objFooter.outerHeight()
)
);
}
$('.window').draggable({ handle: '.wndHandle' }).resizable({
handles: 'se',
minWidth: 150,
minHeight: 100,
resize: function( event, ui ) {
refresh();
}
});
$('textarea').autoresize({
maxHeight: 80,
onResize: function () {
refresh();
}
});
refresh();
【问题讨论】:
-
中间 div 有
height:100%,所以总高度(包括第一个 div 的高度和 textarea 的高度)将大于 100%,因此你的问题。我认为您应该为 textarea 明确设置height,以便您可以使用calc()或绝对布局来正确适应它们。我知道您想设置 textarea 的高度,使其只能显示 1 行 (rows=1),这意味着高度取决于字体大小,也可能取决于行高,所以它是某种动态的。用动态需求解决这个问题并不容易,除非使用 Flex Box 布局。 -
嗯,那个中间的 div 有
height: 100%因为我不知道。把它放在那里似乎是正确的,因为在我看来,我希望它是可用高度的 100%,而不是总窗口高度。我明白你的意思。我见过 flexbox,但我一点也不喜欢它。我认为 JS 解决方案会起作用吗?计算 100% UL div 的高度减去窗口句柄和 textarea 大小? :/。我不知道该放什么,我只想让窗口包含它的所有元素,我不知道height: 100%是否应该在那里:( -
这里你在这个演示中看到jsfiddle.net/viphalongpro/2PMvM/26,我们使用
calc()方法来设置中间div的高度。请注意,要更改 textarea 的字体大小,您必须改为更改.window的font-size,然后减小句柄上的字体大小和.ulChat。这是满足动态需求的唯一简单方法。 -
我试过了,但这是我所能得到的。抱歉,我无法提供更多帮助。 jsfiddle.net/r3wt/2PMvM/34
-
别担心,您的解决方案以及@Trevor 帮助我找到了一个可行的解决方案。我已经更新了 OP。谢谢!
标签: javascript jquery html css jquery-ui