我有一个包含常量宽度项的动态宽度容器div。我希望能够调整容器的大小,以便它只显示整个项目,从不切割右边的项目。
例如,用户的屏幕可能会呈现显示5个项目:
如果该用户开始缩小其屏幕宽度,只要该条不再宽到足以容纳5个完整项目,我希望它缩小到仅显示4个项目。
为:
好:
我知道这可以通过使用CSS3媒体查询来实现,但我想避免为每个不同数量的元素编写不同的断点。我还想避免使用javascript resize
事件处理程序,但我不确定如果没有它,这是否可行。
答案 0 :(得分:13)
此解决方案基于对another solution for a similar problem I gave elsewhere的修改。
<强> Here is the fiddle. 强>
它涉及重叠伪元素的复杂关系以创建边界,这可能导致解决方案对其中可能或不可能完成的内容具有某些限制(复杂背景也是一个问题,以及作为某些定位方面的必要性)。然而,它在给定的情况下起作用。
一点解释
基本上,每个.item
元素都使用:after
和:before
元素构建自己的顶部/底部边框部分,前者绑定到.itemContainer
,后者绑定到.item
本身(需要:before
才能在行的末尾创建最后一点边框)。此外,:before
还创建了右边框的“灵活”位置,以便在元素移出视图时提供所需的响应。这就是:before
必须与.item
本身相关的原因,以及为什么每个:after
元素的背景都必须用于“隐藏”前一个:before
的右边框的原因元件。
由于我们不知道通过css在任何给定点关于哪个元素是显示中的“最后”的“计数”,所有:before
元素必须显示,但我们不想要他们都是正确的边界,因此:after
需要覆盖它们。当元素向下移动到下一行时,其:after
不再覆盖现在已成为最后显示元素的右边界,显示该边界将用作整个组的“右”边界。 / p>
HTML(匹配原始小提琴)
<div class="itemBar">
<div class="itemContainer">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
</div>
主要内容的CSS
.itemBar {
display: inline-block;
width: 50%; /* some width can be set, does not need to be this */
}
.itemContainer {
position: relative; /* :after pseudo-elements are positioned off this */
z-index: 1; /* needed for pseudo-element interaction */
overflow: hidden;
display: inline-block;
max-height: 68px;
width: 100%;
border-left: 1px solid black; /* left border is supplied by this */
}
.item {
width: 60px;
height: 62px;
display: inline-block;
margin: 2px;
border: 1px solid black;
/* NOTE: CANNOT be given positioning */
}
伪元素的CSS
.item::after {
content: '';
position: absolute; /* will position off itemContainer */
z-index: -1; /* push it to the background */
top: 0; /* set it to top of itemContainer */
bottom: 0; /* set it to bottom of itemContainer */
margin-left: -100%; /* shove it past the far left edge of itemContainer */
/* next, use padding to bring it back to its position at the end
of the text string of .item */
padding-left: 100%;
/* next, add enough padding on the right to compensate for the right
padding, right margin, and right border of .item */
padding-right: 3px;
/* next, create the top and bottom border of "container",
in conjunction with the :before; so this is a pseudo-border for
.itemContainer being created by the .item elements */
border-top: 1px solid black;
border-bottom: 1px solid black;
background: #fff; /* hide other :before borders */
}
.item:before { /* make right border */
content: '';
padding-top: 66px; /* give it .itemContainer height minus border heights */
width: 100%;
margin-top: -3px; /* .item top margin + border width */
margin-left: -100%; /* pull the text in .item back into position */
margin-right: 0;
/* next, push this behind the background with an even lower z-index
to hide it if it is not the right most element beign used to
form the right border */
z-index: -2;
float: right; /* get the before element to the right */
position: relative; /* needs to be adjusted in position */
right: -4px; /* move it same as padding-right of the after element */
display: block; /* give it a display */
/* next, use it to build the fake right border and also the fake
final top/bottom borders of the of itemContainer */
border-right: 1px solid black;
border-top: 1px solid black;
border-bottom: 1px solid black;
}
答案 1 :(得分:4)
卸下:
white-space: nowrap;
来自.itemBar
并添加
text-align:justify;
到.itemContainer
这样,其他不合适的物品将落入下一行但空间将平均分配。
答案 2 :(得分:3)
您可以将容器中的项目浮动。这样,如果容器变小,它们将浮动到下一行。
如果您足够幸运且知道物品的高度,您可以将容器设置为固定高度overflow: hidden
以使流向下一行的物品不显示。
答案 3 :(得分:0)
这是另一个比ScottS更简单的解决方案。它不需要::before
或::after
的任何定位或使用,而是依赖于::first-line
不会延伸到最后一个可见项目的事实。
<div class="itemContainer">
<div class="item">1</div><div
class="item">2</div><div
class="item">3</div><div
class="item">4</div><div
class="item">5</div><div
class="item">6</div><div
class="item">7</div><div
class="item">8</div><div
class="item">9</div><div
class="item">10</div>
</div>
请注意,此解决方案对元素间空白很敏感,因此您需要删除连续.item
之间的换行符/空格。我在上面的标记名称和类之间进行了换行,以使其更具可读性。
.itemContainer {
overflow: hidden;
height: 70px; /* .item's offset height + margin */
/* you can constrain the width of this any way you like */
}
.itemContainer::first-line {
font-size: 70px; /* needs to be at least as big as .wrap height */
line-height: 0px; /* fixes oddities in Firefox */
background: black; /* "border" color */
}
.item {
display: inline-block;
vertical-align: text-top; /* this minimizes the font-size required above */
margin: 10px; /* include desired "border" size of .itemContainer */
box-shadow: 0 0 0 9px white; /* spread = desired margin */
background: white; /* needs an opaque background */
/* reset font-size and line-height */
font-size: 1rem;
line-height: 1.5;
/* set your item size and borders however you like */
height: 50px;
width: 50px;
border: 1px solid red;
box-sizing: border-box;
}
.item::first-line {
font-size: 1rem; /* fix IE precedence */
}
.item + .item {
margin-left: 0; /* inline-block margins don't collapse */
}
在Safari,Chrome,Firefox和IE 11中测试。