jQuery-ui 的 resize 功能无法与 chrome 中的 flexbox 模型正确交互,但在 FF 和 IE 中成功

Posted

技术标签:

【中文标题】jQuery-ui 的 resize 功能无法与 chrome 中的 flexbox 模型正确交互,但在 FF 和 IE 中成功【英文标题】:jQuery-ui's resize functionality fails to interact properly with the flexbox model in chrome but succeeds in FF and IE 【发布时间】:2015-09-17 08:10:08 【问题描述】:

我制作了一个 div,它分为两列,中间有一个处理程序。用户可以向右或向左拖动此处理程序,列宽会相应调整(一列会变宽,另一列会变小,总宽度保持不变)。

可以在以下 jsfiddle 示例中找到我如何尝试完成此操作:minimal working/failing example。如果您使用 FF 或 IE 的最新版本之一对此进行测试,您将看到它按预期工作。然而,在 Chrome 中,处理程序变得不可见。

我认为这可能与 flexbox 模型和 jquery-ui 的调整大小功能的工作方式(使用 css 定位技巧)之间的交互有关。为了克服这个问题,我发现了一些技巧(将位置设置为相对位置并将左侧位置设置为 0)。我认为 Chrome 对这些 hack 的反应与 FF/IE 不同。

谁能向我解释发生了什么或提示我解决这个问题的正确方向?

ps:This question 是我获得 hack 想法的地方

HTML:

<div id="container">
    <div id ="left">left</div>
    <div id ="resizable">
        <div id="handler" class="ui-resizable-handle ui-resizable-w"></div>
        <div id="right">right</div>
    </div>
</div>

JavaScript:

$("#resizable").resizable(handles: 'w' : '#handler');

css:

#container
    background-color: black; /* we are not supposed to see any black but we do in Chrome indicating that the handler of the resizable box is not visible(in IE and FF everything works as intended) */
    display: flex;
    flex-direction: row;  
    height: 100px;


#resizable
    display: flex; /* a flex box itself so the right panel can take all space not taken by the handler */
    flex-direction: row;
    width: 50%;

    /* hack to ignore the absolute positioning done by jquery ui */
    left:0 !important;
    position:relative !important;
    /* removing this completely destroys the functionality in IE and FF */


#left
    border-right: 1px solid yellow;
    background-color: darkred;
    flex : 1;
    text-align: center;


#right
    border-left: 1px solid yellow;
    background-color: steelblue;
    flex : 1;
    text-align: center;


#handler
    background-color: green;
    width:5px;

    /* hack to ignore the absolute positioning done by jquery ui */    
    position:relative!important;
    left:0px!important;
    /* removing these makes the handler visible in chrome but makes it not pixel perfectly positioned in FF and IE as can be derived from the yellow borders being invisible */

【问题讨论】:

您的 JS Fiddle 用于最小工作示例现在显然可以在最新的 Chrome 中使用。 【参考方案1】:

检查这个UPDATED Fiddle

我只是稍微改了一下

#container
    ...
    position:relative;


#handler
    ...
    position:absolute!important;

【讨论】:

【参考方案2】:

其实你的问题很简单。这就是继承。

您可以将resizable 设置为:

height: inherit;

它有效。或者,您也可以将其设置为“100%”。

为什么会这样?我不确定;我的猜测是这与 flexbox 规范有关。我有点老派,我根本不喜欢 flexbox(尽管它很快就会成为标准,如果它还没有的话)。它的规格有点棘手。例如,它在 chrome 上的工作方式是 height 采用明确指定的父容器的百分比。

现在您在“容器”和“处理程序”上指定高度,但由于“处理程序”(“可调整大小”)的父级没有指定高度,它可能使用 100% 的默认 chrome 高度值这是“自动”。

这是我的猜测。至于为什么它不可见,您可以确定这是 chrome 上的 flexbox 设置中的高度/定位问题。

我在 chrome 和 firefox 上尝试过,似乎没问题 - 这是fiddle。

【讨论】:

以上是关于jQuery-ui 的 resize 功能无法与 chrome 中的 flexbox 模型正确交互,但在 FF 和 IE 中成功的主要内容,如果未能解决你的问题,请参考以下文章

初始化和打开 Jquery-ui 对话框

jquery-ui-1.8.4.custom与一般的jquery-ui有啥区别,后面加了custom有啥作用?

如何将 jquery-ui 与 nodejs 一起使用?

如果选项卡未处于活动状态,jqgrid 无法在 jquery-ui 选项卡下正确加载

从 Jquery-ui 自动完成到 typeahead.js

动态创建jquery-ui可拖动句柄