【发布时间】:2019-02-21 18:37:51
【问题描述】:
为什么将两个 CSS Grid 列显式设置为 50%,每个列都会创建超过 100% 视口宽度的水平滚动?
This codepen shows the behavior I'm asking about.
基本上,当网格设置为以下 css 时,它会生成两列布局不会强制水平滚动超出视口宽度:
.grid {
display: grid;
grid-gap: 1rem;
grid-template-columns: 50%;
grid-template-areas: 'item item';
}
当grid-template-columns 更改为显式设置两个列宽时,结果是两列布局带有水平滚动:
.grid {
grid-template-columns: 50% 50%;
}
为什么水平滚动出现在第二个上下文中,而不是第一个?
编辑:<aside>我似乎记得 flexbox 的行为方式类似</aside>
* {
box-sizing: border-box;
}
body {
margin: 0;
}
.grid {
padding-top: 1rem;
display: grid;
grid-gap: 1rem;
grid-template-columns: 50%;
grid-template-areas: 'item item';
}
/* WHY THE HORIZONTAL SCROLL
WHEN LINES 21-23 ARE
UNCOMMENTED?! */
/* .grid {
grid-template-columns: 50% 50%;
} */
.item {
padding: 2rem;
border: 2px solid black;
border-radius: 0.25rem;
}
.p1 {
padding: .5rem;
}
code {
padding: .5rem;
background: gray;
color: white;
font-weight: regular;
}
<header class="p1">
<h1>Why does the horizontal scroll happen when <code>.grid { grid-template-columns: 50% 50%; }</code></h1>
<p>Uncomment lines 21-23 in the CSS of this codepen to set the above <code>.grid</code> css rule. See this <a href="https://stackoverflow.com/q/52374483/2145103">Stack Overflow post for discussion.</a></p>
</header>
<div class="grid">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
【问题讨论】:
-
使用 fr 单位:grid-template-columns: 1fr 1fr;我手头没有具体细节,但 AFAIK,fr 是一个“弹性单位”,指的是剩余空间量(折扣填充等)。显然,百分比值没有考虑这些,并且有效尺寸会超出水平客户端尺寸。