html - 转换为一列布局时元素顺序不同的两列布局
问题描述
我正在尝试两个创建一个两列布局,如下所示:
在较小的屏幕上会变成这样的单列布局:
它的棘手之处在于元素的顺序 - 我希望 A 和 B 在左右列中分别排在第一位,而在单列布局中分别排在第一位和第二位。
我已经设法使用以下代码通过 flex 布局获得了这样的结果:
<html>
<style>
body {
margin: 0;
padding: 0;
}
.break {
flex-basis: 100%;
order: 0;
height: 0;
width: 0;
}
#wrapper {
display: flex;
flex-direction: column;
flex-wrap: wrap;
height: 100%;
}
.block-wrapper {
width: 50%;
}
.block-wrapper h1, .block-wrapper p {
padding: 10px;
}
#a {
order: -1;
background-color: magenta;
}
#b {
order: 1;
background-color: red;
}
#c {
order: -1;
background-color: yellow;
}
#d {
order: 1;
background-color: orange;
}
@media screen and (max-width: 600px) {
.block-wrapper {
width: 100%;
}
#a, #b, #c, #d {
order: 0;
}
.break {
display: none;
}
}
</style>
<body>
<div id="wrapper">
<div id="a" class="block-wrapper">
<h1>A</h1>
</div>
<div id="b" class="block-wrapper">
<h1>B</h1>
<p>lorem ipsum dolor</p>
<p>amet</p>
</div>
<div class="break"></div>
<div id="c" class="block-wrapper">
<h1>C</h1>
<p>lorem </p>
<p>ipsum</p>
<p>dolor</p>
</div>
<div id="d" class="block-wrapper">
<h1>D</h1>
</div>
</div>
</body>
</html>
(由于某种原因,当我将其作为代码片段放置时它不起作用,但它在另存为 HTML 文件并打开时就像在屏幕截图上一样工作)
这种方法的问题是它需要#wrapper
设置高度,并且当元素无法适应高度时会中断(元素落在屏幕外)。这对我的情况不起作用,因为项目的内容将是动态的并且可能会变得很长(包含此布局的整个页面应该有一个垂直滚动条)。
是否有可能仅使用 CSS 获得这样的结果?你有什么想法?
解决方案
更新:我最初的回答声称这不能单独使用 CSS 来完成。虽然这适用于一般的“砌体”情况,但在问题中最多只有两列的情况下,可以使用浮点数来完成。
这是使用未更改问题中的 HTML 的片段。您将需要一个 clear:both (如果需要在下一个内容之前清除两列)。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.wrapper {
width: 80%;
/* set for this test - obviously set to what is required */
}
.wrapper:nth-child(1) div:nth-child(n) {
width: 50%;
}
.wrapper:nth-child(1) div:nth-child(odd) {
float: left;
}
.wrapper:nth-child(1) div:nth-child(even) {
float: right;
}
.a {
background-color: magenta;
}
.b {
background-color: red;
}
.c {
background-color: yellow;
}
.d {
background-color: orange;
}
@media screen and (max-width: 600px) {
.wrapper {
width: 100%;
}
.wrapper:nth-child(1) div:nth-child(n) {
width: 100%;
}
.wrapper:nth-child(1) div:nth-child(odd) {
float: left;
}
.wrapper:nth-child(1) div:nth-child(even) {
float: left;
}
}
<div class="wrapper">
<div class="a">
<h1>A</h1>
</div>
<div class="b">
<h1>B</h1>
<p>lorem ipsum dolor</p>
<p>amet</p>
</div>
<div class="c">
<h1>C</h1>
<p>lorem </p>
<p>ipsum</p>
<p>dolor</p>
</div>
<div class="d">
<h1>D</h1>
</div>
</div>
有一个 CSS 网格的扩展,masonry,它可以处理超过 2 列。Firefox 有这个内置的,但你需要layout.css.grid-template-masonry-value.enabled
在 about:config 的高级首选项中进行设置。请参阅MDN以及从那里指向Smashing Magazine中有关此功能的有用描述的链接
推荐阅读
- java - JAVA中相同变量的一元增量运算符的奇怪表达式评估顺序
- node.js - 我如何检查从角度传递到服务器的数据到 node.js
- javascript - 如果长度大于 Jquery 隐藏 Div 元素
- python-3.x - pytorch中使用cnn的二元分类模型
- javascript - 如何遍历包含键和值的数组以在 ReactJS 中发送对 Axios.get 参数的请求?
- javascript - 在使用 JS 的特定行数后显示“阅读更多”按钮
- python - scp 来自 Debian 中 Python 的目录
- django - 如何使用 Django Rest Framework 在同一函数中传递两个查询集
- eclipse - 空项目上的 Eclipse web.xml 中的错误
- javascript - 注销后停用服务人员