我有一个 div 容器,它有一些固定大小的“pre”和“post”内容,主要内容夹在中间——主要内容基本上由一个标签和一个数字组成。这是一个带有示例的jsfiddle 链接(代码也在下面复制 - 我添加颜色只是为了可见对比)。
线框模型:
------------------------------------------
| A | Variable Sized Content | 123 | B |
------------------------------------------
A
并且B
是前后内容;文本和数字的大小是可变的,如果没有足够的空间,内容将缩小并用省略号截断:
---------------------------------
| A | Variable Siz... | 123 | B |
---------------------------------
如果空间很大,多余的空格会出现在数字和 之间B
:
-----------------------------------------------------
| A | Variable Sized Content | 123 | B |
-----------------------------------------------------
我现在让它工作的方式是outerDiv
在 Javascript 中设置一个调整大小max-width
的侦听器来设置member-text
类的。这还管理内容 div 的最小大小,以便进一步缩小也将省略数字。
我遇到的问题是试图在没有Javascript 的情况下使这项工作 -max-width
不断更改所有元素相当笨拙/缓慢(示例仅显示两个项目,但在生产中这是在许多项目的列表中),并且它使结构不便于用作其他小部件的子组件。我可以重构它以使其工作,但这需要一些时间,而且似乎“更正确”的解决方案是尽可能使用 CSS。
我最接近模拟的方法是设置max-width
为member-text
100% 和85% 左右,这max-width
对于member-token
默认值 (230-290ish) 附近的 outerDiv 宽度范围看起来不错,但除此之外它会崩溃(间距太大/太小在错误的部分)。
编辑:我现在也尝试使用display: table
( 和table-row
/ table-cell
,table-layout: fixed
在根 div 上使用 div - 通过在除一列之外的所有列上指定宽度,该列可以动态调整大小。如果只有一个具有变量的 div,这将很有用大小的内容(文本),但在这种情况下,有两个(气泡文本,由模型中的数字表示),但这种策略似乎不允许多个动态大小的列。
这导致了我的问题 - 甚至可以用 CSS 来做这种事情吗?如果是这样,怎么办? 即使假设数字是固定宽度以简化问题,如果没有 Javascript,这似乎也不可能......
这是代码示例(演示问题的简化示例)
HTML:
<div class="outerDiv">
<div class="post-mark"></div>
<div class="pre-mark"></div>
<div class="member">
<div class="member-token">
<label class="member-text">Very Long Text Purple Monkey Dishwasher</label>
</div>
<div class="member-bubble">
<span class="member-bubble-text">500</span>
</div>
</div>
</div>
<div class="outerDiv">
<div class="post-mark"></div>
<div class="pre-mark"></div>
<div class="member">
<div class="member-token">
<label class="member-text">Purple Monkey Dishwasher</label>
</div>
<div class="member-bubble">
<span class="member-bubble-text">500</span>
</div>
</div>
</div>
CSS:
.outerDiv {
width: 280px;
height: 100px;
background-color: lightgrey;
}
.post-mark {
display: inline-block;
height: 100%;
margin-right: 8px;
position: relative;
width: 18px;
float: right;
background-color: cyan;
}
.pre-mark {
height: 100%;
margin-left: 4px;
position: relative;
width: 18px;
float: left;
background-color: pink;
}
.member {
margin-left: 22px;
height: 22px;
overflow: hidden;
position: relative;
white-space: nowrap;
background-color: cadetblue;
}
.member-token {
float: left;
height: 20px;
margin-left: 2px;
padding: 0 3px;
background-color: darksalmon
}
.member-text {
display: inline-block;
line-height: 20px;
max-width: 193px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
background-color: goldenrod;
}
.member-bubble {
display: block;
height: 100%;
overflow: hidden;
padding: 0 4px;
position: relative;
background-color: burlywood
}
.member-bubble-text {
top: 4px;
-moz-box-sizing: border-box;
background-color: #F2F2F2;
border-radius: 3px 3px 3px 3px;
display: inline-block;
line-height: 14px;
max-width: 100%;
padding 0 4px;
position: relative;
vertical-align: top;
color: #666666;
font-size: 11px;
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}