我想要一个两列的 div 布局,每个布局都可以有可变的宽度,例如
div {浮动:左; } .second { 背景:#ccc; }
我希望 'view' div 在 'tree' div 填满所需空间后扩展到可用的整个宽度。
目前,我的“视图”div 的大小已调整为它包含的内容如果两个 div 占据整个高度也会很好。
不重复免责声明:
设置 float:left 时,将 div 扩展到最大宽度,因为左边的宽度固定。
帮助 div - 使 div 适合剩余宽度,因为我需要两列都向左对齐
overflow hidden
不便
解决这个问题其实很简单,但一点也不明显。您必须触发称为“块格式化上下文”(BFC)的东西,它以特定方式与浮点数交互。
只需取第二个 div,删除浮动,然后给它 overflow:hidden
。除可见之外的任何溢出值都会使其设置的块成为 BFC。 BFC 不允许后代浮点数逃脱它们,也不允许兄弟/祖先浮点数侵入它们。这里的最终效果是浮动的 div 会做它的事情,然后第二个 div 将是一个普通的块,占据所有可用的宽度除了被浮动占用的宽度。
这应该适用于所有当前的浏览器,尽管您可能必须在 IE6 和 7 中触发 hasLayout。我不记得了。
演示:
固定左:http://jsfiddle.net/A8zLY/5/
修复正确:http://jsfiddle.net/A8zLY/2/
div {浮动:左; } .second { 背景:#ccc;浮动:无;溢出:隐藏; }
我刚刚发现了弹性盒子的魔力(显示:弹性)。尝试这个:
<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/
flex-grow: 100;
而不是 flex-grow: 1;
吗?
flex-grow:10
,然后我将 #b 设置为 flex-grow: 90
,那么 #a 将是线条宽度的 10%,而 #b 将是 90线宽的 %。如果没有其他元素具有 flex 宽度样式,那么从技术上讲,您放什么并不重要。
这将是一个很好的例子,说明与表格无关而很难(如果不是不可能的话,至少在跨浏览器意义上)与 CSS 相关。
如果两列都是固定宽度,这将很容易。
如果其中一列是固定宽度,这会稍微困难但完全可行。
由于两列的宽度都是可变的,恕我直言,您只需要使用一个包含两列的表格。
display:none;
虽然在滑动范围内尽可能地 100% 响应,但有时最好将您的设计完全更改为使用移动设备触摸屏手感和按钮样式。
使用 calc
:
.leftSide { 浮动:左;宽度:50px;背景颜色:绿色; } .rightSide { 浮动:左;宽度:计算(100% - 50px);背景颜色:红色; }
这样做的问题是必须明确定义所有宽度,或者作为值(px 和 em 工作正常),或者作为明确定义自身的百分比。
检查此解决方案
.container { 宽度:100%;高度:200px;背景颜色:绿色; } .sidebar { 浮动:左;宽度:200px;高度:200px;背景颜色:黄色; } .content { 背景颜色:红色;高度:200px;宽度:自动;左边距:200px; } .item { 宽度:25%;背景颜色:蓝色;向左飘浮;白颜色; } .clearfix { 清除:两者; }
在这里,这可能会有所帮助...
<div class="clear" style="clear: both; height: 1px; overflow: hidden; font-size:0pt; margin-top: -1px;"></div>
如果另一列的宽度是固定的,那么使用 calc
CSS 函数 working for all common browsers 怎么样:
width: calc(100% - 20px) /* 20px being the first column's width */
这样,将计算第二行的宽度(即剩余宽度)并响应地应用。
css-grid
。也可与 position: fixed
一起使用,这使它成为完美的选择!谢谢!
我不明白为什么人们愿意如此努力地为使用旧 TABLE
标记的简单列式布局找到纯 CSS 解决方案。
所有浏览器仍然有表格布局逻辑......也许叫我恐龙,但我说让它帮助你。
树 | 视图< /td> |
就跨浏览器兼容性而言,风险也小得多。
media-queries
将两列放在另一列之上,那么旧的 table
标记是不可能的。要使其正常工作,您需要应用 CSS
表格样式。因此,现在如果您想要任何屏幕尺寸的响应式布局,最好使用 CSS
解决这个问题。
你可以试试CSS Grid Layout。
DL {显示:网格;网格模板列:最大内容自动; } dt { 网格列:1; } dd { 网格列:2;边距:0;背景颜色:#ccc; }
flex-grow - 这定义了弹性项目在必要时增长的能力。它接受用作比例的无单位值。它规定了项目应该占用的弹性容器内的可用空间量。
如果所有项目都将 flex-grow 设置为 1,则容器中的剩余空间将平均分配给所有子项。如果其中一个孩子的值为 2,则剩余空间将占用其他空间的两倍(或者它会尝试,至少)。查看更多here
.parent { 显示:弹性; } .child { 弹性增长:1; // 它接受一个作为比例的无单位值 } .left { background: red; } .right { 背景:绿色; }
我不确定这是否是您期望的答案,但是,为什么不将 Tree 的宽度设置为“auto”,将“View”的宽度设置为 100% 呢?
一个稍微不同的实现,
两个 div 面板(内容+额外)并排,如果 extra panel
不存在,content panel
会展开。
jsfiddle:http://jsfiddle.net/qLTMf/1722/
帕特 - 你是对的。这就是为什么这个解决方案会同时满足“恐龙”和同时代人的原因。 :)
.btnCont { 显示:表格布局;宽度:500px; } .txtCont { 显示:表格单元格;宽度:70%;最大宽度:80%;最小宽度:20%; } .subCont { 显示:表格单元格;宽度:30%;最大宽度:80%;最小宽度:20%; }
您可以使用 W3 的 CSS 库,其中包含一个名为 rest
的类,该类就是这样做的:
150px
w3-rest
不要忘记在页面的 header
中链接 CSS 库:
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
这是官方演示:W3 School Tryit Editor
使用 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="ColumnOneHalf">Tree</div>
<div class="ColumnOneHalf">View</div>
,对于 50-50 布局,或:
<div class="ColumnOneQuarter">Tree</div>
<div class="ColumnThreeQuarters">View</div>
, 对于 25-75 的一个。
就是这么简单。
感谢 Simpl.css 的插件!
记得像这样将所有列包装在 ColumnWrapper
中。
<div class="ColumnWrapper">
<div class="ColumnOneHalf">Tree</div>
<div class="ColumnOneHalf">View</div>
</div>
我即将发布 Simpl.css 的 1.0 版,所以请帮助宣传!
我编写了一个从 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"));
}
});
});
}
如果两个宽度都是可变长度,为什么不使用一些脚本或服务器端计算宽度?
<div style="width: <=% getTreeWidth() %>">Tree</div>
<div style="width: <=% getViewWidth() %>">View</div>