ChatGPT解决这个技术问题 Extra ChatGPT

展开一个 div 以填充剩余的宽度

我想要一个两列的 div 布局,每个布局都可以有可变的宽度,例如

div {浮动:左; } .second { 背景:#ccc; }

视图

我希望 'view' div 在 'tree' div 填满所需空间后扩展到可用的整个宽度。

目前,我的“视图”div 的大小已调整为它包含的内容如果两个 div 占据整个高度也会很好。

不重复免责声明:

设置 float:left 时,将 div 扩展到最大宽度,因为左边的宽度固定。

帮助 div - 使 div 适合剩余宽度,因为我需要两列都向左对齐

要么我不明白这个问题,要么我不明白你如何选择接受的答案,因为宽度和高度都是固定的,overflow hidden不便

b
biberman

解决这个问题其实很简单,但一点也不明显。您必须触发称为“块格式化上下文”(BFC)的东西,它以特定方式与浮点数交互。

只需取第二个 div,删除浮动,然后给它 overflow:hidden。除可见之外的任何溢出值都会使其设置的块成为 BFC。 BFC 不允许后代浮点数逃脱它们,也不允许兄弟/祖先浮点数侵入它们。这里的最终效果是浮动的 div 会做它的事情,然后第二个 div 将是一个普通的块,占据所有可用的宽度除了被浮动占用的宽度

这应该适用于所有当前的浏览器,尽管您可能必须在 IE6 和 7 中触发 hasLayout。我不记得了。

演示:

固定左:http://jsfiddle.net/A8zLY/5/

修复正确:http://jsfiddle.net/A8zLY/2/

div {浮动:左; } .second { 背景:#ccc;浮动:无;溢出:隐藏; }

视图


优秀的答案!但是当您说“除 auto 之外的任何溢出值”将使其成为 BFC 时,您就错了。您的意思是除默认值(可见)之外的任何溢出值都会使其成为 BFC。事实上,overflow auto 也可以完美运行——这就是我所推荐的(以防万一您确实有可能从该 div 中窥视的相对定位的元素)。
这篇文章有一个很好的解释:colinaarts.com/articles/the-magic-of-overflow-hidden
如果内容大到足以溢出 div 怎么办?
重要的是要注意,孩子的顺序很重要。具有固定宽度的浮动元素必须高于另一个元素。我花了太长时间才弄清楚,为什么它对我来说没有用切换顺序。
我写了一个答案,解释了为什么所有事物的不可见溢出都会触发 BFC,基于 David 和 Boris 给出的回复,可以在这里找到:stackoverflow.com/questions/9943503/…我的解释是否正确?
B
B T

我刚刚发现了弹性盒子的魔力(显示:弹性)。尝试这个:

<style>
  #box {
    display: flex;
  }
  #b {
    flex-grow: 100;
    border: 1px solid green;
  }
</style>
<div id='box'>
 <div id='a'>Tree</div>
 <div id='b'>View</div>
</div>

Flex box 给了我 15 年来我希望 css 拥有的控制权。它终于来了!更多信息:https://css-tricks.com/snippets/css/a-guide-to-flexbox/


我不知道您发现了什么,但您的代码在最新的 Chrome jsfiddle.net/fjb548kw/3 中不起作用
@YevgeniyAfanasyev 我删除了“float:left;”解决问题。感谢您的注意!
谢谢你。你能解释一下为什么你有 flex-grow: 100; 而不是 flex-grow: 1; 吗?
@YevgeniyAfanasyev 没有特别的原因,只是我喜欢这样做。它允许我用百分比来思考,所以如果我可以做一些事情,比如将 #a 设置为 flex-grow:10,然后我将 #b 设置为 flex-grow: 90,那么 #a 将是线条宽度的 10%,而 #b 将是 90线宽的 %。如果没有其他元素具有 flex 宽度样式,那么从技术上讲,您放什么并不重要。
R
Reggie Pinkham

使用 CSS Flexbox flex-grow 属性填充剩余空间。

html, 身体 { 高度:100%; } 身体 { 显示:弹性; } .second { 弹性增长:1; }

视图


c
cletus

这将是一个很好的例子,说明与表格无关而很难(如果不是不可能的话,至少在跨浏览器意义上)与 CSS 相关。

如果两列都是固定宽度,这将很容易。

如果其中一列是固定宽度,这会稍微困难但完全可行。

由于两列的宽度都是可变的,恕我直言,您只需要使用一个包含两列的表格。


表格在响应式设计中不是很好,但您希望右侧列在小型设备上滑动到左侧下方。
有一些响应式设计技巧可用于处理表格:css-tricks.com/responsive-data-tables
我现在倾向于经常完全设计两个独立的布局,并使用媒体查询在移动设备上进行更改,display:none; 虽然在滑动范围内尽可能地 100% 响应,但有时最好将您的设计完全更改为使用移动设备触摸屏手感和按钮样式。
T
TylerH

使用 calc

.leftSide { 浮动:左;宽度:50px;背景颜色:绿色; } .rightSide { 浮动:左;宽度:计算(100% - 50px);背景颜色:红色; }

a
b

这样做的问题是必须明确定义所有宽度,或者作为值(px 和 em 工作正常),或者作为明确定义自身的百分比。


这样做的好处是它适用于输入类型字段,而评分最高的评论则不会。
最佳答案。适用于所有情况
R
Ruslan López

检查此解决方案

.container { 宽度:100%;高度:200px;背景颜色:绿色; } .sidebar { 浮动:左;宽度:200px;高度:200px;背景颜色:黄色; } .content { 背景颜色:红色;高度:200px;宽度:自动;左边距:200px; } .item { 宽度:25%;背景颜色:蓝色;向左飘浮;白颜色; } .clearfix { 清除:两者; }

25%
25%
25%
25%


这通常是一个更好的解决方案,因为并不总是需要隐藏溢出。
每个 OP:“我想要一个两列 div 布局,每个布局都可以有可变宽度”。在你的回答中,你必须知道第一列的宽度,所以它不是可变的。您也可以在两列上设置固定宽度并浮动它们。
R
Ruslan López

在这里,这可能会有所帮助...

视图


+1,因为您的示例似乎有效,但在我的真实场景中,一些来自“视图”的内容如何爬入“树”div,因为树 div 不是 100%,可能是一些 javascript 迫使它变小并且在树的高度之后我看查看内容
在这种情况下,如果你知道左列的最大宽度,你可以给它一个样式 max-width (在 IE 中不起作用)或考虑 margin-left (注意 IE 上的双边距错误)或填充左。
这太棒了!我将其作为一次性解决方案在线使用:<div class="clear" style="clear: both; height: 1px; overflow: hidden; font-size:0pt; margin-top: -1px;"></div>
I
Ivan

如果另一列的宽度是固定的,那么使用 calc CSS 函数 working for all common browsers 怎么样:

width: calc(100% - 20px) /* 20px being the first column's width */

这样,将计算第二行的宽度(即剩余宽度)并响应地应用。


就使用 flexbox 以外的任何东西而言,这是最好的答案,例如 css-grid。也可与 position: fixed 一起使用,这使它成为完美的选择!谢谢!
R
Ruslan López

我不明白为什么人们愿意如此努力地为使用旧 TABLE 标记的简单列式布局找到纯 CSS 解决方案。

所有浏览器仍然有表格布局逻辑......也许叫我恐龙,但我说让它帮助你。

视图< /td>

就跨浏览器兼容性而言,风险也小得多。


是的,但是如果一切都是由 css 完成的,为什么不这样做,至少是好奇,如果它是可能的?
这是因为如果您想在小型设备中使用 media-queries 将两列放在另一列之上,那么旧的 table 标记是不可能的。要使其正常工作,您需要应用 CSS 表格样式。因此,现在如果您想要任何屏幕尺寸的响应式布局,最好使用 CSS 解决这个问题。
R
Ruslan López

视图
查看
视图


我想要一个状态栏,左边有固定项目,右边有固定项目,一个消息行使用所有剩余空间。我从这个答案开始,并在浮动之后添加了我的消息 div:高度:20px;空白:nowrap;溢出:隐藏;文本溢出:剪辑
c
canon

你可以试试CSS Grid Layout

DL {显示:网格;网格模板列:最大内容自动; } dt { 网格列:1; } dd { 网格列:2;边距:0;背景颜色:#ccc; }

lorem ipsum
dolor sit amet
carpe
diem


S
Stanislav Ostapenko

flex-grow - 这定义了弹性项目在必要时增长的能力。它接受用作比例的无单位值。它规定了项目应该占用的弹性容器内的可用空间量。

如果所有项目都将 flex-grow 设置为 1,则容器中的剩余空间将平均分配给所有子项。如果其中一个孩子的值为 2,则剩余空间将占用其他空间的两倍(或者它会尝试,至少)。查看更多here

.parent { 显示:弹性; } .child { 弹性增长:1; // 它接受一个作为比例的无单位值 } .left { background: red; } .right { 背景:绿色; }

左 50%
右 50%


在您的示例中,两个 div 都会增长并填充剩余空间。问题要求一个 div 不增长,另一个填充剩余空间。
佚名

我不确定这是否是您期望的答案,但是,为什么不将 Tree 的宽度设置为“auto”,将“View”的宽度设置为 100% 呢?


因为这会将第二个浮动放在第一个下方,因为它太宽了。
N
Nagendra Rao

一个稍微不同的实现,

两个 div 面板(内容+额外)并排,如果 extra panel 不存在,content panel 会展开。

jsfiddle:http://jsfiddle.net/qLTMf/1722/


I
Ivan

帕特 - 你是对的。这就是为什么这个解决方案会同时满足“恐龙”和同时代人的原因。 :)

.btnCont { 显示:表格布局;宽度:500px; } .txtCont { 显示:表格单元格;宽度:70%;最大宽度:80%;最小宽度:20%; } .subCont { 显示:表格单元格;宽度:30%;最大宽度:80%;最小宽度:20%; }

长文本会随着它的增长而自动调整。最好的部分是容器的宽度不会超过 500px!
这一列以及整个容器就像一个表格一样工作。是不是很神奇!!!


css 类 .ip 没有 html 参考,它在 IE7 中不起作用
I
Ivan

您可以使用 W3 的 CSS 库,其中包含一个名为 rest 的类,该类就是这样做的:

150px

w3-rest

不要忘记在页面的 header 中链接 CSS 库:

<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">

这是官方演示:W3 School Tryit Editor


看起来这只是添加了“溢出:隐藏”,这使它成为已经给出的答案的更糟糕的版本
M
Mario Vázquez

使用 flexbox 相当容易。请参阅下面的片段。我添加了一个包装容器来控制流量并设置全局高度。还添加了边框以识别元素。请注意,div 现在也根据需要扩展到全高。供应商前缀应该用于真实场景中的 flexbox,因为尚未完全支持。

我开发了一个免费工具来使用 flexbox 理解和设计布局。在这里查看:http://algid.com/Flex-Designer

.container{ 高度:180px;边框:3px 实心#00f;显示:弹性;对齐项目:拉伸; } div { 显示:弹性;边框:3px 实心#0f0; } .second { 显示:弹性;弹性增长:1;边框:3px 实心#f00; }

视图


在添加您的答案之前,您是否阅读了所有先前的答案?好像没有……
作为旁注,您不需要添加 stretch 因为它是默认值并且不需要使子元素 flex 容器因此 display:flex 对于内部元素是无用的
我想知道为什么投反对票,没有任何评论。这个答案不是在回答问题吗?为什么?如果试图帮助别人受到惩罚,我会在下一个答案之前三思而后行,
否决票后您有两条评论,这还不够吗?
手鞠,你检查过我的工具了吗?你不觉得有用并且可以帮助别人吗?您认为与问题无关吗?你对这个问题的答案在哪里?我看不到它。你在这里的角色是什么?
佚名

查看可用的 CSS 布局框架。我会推荐 Simpl 或者稍微复杂一点的蓝图框架。

如果您使用的是 Simpl(仅涉及导入一个 simpl.css 文件),您可以这样做:

<div class="Colum­nOne­Half">Tree</div>
<div class="Colum­nOne­Half">View</div>

,对于 50-50 布局,或:

<div class="Colum­nOne­Quarter">Tree</div>
<div class="Colum­nThreeQuarters">View</div>

, 对于 25-75 的一个。

就是这么简单。


两列都是可变宽度吗?
a
akjoshi

感谢 Simpl.css 的插件!

记得像这样将所有列包装在 ColumnWrapper 中。

<div class="ColumnWrapper">
    <div class="Colum­nOne­Half">Tree</div>
    <div class="Colum­nOne­Half">View</div>
</div>

我即将发布 Simpl.css 的 1.0 版,所以请帮助宣传!


R
Ravi Matani

我编写了一个从 jQuery $(document).ready() 调用的 javascript 函数。这将解析父 div 的所有子元素,并且只更新最右边的子元素。

html

...
<div class="stretch">
<div style="padding-left: 5px; padding-right: 5px; display: inline-block;">Some text
</div>
<div class="underline" style="display: inline-block;">Some other text
</div>
</div>
....

javascript

$(document).ready(function(){
    stretchDivs();
});

function stretchDivs() {
    // loop thru each <div> that has class='stretch'
    $("div.stretch").each(function(){
        // get the inner width of this <div> that has class='stretch'
        var totalW = parseInt($(this).css("width"));
        // loop thru each child node
        $(this).children().each(function(){
            // subtract the margins, borders and padding
            totalW -= (parseInt($(this).css("margin-left")) 
                     + parseInt($(this).css("border-left-width")) 
                     + parseInt($(this).css("padding-left"))
                     + parseInt($(this).css("margin-right")) 
                     + parseInt($(this).css("border-right-width")) 
                     + parseInt($(this).css("padding-right")));
            // if this is the last child, we can set its width
            if ($(this).is(":last-child")) {
                $(this).css("width","" + (totalW - 1 /* fudge factor */) + "px");
            } else {
                // this is not the last child, so subtract its width too
                totalW -= parseInt($(this).css("width"));
            }
        });
    });
}

a
amischiefr

如果两个宽度都是可变长度,为什么不使用一些脚本或服务器端计算宽度?

<div style="width: <=% getTreeWidth() %>">Tree</div>

<div style="width: <=% getViewWidth() %>">View</div>