【发布时间】:2026-02-14 04:30:01
【问题描述】:
我的主页仪表板具有div 元素堆叠在一起的一般结构(每个元素都是屏幕宽度并提供不同类型的信息)。
我通过 CSS Grid 管理块的高度:整个应用程序是 min-height: 100vh;,行是 auto,除了一个是 1fr。效果很好。
我现在面临其中一条线动态存在或不存在的情况。这是因为它实际上是一个 Vue 组件,以v-if 有条件地显示。问题是 CSS 部分不知道它的存在,grid-template-rows 已修复。这会导致在切换时错误的行是 auto 和 1fr。
如何解决?
我能想到的一种方法是以 CSS 将其计为一行的方式强制组件的存在。现在,当它关闭时,我在开发工具中看到此元素为 <!----> == $0。
另一种方法是“描述”列模板,而不是固定列表。类似于“尽可能使用auto,然后使用1fr 和一个auto”
下面的两个代码片段模拟了我的问题。
第一种是所有元素都可见的情况
#app {
display: grid;
min-height: 100vh;
grid-template-rows: auto auto 1fr;
}
#footer {
align-self: end;
}
div {
border-style: dashed;
border-width: 1px;
}
<div id="app">
<div>this line is always visible</div>
<div>this one is toggled - here it is visible</div>
<div id="footer">this is the footer</div>
</div>
下面的代码是相同的,但第二行被切换(在这里注释掉,在实际代码中通过v-if 禁用)。看看它如何影响不再位于底部的页脚,因为 CSS 没有改变(= 没有适应消失的行)
#app {
display: grid;
min-height: 100vh;
grid-template-rows: auto auto 1fr;
}
#footer {
align-self: end;
}
div {
border-style: dashed;
border-width: 1px;
}
<div id="app">
<div>this line is always visible</div>
<!-- <div>this one is toggled - here it is not visible anymore </div> -->
<div id="footer">this is the footer</div>
</div>
【问题讨论】:
-
你能分享你的代码吗?所以我们可以看到结构、元素数量、模板等
-
@TemaniAfif:好的,有一个想法来最小化代码,这些例子现在反映了我的问题。
-
嗯...为什么不使用 flexbox 呢?
标签: html css vue.js vue-component css-grid