【发布时间】:2018-06-16 15:05:57
【问题描述】:
我想在网格中有一个包含不重要信息的单元格,它不会使任何其他单元格超出绝对需要的范围。它的高度不应超过其他单元格的高度,其宽度应为空的未占用区域的宽度。
假设对于每个项目,我都有一个缩略图、一个标题(单个可展开的行)、信息(零行或多行)、描述(可能很长,仅在有空白区域时显示)。
我想出了这个:
.list {
display: flex;
flex-wrap: wrap;
font: 12px/14px Verdana;
}
.item {
display: grid;
grid-template-areas:
"thumb thumb thumb thumb"
"sl title desc sr "
"sl info desc sr ";
grid-template-columns:
auto auto 1fr auto;
grid-template-rows:
auto auto 1fr;
min-width: calc(var(--min-item-size) + 4px);
max-width: calc(var(--max-item-size) + 4px);
border: dotted 2px darkblue;
margin: 4px 2px auto 2px;
}
.item > * {
min-width: 0;
min-height: 0;
border: dotted 1px dodgerblue;
margin: 1px;
}
.thumb {
grid-area: thumb;
margin: auto;
height: 100px;
background: linear-gradient(lightskyblue, deepskyblue);
}
.title {
grid-area: title;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.info {
grid-area: info;
overflow: hidden;
text-overflow: ellipsis;
}
.desc {
grid-area: desc;
position: relative;
overflow: hidden;
}
.desc-text::after {
position: absolute; /*clean hack*/
left: 0;
top: 0;
right: 0;
bottom: 0;
content: var(--lorem-ipsum);
}
.desc-text.short::after {
content: var(--lorem-ipsum-short);
}
:root {
--lorem-ipsum: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
--lorem-ipsum-short: "Lorem";
--min-item-size: 100px;
--max-item-size: 150px;
}
<div class="list">
<div class="item">
<div class="thumb" style="width: 150px">1</div>
<div class="title">Short title</div>
<div class="info">Short info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 150px">2</div>
<div class="title">Very long and detailed title</div>
<div class="info">Very long and detailed info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 50px">3</div>
<div class="title">Short title</div>
<div class="info">Short info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 50px">4</div>
<div class="title">Very long and detailed title</div>
<div class="info">Very long and detailed info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item" style="grid-template-columns: 22px auto 1fr 22px /*dirty hack*/">
<div class="thumb" style="width: 150px">5</div>
<div class="title">Short title</div>
<div class="info">Short info</div>
<div class="desc">
<div class="desc-text short"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 150px">6</div>
<div class="title">Very long and detailed title</div>
<div class="info">Very long and detailed info</div>
<div class="desc">
<div class="desc-text short"></div>
</div>
</div>
</div>
我必须将描述放入相对定位单元格内的绝对定位容器中。这使得网格忽略内容并且有点工作,但是有几个问题:
-
1234563
它看起来不像是纯 CSS 网格解决方案。我想知道是否有更多“原生”方式来指定细胞生长如何受内容影响。
0 以外的其他都不起作用(样式属性形式的脏 hack 不算,只是为了显示间距单元格的使用)。
如果您想要一个“干净的开始”,您可以从 CSS 中删除 position: absolute; /*clean hack*/ 行并从 HTML 中删除 style="grid-template-columns: 22px auto 1fr 22px /*dirty hack*/" 属性。一些定位 CSS 属性已过时,但它们不再影响定位。如果你愿意,它们也可以被移除。
干净的开始:
.list {
display: flex;
flex-wrap: wrap;
font: 12px/14px Verdana;
}
.item {
display: grid;
grid-template-areas:
"thumb thumb thumb thumb"
"sl title desc sr "
"sl info desc sr ";
grid-template-columns:
auto auto 1fr auto;
grid-template-rows:
auto auto 1fr;
min-width: calc(var(--min-item-size) + 4px);
max-width: calc(var(--max-item-size) + 4px);
border: dotted 2px darkblue;
margin: 4px 2px auto 2px;
}
.item > * {
min-width: 0;
min-height: 0;
border: dotted 1px dodgerblue;
margin: 1px;
}
.thumb {
grid-area: thumb;
margin: auto;
height: 100px;
background: linear-gradient(lightskyblue, deepskyblue);
}
.title {
grid-area: title;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.info {
grid-area: info;
overflow: hidden;
text-overflow: ellipsis;
}
.desc {
grid-area: desc;
overflow: hidden;
}
.desc-text::after {
content: var(--lorem-ipsum);
}
.desc-text.short::after {
content: var(--lorem-ipsum-short);
}
:root {
--lorem-ipsum: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
--lorem-ipsum-short: "Lorem";
--min-item-size: 100px;
--max-item-size: 150px;
}
<div class="list">
<div class="item">
<div class="thumb" style="width: 150px">1</div>
<div class="title">Short title</div>
<div class="info">Short info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 150px">2</div>
<div class="title">Very long and detailed title</div>
<div class="info">Very long and detailed info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 50px">3</div>
<div class="title">Short title</div>
<div class="info">Short info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 50px">4</div>
<div class="title">Very long and detailed title</div>
<div class="info">Very long and detailed info</div>
<div class="desc">
<div class="desc-text"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 150px">5</div>
<div class="title">Short title</div>
<div class="info">Short info</div>
<div class="desc">
<div class="desc-text short"></div>
</div>
</div>
<div class="item">
<div class="thumb" style="width: 150px">6</div>
<div class="title">Very long and detailed title</div>
<div class="info">Very long and detailed info</div>
<div class="desc">
<div class="desc-text short"></div>
</div>
</div>
</div>
【问题讨论】:
-
这个问题在几个方面并不完全清楚。这是一个:网格区域
sl和sr在哪里?它们在grid-template-areas中显示为值。但是它们是在哪里定义的呢? -
@Michael_B 单元格
sl和sr纯粹用于使缩略图下方的信息块居中。如果您将grid-template-columns设置为1fr auto auto 1fr,则会居中,但会失去描述单元格宽度的扩展。如果您将其设置为1fr auto 1fr 1fr之类的东西,您将获得居中,但描述单元格的宽度不会扩展到所有空白区域,即使它可用。基本上,不可能同时拥有both 功能: 1. 如果描述很长,则将描述扩展到空白空间的全宽; 2. 居中信息块为描述,其他单元格较短。 -
@Michael_B 更新了问题。 1. 现在所有项目都按照我想要的方式显示。 2. 样式属性 hack 添加到 HTML 以显示间距单元格的使用。
-
我想我明白你在追求什么。考虑发布一个简化的、直接的演示,可能只有一张问题卡并删除绝对定位。通过发布一个 hacky 解决方案,您可能会分散对干净有效解决方案的注意力(并冒险接近XY Problem)。
-
@Michael_B (呃,没有保存之前的问题编辑。)我需要所有 6 个案例。单独解决每一个问题是微不足道的。如果我删除绝对定位,它会打破 6 个案例中的 4 个。无论如何,在问题中添加了一个“干净的开始”sn-p。