如何在 Flexbox 中禁用等高列?
Posted
技术标签:
【中文标题】如何在 Flexbox 中禁用等高列?【英文标题】:How to disable equal height columns in Flexbox? 【发布时间】:2016-01-07 04:32:54 【问题描述】:我试图在布局中对齐三个元素。
首先,我有一个用于反馈的 div,然后是一个搜索输入,然后是一个用于建议的 div 元素。
我希望第一个和最后一个元素的宽度为 20%,搜索输入的宽度为 60%。使用 Flexbox 我实现了我想要的。
但是有一个功能可以将所有 div 增长到最高元素。这意味着当搜索结果弹出时,反馈和建议元素的高度会随着搜索 div 的增加而导致布局混乱。
有没有办法不让元素最高的 div 增长? 让 div(#feedback
和 #suggestions
)在其中包含内容的高度?
#container_add_movies
display: flex;
#container_add_movies #feedback
width: 20%;
background-color: green;
#container_add_movies #search
width: 60%;
background-color: red;
#container_add_movies #suggestions
width: 20%;
background-color: yellow;
<div id='container_add_movies'>
<div id='feedback'>
Feedback
</div>
<div id='search'>
Search
<br>Search
<br>Search
<br>Search
<br>Search
<br>Search
<br>Search
<br>Search
<br>Search
<br>Search
<br>
</div>
<div id='suggestions'>
Suggestions
</div>
</div>
http://codepen.io/alucardu/pen/PPjRzY
【问题讨论】:
【参考方案1】:您遇到了 flex 等高列功能。
弹性容器的初始设置是align-items: stretch
。
这意味着弹性项目会自动扩展容器横轴的全长。在行方向容器中,横轴是垂直的(高度)。
最高的项目设置所有兄弟姐妹的高度。随着最高的项目扩大,它的兄弟姐妹也随之而来。因此,所有项目的高度相同。
要覆盖此默认设置,请将align-items: flex-start
添加到弹性容器:
#container_add_movies
display: flex;
align-items: flex-start;
#container_add_movies
display: flex;
align-items: flex-start; /* NEW */
#container_add_movies #feedback
width: 20%;
background-color: green;
display: block;
#container_add_movies #search
width: 60%;
background-color: red;
#container_add_movies #suggestions
width: 20%;
background-color: yellow;
<div id='container_add_movies'>
<div id='feedback'>Feedback</div>
<div id='search'>
Search<br>Search<br>Search<br>Search<br>Search<br> Search
<br>Search<br>Search<br>Search<br>Search<br>
</div>
<div id='suggestions'>Suggestions</div>
</div>
... 或 align-self: flex-start
到弹性项目:
#feedback
align-self: flex-start;
width: 20%;
background-color: green;
#suggestions
align-self: flex-start;
width: 20%;
background-color: yellow;
#container_add_movies
display: flex;
#container_add_movies #search
width: 60%;
background-color: red;
#feedback
align-self: flex-start; /* NEW */
width: 20%;
background-color: green;
#suggestions
align-self: flex-start; /* NEW */
width: 20%;
background-color: yellow;
<div id='container_add_movies'>
<div id='feedback'>Feedback</div>
<div id='search'>
Search<br>Search<br>Search<br>Search<br>Search<br> Search
<br>Search<br>Search<br>Search<br>Search<br>
</div>
<div id='suggestions'>Suggestions</div>
</div>
align-items
设置默认值align-self
。使用align-self
,您可以覆盖单个项目的默认值。
规范中的更多细节:
8.3. Cross-axis Alignment: the
align-items
andalign-self
propertiesFlex项目可以在当前行的横轴上对齐 flex 容器,类似于
justify-content
,但在垂直方向 方向。
align-items
设置所有 flex 的默认对齐方式 容器的项目,包括匿名弹性项目。
align-self
允许覆盖此默认对齐方式 单个弹性项目。
一点历史
自 CSS 诞生以来,有两个布局挑战经常让前端开发人员感到沮丧、困惑和烦恼:
-
如何使事物居中,尤其是垂直居中,以及
如何创建等高的列(除了表格)
今天,随着 flexbox 的出现,这些问题都解决了。
将事物居中从未如此简单:
#container
display: flex;
justify-content: center; /* center flex items along the main axis */
align-items: center; /* center flex items along the cross axis */
简单。简单。高效的。 The craziness is over.
在等高列方面,flexbox 也很出色:默认情况下它会这样做。
#container
display: flex;
flex-direction: row; /* not even necessary; default rule */
align-items: stretch; /* not even necessary; default rule */
align-items: stretch
规则告诉 flex 项目尽可能沿横轴展开。因此,在行方向容器中,所有项目的高度都可以相同。 More craziness tamed by flexbox.
来自popular answer for equal height columns:
将
overflow: hidden
给容器和大(和相等) 列的负边距和正填充。请注意,这 方法有一些问题,例如锚链接无法在您的 布局。
现在这是一个 hack!
钟摆现在开始向另一个方向摆动:设计师正在询问如何关闭等高柱。
【讨论】:
你是个英雄……【参考方案2】:您可以将align-items: flex-start
添加到您的#container_add_movies
。这是example
【讨论】:
【参考方案3】:将导致问题的子元素设置为flex:none
对我有用。
【讨论】:
【参考方案4】:要在 bootstrap 4 中设置不相等的列,首先它需要知道它是如何使列的高度相等的,所以原因是
align-items: stretch
要删除此属性,它需要添加 align-items: flex-start
所以为此我添加了 class="align-items-start" 并且问题已修复,
【讨论】:
以上是关于如何在 Flexbox 中禁用等高列?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Bootstrap 4.4、Wordpress 和 Bootstrap Shortcodes Ultimate 插件的 Flexbox 列等高
在Bootstrap3中将一列分成两行时如何获得等高的列[重复]