【问题标题】:JQueryUI window not covering all content elementsJQueryUI 窗口未覆盖所有内容元素
【发布时间】: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 的字体大小,您必须改为更改 .windowfont-size,然后减小句柄上的字体大小和 .ulChat。这是满足动态需求的唯一简单方法。
  • 我试过了,但这是我所能得到的。抱歉,我无法提供更多帮助。 jsfiddle.net/r3wt/2PMvM/34
  • 别担心,您的解决方案以及@Trevor 帮助我找到了一个可行的解决方案。我已经更新了 OP。谢谢!

标签: javascript jquery html css jquery-ui


【解决方案1】:

这里有一个使用jQuery调整高度的解决方案

HTML - 添加 ID

...
<div id="chatDiv" style="background:#fff;overflow: scroll;">
...

jQuery

$('.window').draggable({ handle: '.wndHandle' }).resizable({
    handles: 'se',
    minWidth: 150,
    minHeight: 100,
    resize: function( event, ui ) {
        $('#chatDiv').height($('.window').height()-38);          
    }
});
$('#chatDiv').height($('.window').height()-38);
$('textarea').autoresize();

Fiddle

【讨论】:

  • 非常感谢@Trevor! :D 你的解决方案实际上帮助我弄清楚了如何计算我需要的东西,我什至将它转换为我的系统的简单插件:) 今天晚些时候或明天,我将使用带有工作代码的 JSFiddle 更新 OP,也整合 textarea 调整大小。效果很好!
猜你喜欢
  • 2013-12-13
  • 1970-01-01
  • 2011-12-22
  • 2020-10-26
  • 1970-01-01
  • 2012-08-07
  • 2011-11-30
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多