gpt4 book ai didi

html - 在 CSS Grid 中指定哪些单元格的内容扩展单元格区域,哪些不扩展单元格区域

转载 作者:技术小花猫 更新时间:2023-10-29 12:53:16 25 4
gpt4 key购买 nike

我希望在网格中有一个包含不重要信息的单元格,它不会使任何其他单元格扩展到超出绝对需要的范围。它的高度应该不超过其他单元格的高度,它的宽度应该是空的未被占用区域的宽度。

假设每个元素我都有一个缩略图、一个标题(可展开的单行)、信息(零行或多行)、描述(可能很长,只有在有空白空间时才会显示)。

我想出了这个:

.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>

我必须将描述放入相对定位单元格内的绝对定位容器中。这使得网格忽略内容并且有点工作,但是有几个问题:

  1. 如果描述很短(见元素#5),我无法将信息 block 居中,因为 1fr 用于描述,所以设置间距列(slsr) 到 0 以外的任何东西都不起作用(样式属性形式的肮脏黑客不算数,它只是为了显示使用间距单元格)。

  2. 它看起来不像是纯 CSS 网格解决方案。我想知道是否有更多“ native ”方法来指定细胞生长如何受内容影响。


如果你想要一个“干净的开始”,你可以删除 position: absolute; CSS 中的/*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>

最佳答案

我认为我已经找到了一个很好的解决方案。

唯一的缺点是我需要在 .title.info 上设置一个 max-width

您的第一个问题是分配水平空间。您希望第二列为 title 提供尽可能多的空间。但不超过所包含元素的自然宽度。所以,我们需要一些与内容相关的东西,以及它的最大宽度,max-content

然后我们希望第三列,带有desc,如果有左边的宽度,也不要超过它可以填充的宽度。这可以通过 min-max(0, max-content)

实现

最后,我们希望所有剩余空间都位于第 1 列和第 4 列,1fr

这种安排之所以可行,是因为可用空间分为两轮,一轮用于 minmax 函数,第二轮用于 fr 元素。

此设置的问题是titlemax-content 可能会溢出容器。我们不能(我认为)在网格本身上解决这个问题,我们需要在元素本身上设置一个最大宽度。

起初,您可能认为此处的 minmax 函数会有所帮助。不,它不能。可以看一个解释here

另一个问题是处理desc 的高度。由于它跨越 2 行,但都必须对内容敏感,所以我们在这里运气不好。

幸运的是,您在这里已经有了一个嵌套结构。使容器 overflow: hidden 并限制内部元素的高度就可以了。内部元素的内容没有足够的高度,但由于 overflow: none 而显示。并且容器将高度适配到网格,并对溢出的内容进行裁剪

: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;
--max-item-desc-height: 32px; /* added */
}

.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: 1fr max-content minmax(0px, max-content) 1fr; /* changed */
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;
max-width: var(--max-item-size); /* added */
}
.info {
grid-area: info;
overflow: hidden;
text-overflow: ellipsis;
max-width: var(--max-item-size); /* added */
}
.desc {
grid-area: desc;
overflow: hidden;
max-height: var(--max-item-desc-height); /* added */
}
.desc-text::after {
content: var(--lorem-ipsum);
}
.desc-text.short::after {
content: var(--lorem-ipsum-short);
}
<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>

关于html - 在 CSS Grid 中指定哪些单元格的内容扩展单元格区域,哪些不扩展单元格区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48136696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com