在前端开发中,我经常会遇到一些自己不知道的事情。 我可能知道要搜索什么 CSS,但我完全不知道如何使用它或正确的语法是什么。 不知何故,在我的脑海中,似乎有一个完全空的档案柜,当我试图查找某样东西时,我只找到了一张几乎无法辨认的便签。
像这样的一个主题(我多少知道但从未真正理解的领域)是如何自动边距和 Flexbox 相互作用的。
例如,看看这个例子
.parent {
display: flex
}
.child {
margin: auto;
}
这又做了什么? 我好像记得可以用它做很多很棒的事情,而本周早些时候,我在读了一篇 Sam Provenza 之前写的一篇很棒的文章后,对它们有了一点印象,文章中展示了 自动边距和 Flexbox 如何协同工作。 但即使读完那篇文章,我还是不太理解这个概念,直到我开始自己制作演示,它才开始变得清晰起来。
在文章中,Sam 描述了 margin: auto
如何影响 Flex 项目:
如果您将自动边距应用于 Flex 项目,该项目将自动扩展其指定的边距,以占用 Flex 容器中的额外空间,具体取决于应用自动边距的方向。
让我们稍微分析一下,假设我们有一个简单的父级 div,其中包含一个子级 div:
<div class="parent">
<div class="child"></div>
</div>
假设我们使用以下 CSS 来为这些 div 样式化:
.parent {
display: flex;
height: 400px;
background-color: #222;
}
.child {
background-color: red;
width: 100px;
height: 100px;
}
结果看起来像这样:
查看 Pen margin-auto: #1 by Robin Rendle (@robinrendle) on CodePen.
当我们像这样向 .child
元素添加 margin-left: auto
时:
.child {
background-color: red;
width: 100px;
height: 100px;
margin-left: auto;
}
……然后我们将看到:
查看 Pen margin-auto: #2 by Robin Rendle (@robinrendle) on CodePen.
很奇怪,对吧? 左边距正在推挤父级,以便子级嵌套在最右边的角落。 但当我们将所有边距设置为 auto
时,它变得更加奇怪:
.child {
background-color: red;
width: 100px;
height: 100px;
margin: auto;
}
查看 Pen margin-auto: #3 by Robin Rendle (@robinrendle) on CodePen.
就像我们正在使用一个 流行的居中技巧,通过将 justify-content
和 align-items
设置为 center
,因为子级决定在父级的中心水平和垂直地休息。 同样,如果我们将 margin-left
和 margin-top
设置为 auto
,那么我们可以让 Flex 项目将自己推入父级的右下角:
查看 Pen margin-auto: #4 by Robin Rendle (@robinrendle) on CodePen.
当 Sam 说,“该项目将自动扩展其指定的边距,以占用 Flex 容器中的额外空间”时,我那空空如也的档案柜大脑的解读方式是这样的:
在 Flex 子级上设置
margin
属性将把子级推离该方向。 将margin-left
设置为auto
,子级将向右推。 将margin-top
设置为auto
,子级将向下推。
在我写下这些之后,现在对我来说听起来是如此明显,几乎是愚蠢的,但有时这就是让一个新概念留在我的大而愚蠢的海绵脑中的方法。
为什么知道这一点很重要? 好吧,我认为在某些情况下,justify-self
或 align-self
可能无法在使用自动边距的布局中让你完全得到想要的结果,从而让你拥有额外的灵活性来微调事物。 我在网上看到的很多演示,包括 Sam 为她的原始文章制作的演示,似乎大部分都是为了在菜单中对齐导航项目。 因此,将菜单中的一个项目推到 Flex 父级的底部或最右边,在这些场景中确实很有用。
无论如何,我认为这个奇怪的技巧很重要,以备不时之需。
我发现这在我想将内容居中在页面上,但也要允许内容比父级更大时非常有用。 我开始尝试写出我的意思,但在这种情况下,我认为一个 CodePen 可能胜过千言万语……
align-items: center
将过高的子级推出了屏幕顶部,而margin: auto
仍然将适合的框居中,但如果子级过大,则允许子级溢出我已经理解了自动边距在 Flexbox 中是如何工作的,但是我从来没有想过如果你设置所有边距为自动会发生什么。
在父级上设置
display: flex
+ 在子级上设置margin: auto
是一种非常快速简便的垂直+水平居中对齐技术。我认为我仍然会使用
display: flex; justify-content: center; align-items: center;
作为我主要的垂直+水平对齐技术,因为它不太可能出错,并且可以全部放在同一个 CSS 声明中。 但是,这种margin: auto
技术是一个有趣的替代方法。我永远不知道该选择哪个 -
margin:auto
还是align/justify:center
。 在经历了一段纯粹快乐的 “align/justify:center
” 阶段后,我最近更频繁地选择margin:auto
。 不知道为什么。 也许是因为写起来更短。直到我完成了出色的 Flexbox Zombies,我才真正掌握 Flexbox。 问我关于我的激光对齐! (虽然如果我发现
align-self
的问题,这是一个很好的补充)自动边距的后面还有一个:如果我们将 Flex 父级的
flex-direction
设置为column
,我们可以对 Flex 子级使用自动边距,而不是align-self
属性的垂直工作,它将在默认情况下执行align-self
属性的工作。 例如:将margin-top
设置为auto
会使项目将自己推到底部。很棒的解释! 我在 Stack Overflow 上见过几次,但我从未完全理解。 很高兴知道有比笨拙地使用
-self
属性更简单的覆盖方法,尤其是在flex-direction
将你转了一圈的情况下。没错,我太喜欢这种粒度控制了。
margin:auto
比item-self
更短,而且是朋友那么只为间隙定义边距呢? 在水平布局中很容易,但对于使用
flex-wrap: wrap
的溢出容器(垂直边距)来说就不容易了。真是个挑逗人的小巧东西,居然错过了。 谢谢您 :D
自动边距在 Flexbox 中并没有奇怪的行为。 它们的行为与它们在块流中行为几乎相同(想想将页面内容推到中心,左、右边距为
auto
……)。 无论如何,规范在这方面做得很好,甚至还提供了一个示例https://www.w3.org/TR/css-flexbox-1/#auto-margins
感谢您提供这个技巧,我一直在努力更好地理解 Flexbox,尤其是像标题、菜单等内容。 这几乎就像居中的简写,我一定会尝试一下!
很棒的文章,现在我更清楚地理解了这个功能。
不过,快速更正一下:你写道(从结尾数起第 4 段)
最后的“顶部”应该是“底部”。