[英]Center and bottom-align flex items
以下是实现此布局的五个选项:
flex: 1
Flexbox flex: 1
应用position: relative
对于 flex 容器。
将position: absolute
应用到绿色 flex 项目。
现在绿色方块绝对位于 flex 容器内。
更具体地说,绿色方块从文档流中移除,但保留在最近定位的祖先的边界内。
使用 CSS 偏移属性top
、 bottom
、 left
和right
来移动绿色方块。
flex-container { display: flex; justify-content: center; align-items: center; flex-wrap: nowrap; position: relative; border: 4px solid blue; height: 300px; width: 300px; } flex-container > flex-item:first-child { display: flex; } flex-container > flex-item:first-child > flex-item { border: 4px solid aqua; height: 50px; width: 50px; margin: 0 5px; } flex-container > flex-item:last-child { position: absolute; bottom: 40px; left: 50%; transform: translateX(-50%); /* fine tune horizontal centering */ border: 4px solid chartreuse; height: 50px; width: 50px; }
<flex-container> <flex-item><!-- also flex container --> <flex-item></flex-item> <flex-item></flex-item> <flex-item></flex-item> </flex-item> <flex-item></flex-item> </flex-container>
一个警告:一些浏览器可能不会从正常流程中完全删除绝对定位的弹性项目。 这以一种非标准的、意想不到的方式改变了对齐方式。 更多细节:绝对定位的弹性项目不会从 Firefox 和 IE11 的正常流程中删除
通过结合auto
边距和一个新的、不可见的弹性项目,可以实现布局。
新的 flex item 与底部 item 相同,并放置在另一端(顶部)。
更具体地说,因为 flex 对齐是基于自由空间的分布,新项目是保持三个蓝色框垂直居中的必要平衡。 新项目必须与现有绿色项目的高度相同,否则蓝色框将不会精确居中。
新项目从视图中移除, visibility: hidden
。
简而言之:
auto
margins 保持蓝色框居中,两个绿色框从两端创建相等的平衡。visibility: hidden
到重复的绿色框。 flex-container { display: flex; flex-direction: column; align-items: center; border: 4px solid blue; height: 300px; width: 300px; } flex-container > flex-item:first-child { margin-top: auto; visibility: hidden; } flex-container > flex-item:nth-child(2) { margin-top: auto; display: flex; } flex-container > flex-item:last-child { margin-top: auto; margin-bottom: auto; } flex-container > flex-item:first-child, flex-container > flex-item:last-child { border: 4px solid chartreuse; height: 50px; width: 50px; } flex-container > flex-item:nth-child(2) > flex-item { border: 4px solid aqua; height: 50px; width: 50px; margin: 0 5px; }
<flex-container> <flex-item></flex-item> <flex-item><!-- also flex container --> <flex-item></flex-item> <flex-item></flex-item> <flex-item></flex-item> </flex-item> <flex-item></flex-item> </flex-container>
这种方法与#2 类似,但它在语义上更清晰,并且必须知道绿色框的高度。
::before
将其放在容器的开头。auto
margins 保持蓝色框居中,绿色伪元素和 DOM 元素从两端创建相等的平衡。 flex-container { display: flex; flex-direction: column; align-items: center; border: 4px solid blue; height: 300px; width: 300px; } flex-container::before { content: ""; margin-top: auto; height: calc(50px + 8px); /* height + borders */ visibility: hidden; } flex-container > flex-item:first-child { margin-top: auto; display: flex; } flex-container > flex-item:last-child { margin-top: auto; margin-bottom: auto; border: 4px solid chartreuse; height: 50px; width: 50px; } flex-container > flex-item:first-child > flex-item { border: 4px solid aqua; height: 50px; width: 50px; margin: 0 5px; }
<flex-container> <flex-item><!-- also flex container --> <flex-item></flex-item> <flex-item></flex-item> <flex-item></flex-item> </flex-item> <flex-item></flex-item> </flex-container>
flex: 1
添加到顶部和底部项目从上面的方法 #2 或 #3 开始,不要担心顶部和底部项目的高度相等以保持平衡,只需给每个项目flex: 1
。 这将迫使它们都消耗可用空间,从而使中间项目居中。
然后,您可以将display: flex
添加到底部项目以对齐内容。
这可能是最干净、最有效的方法。 不需要绝对定位、虚假元素或其他黑客。
只需创建一个包含三行的网格。 然后将第二行和第三行中的项目居中对齐。 第一行可以保持为空。
grid-container { display: grid; grid-template-rows: repeat(3, 1fr); align-items: center; justify-items: center; border: 4px solid blue; height: 300px; width: 300px; } grid-item:nth-child(2) { display: flex; } grid-item:nth-child(2)>flex-item { width: 50px; height: 50px; margin: 0 5px; border: 4px solid aqua; } grid-item:nth-child(3) { border: 4px solid chartreuse; height: 50px; width: 50px; }
<grid-container> <grid-item></grid-item> <grid-item><!-- also flex container --> <flex-item></flex-item> <flex-item></flex-item> <flex-item></flex-item> </grid-item> <grid-item></grid-item> </grid-container>
让带有position: relative
的容器和带有position:absolute;
的绿色方块position:absolute;
body { margin: 0; } #container { display: flex; justify-content: center; align-items: center; flex-wrap: nowrap; width: 192px; height: 192px; border: 4px solid indigo; position: relative; background: lavender; } .blue { margin: 10px; width: 30px; height: 30px; outline: 4px solid skyblue; background: honeydew; } #green { position: absolute; width: 30px; height: 30px; left: 0; right: 0; margin: auto; bottom: 20px; outline: 4px solid yellowgreen; background: greenyellow; }
<div id=container> <div class=blue></div><div class=blue></div><div class=blue></div> <div id=green></div> </div>
您可以使用伪指令将前三个容器向下移动一行,然后将margin:auto
到最后一个
div { display:flex; flex-wrap:wrap; border:#0066FD solid;; width:200px; height:200px; justify-content:space-around; /* show me box center */ background:linear-gradient(to top,rgba(0,0,0,0.2) 50%, transparent 50%),linear-gradient(to left,rgba(0,0,0,0.2) 50%, transparent 50%) } span, div:before { width:50px; height:50px; border:solid #01CDFF; margin:0 auto 0; } span:last-of-type , div:before{ margin: 12px auto; border:solid #01FE43; } div:before { content:''; width:100%; border:none; } span { /* show me box center */ background:linear-gradient(45deg,rgba(0,0,0,0.1) 50%, transparent 50%),linear-gradient(-45deg,rgba(0,0,0,0.1) 50%, transparent 50%) }
<div> <span></span> <span></span> <span></span> <span></span> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.