假设我有一个预先指定宽度的菜单。
我希望每个菜单项都缩小到适合其内容,但ONE除外,然后填充菜单中的剩余空间。
像这样:
Fill | item | item | item
到目前为止,我最接近实现此效果的方法是在每个菜单项的css代码中使用display:table-cell
。但问题是,除非我为项目定义宽度,否则它们都会扩展为占用表格中相同的宽度。
Fill | item | item | item | item
有没有办法让项目空间缩小以适合项目,并且填充项目只是填满div的其余部分?
答案 0 :(得分:10)
对于那些想要用表做的人,可以给第一个“td”一个类并将其设置为一个非常大的宽度,然后它会推动并强制其他列尽可能地缩小。 它的工作原理是因为表的扩展速度不能超过它们设置的宽度。
例如:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
table td {
border:solid 1px #000;
}
table td.fill {
width:9999em;
text-align:right;
}
table {
width:300px;
border-collapse:collapse;
}
</style>
</head>
<body>
<table>
<tr><td class="fill">Fill</td><td>item</td><td>item</td><td>item</td></tr>
</table>
</body>
</html>
在仅在Firefox和IE中工作的旧示例中,我将“td”宽度设置为0,然后尽可能地缩小列。
您可以通过将td宽度设置为较小的值来将所有列设置为缩小到适合度,例如,如果不设置表格宽度,则为1px,这适用于Chrome,Firefox和IE。
table td {
width:1px;
}
您可能也想设置white-space:nowrap;
,否则所有字词都会换行,或者td
更大一些width
答案 1 :(得分:7)
我处理此问题的一种方法是将width: 1px;
应用于我希望其细胞缩小的每个<TH>
。然后,在我想缩小到内容的每个单独的单元格上,我应用white-space: nowrap;
。这可以防止单元格实际缩小到1px。
我目前在财务数据表上使用这种方法,所以我不确定它是否适用于较长段落的文本。
答案 2 :(得分:3)
为什么不使用浮动?只需颠倒菜单项的顺序即可。
#menubar {
background-color: lime;
width: 100%;
}
.menuitem {
float: right;
padding-right: 10px;
padding-left: 10px;
}
/* Clear float */
#menubar:after {
content: ' ';
display: block;
clear: right;
}
<div id="menubar">
<div class="menuitem">item</div>
<div class="menuitem">item</div>
<div class="menuitem">item</div>
<div class="menuitem">item</div>
<div class="menuitem">fill</div>
</div>
使用填充宽度的display: inline-block
的替代方法:
#menubar {
width: 100%;
text-align: right;
}
.menuitem {
display: inline-block;
background-color: aqua;
}
.filled {
width: 100%;
background-color: gray;
}
<div id="menubar">
<div class="menuitem filled">fill
<div class="menuitem">item</div>
<div class="menuitem">item</div>
<div class="menuitem">item</div>
</div>
</div>
第二种方法唯一的缺点是菜单项实际上包含在第一个菜单项/填充中。它可以填充width:100%
...如果它们是下拉菜单,你可能想要做一些z-index工作并折叠边框/设置填充/等...
答案 3 :(得分:2)
我们现在可以期待 Flexbox 是标准的未来。目前是W3C Candidate Recommendation,Flexbox目前受browser support限制(重要的是,只有IE 11支持当前模型)。
<nav>
<a href="#">Fill</a>
<a href="#">Item</a>
<a href="#">Item</a>
<a href="#">Item</a>
</nav>
常规链接获得flex: 0 0 auto
:
0
- 不要成长0
- 不要缩小auto
- 不要让文字溢出(auto
应该是默认的,但文字会在没有设置的情况下溢出)第一个链接获得flex: 1 0 auto
:
1
- 占用剩余宽度0
- 不要缩小auto
- 不要让文字溢出nav {
display: flex;
}
nav a {
flex: 0 0 auto;
}
nav a:first-child {
flex: 1 0 auto;
}
This Flexbox guide is very helpful.
运行下面的代码段
/*
For the purpose of this demo:
toggle active class on click
*/
$('nav a').on('click', function() {
$('nav a').removeClass('active');
$(this).toggleClass('active');
});
&#13;
/* Foundation Properties */
nav {
display: flex;
}
nav a {
flex: 0 0 auto;
text-align: center;
}
nav a:first-child {
flex: 1 0 auto;
text-align: right;
}
/* Fluff Properties */
body {
background: #f5f5f5;
margin: 0;
}
nav {
max-width: 900px;
margin: 0 auto;
background: #3f51b5;
}
nav a {
font-family: Helvetica;
color: #c5cae9;
font-size: 0.8em;
text-transform: uppercase;
text-decoration: none;
border-bottom: solid 2px #3f51b5;
padding: 4em 1em 0;
transition: all 0.5s;
}
nav a.active {
color: #fce4ec;
border-bottom: solid 2px #fce4ec;
}
nav a:hover {
color: #FFF;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<nav>
<a href="#" class="active">Fill</a>
<a href="#">Item</a>
<a href="#">Item</a>
<a href="#">Item</a>
</nav>
&#13;
答案 4 :(得分:1)
使用表格的解决方案
<style type="text/css">
#menubar {
width:100%;
}
.FillBar {
width:100%;
text-align:right;
background-color:gray
}
</style>
<table id="menubar">
<tr>
<td class="FillBar">Fill</td>
<td>item</td>
<td>item</td>
<td>item</td>
<td>item</td>
<td>item</td>
</tr>
</table>
只需添加样式(填充/间距/等)或其他任何你需要的东西......
答案 5 :(得分:0)
与@cjezowicz所讨论的相似,你可以使用white-space
和一个单元width: 100%
来实现你正在寻找的效果:
<div id="row">
<div class="cell fill">Fill</div>
<div class="cell shrink">Item</div>
<div class="cell shrink">Item</div>
<div class="cell shrink">Item</div>
<div class="cell shrink">Item</div>
</div>
<style type="text/css">
div#row { display: table; width: 100%; }
div.cell { display: table-cell; text-align: center; vertical-align: middle; }
div.cell.fill { width: 100%; }
div.cell.shrink { white-space: pre; }
</style>
然后,如果您需要为任何缩小的单元格强制设置宽度,请使用该单元格上的min-width
。