【发布时间】:2020-09-28 08:03:39
【问题描述】:
我希望实现一个复杂的布局(参见下面的图 1-4),其中包含三个主要元素:标题、侧边元素和标签。标题应该跨越整个宽度,侧元素应该浮动到右侧并跨越容器的整个高度,然后标签(可能有很多)应该包裹在标题下。
___________________________ ____
| | | |
| lorem ipsum dolor ... | | |
|___________________________| | |
______ _______ ______ | XX |
| | | | | | | |
| ab | | cde | | fg | | |
|______| |_______| |______| |____|
先决条件:
-
.title应尽可能宽 -
.side和.tag的宽度应与其内容一样宽,尽可能窄。 - 任何元素的大小都是未知的,因此我不能使用固定的宽度或百分比(显然 100% 除外)。
- 该解决方案应适用于任何容器宽度。
-
.side和.tag是可选的,因此如果缺少它们,解决方案应该可以工作。 - 所有元素都是兄弟元素,这意味着 例如,我不能将所有
.tag包装在div中。 -
.side元素在源代码中始终位于最后,因此下面的order属性。
请查看我要介绍的用例:
- Figure 1: Title, side element, and a few tags
- Figure 2: Title, side element, and more tags
- Figure 3: Only title and a couple of tags
- Figure 4: Only title and the side element
.container {
display: flex;
flex-flow: row wrap;
width: 100%;
}
.title {
order: 1;
flex-grow: 1;
flex-basis: 100%;
}
.side, .tag {
flex-grow: 0;
flex-basis: auto;
}
.side {
order: 2;
}
.tag {
order: 3;
}
/* sample styling - ignore */
.container { width: 100%; }
.title, .tag, .side { padding: 30px; margin: 5px; color: white; font-family: Arial; font-size: 24px; }
.title { background: coral; }
.tag { background: cornflowerblue; }
.side { background: mediumseagreen; }
<h2>Case 1</h2>
<div class='container'>
<div class='title'>
Lorem ipsum dolor sit amet...
</div>
<div class='tag'>abc</div>
<div class='tag'>def</div>
<div class='tag'>ghi</div>
<div class='side'>XX</div>
</div>
<h2>Case 2</h2>
<div class='container'>
<div class='title'>
Lorem ipsum dolor sit amet...
</div>
<div class='tag'>abc</div>
<div class='tag'>def</div>
<div class='tag'>ghi</div>
<div class='tag'>jkl</div>
<div class='tag'>mno</div>
<div class='tag'>pqr</div>
<div class='side'>XX</div>
</div>
<h2>Case 3</h2>
<div class='container'>
<div class='title'>
Lorem ipsum dolor sit amet...
</div>
<div class='tag'>abc</div>
<div class='tag'>def</div>
</div>
<h2>Case 4</h2>
<div class='container'>
<div class='title'>
Lorem ipsum dolor sit amet...
</div>
<div class='side'>XX</div>
</div>
我的问题
实现这种复杂的灵活布局的最佳方式是什么?我可以使用 flexbox 来使上述所有用例都能正常工作,还是应该更多地研究网格?
谢谢!
【问题讨论】:
标签: html css layout flexbox css-grid