嵌套 flexbox 项目中的截断文本
Truncated text in nested flexbox items
我想截断 flexbox 项目中的文本。这完全没问题。但是,如果这个 flexbox 项目被另一个 flexbox 项目包裹,它就会破坏。有没有什么办法可以让一切都变得流畅不爆裂?
我做了一支笔,你看到它在这里断了:http://codepen.io/anon/pen/apJYaN
.accordeon {
width: 300px;
background-color: #eeeeee;
}
.accordeon__row {
/* if you remove this, then it works */
display: flex;
}
.accordeon__row-label {
flex-basis: 30%;
}
.accordeon__row-content {
list-style-type: none;
padding-left: 0;
margin-bottom: 0;
margin-top: 0;
}
.accordeon__row-item {
display: flex;
}
.accordeon__row-value {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<div class="accordeon">
<div class="accordeon__row">
<div class="accordeon__row-label">
Mobility
</div>
<ul class="accordeon__row-content">
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
</ul>
</div>
<div class="accordeon__row">
<div class="accordeon__row-label">
Mobility
</div>
<ul class="accordeon__row-content">
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
</ul>
</div>
<div class="accordeon__row">
<div class="accordeon__row-label">
Schools
</div>
<ul class="accordeon__row-content">
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Akademisches Gymnasium Beethovenplatz 1
</div>
</li>
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
</ul>
</div>
</div>
不确定您究竟希望它看起来像什么,但您可以通过使用网格布局而不是 flexbox 来实现它。所以没有任何东西从父容器中脱离出来。
以下是完成网格布局的方法:
.col-1 {width: 8.33%;}
.col-2 {width: 16.66%;}
.col-3 {width: 25%;}
.col-4 {width: 33.33%;}
.col-5 {width: 41.66%;}
.col-6 {width: 50%;}
.col-7 {width: 58.33%;}
.col-8 {width: 66.66%;}
.col-9 {width: 75%;}
.col-10 {width: 83.33%;}
.col-11 {width: 91.66%;}
.col-12 {width: 100%;}
[class*="col-"] {
float: left;
padding: 0;
}
.row {
width: 300px;
margin: 0 auto;
}
.row::after {
content: "";
clear: both;
display: block;
}
然后给每个 accordeon__row 行 class 并给每个 accordeon__row-item col-12 class。
这样可以确保该项目始终包含在父行中。
您可以尝试为项目分配不同的 col-n classes。
https://jsfiddle.net/alabianc/755vgz29/1/ 这显示了您的代码,但采用网格布局。根据屏幕宽度更改布局也更容易。
您可以添加以下行:
.accordeon__row-content {
...
min-width: 0; /* https://www.w3.org/TR/css-flexbox-1/#min-size-auto */
}
并调整这一行:
.accordeon__row-label {
flex: 0 0 30%; /* fixed width flex item, previously flex-basis: 30%; */
}
我想截断 flexbox 项目中的文本。这完全没问题。但是,如果这个 flexbox 项目被另一个 flexbox 项目包裹,它就会破坏。有没有什么办法可以让一切都变得流畅不爆裂?
我做了一支笔,你看到它在这里断了:http://codepen.io/anon/pen/apJYaN
.accordeon {
width: 300px;
background-color: #eeeeee;
}
.accordeon__row {
/* if you remove this, then it works */
display: flex;
}
.accordeon__row-label {
flex-basis: 30%;
}
.accordeon__row-content {
list-style-type: none;
padding-left: 0;
margin-bottom: 0;
margin-top: 0;
}
.accordeon__row-item {
display: flex;
}
.accordeon__row-value {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<div class="accordeon">
<div class="accordeon__row">
<div class="accordeon__row-label">
Mobility
</div>
<ul class="accordeon__row-content">
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
</ul>
</div>
<div class="accordeon__row">
<div class="accordeon__row-label">
Mobility
</div>
<ul class="accordeon__row-content">
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
</ul>
</div>
<div class="accordeon__row">
<div class="accordeon__row-label">
Schools
</div>
<ul class="accordeon__row-content">
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Akademisches Gymnasium Beethovenplatz 1
</div>
</li>
<li class="accordeon__row-item">
<div class="accordeon__row-value">
1 min
</div>
<div class="accordeon__row-value">
Supermarket
</div>
</li>
</ul>
</div>
</div>
不确定您究竟希望它看起来像什么,但您可以通过使用网格布局而不是 flexbox 来实现它。所以没有任何东西从父容器中脱离出来。
以下是完成网格布局的方法:
.col-1 {width: 8.33%;}
.col-2 {width: 16.66%;}
.col-3 {width: 25%;}
.col-4 {width: 33.33%;}
.col-5 {width: 41.66%;}
.col-6 {width: 50%;}
.col-7 {width: 58.33%;}
.col-8 {width: 66.66%;}
.col-9 {width: 75%;}
.col-10 {width: 83.33%;}
.col-11 {width: 91.66%;}
.col-12 {width: 100%;}
[class*="col-"] {
float: left;
padding: 0;
}
.row {
width: 300px;
margin: 0 auto;
}
.row::after {
content: "";
clear: both;
display: block;
}
然后给每个 accordeon__row 行 class 并给每个 accordeon__row-item col-12 class。 这样可以确保该项目始终包含在父行中。 您可以尝试为项目分配不同的 col-n classes。
https://jsfiddle.net/alabianc/755vgz29/1/ 这显示了您的代码,但采用网格布局。根据屏幕宽度更改布局也更容易。
您可以添加以下行:
.accordeon__row-content {
...
min-width: 0; /* https://www.w3.org/TR/css-flexbox-1/#min-size-auto */
}
并调整这一行:
.accordeon__row-label {
flex: 0 0 30%; /* fixed width flex item, previously flex-basis: 30%; */
}