响应式 CSS:到达媒体查询断点后将中间 div 行移动到单独的列

Posted

技术标签:

【中文标题】响应式 CSS:到达媒体查询断点后将中间 div 行移动到单独的列【英文标题】:Responsive CSS: shift middle div rows to a separate column after reaching media query break point 【发布时间】:2021-07-12 22:38:20 【问题描述】:

我正在使用 CSS 媒体查询来创建响应式布局。

在我当前的 html 布局中,我使用 flexbox 来对齐 div 行:

<div id="page">
  <div id="div-1">DIV 1</div>
  <div id="div-2">DIV 2</div>
  <div id="div-3">DIV 3</div>
  <div id="div-4">DIV 4</div>
</div>

和 CSS:

#page 
  display: flex;
  flex-direction: column;
  align-items: center;


[id^="div-"] 
  border: 1px solid #ccc;
  margin-bottom: 10px;
  width: 50vw;


#div-1 
  height: 50px;


#div-2 
  height: 70px;


#div-3 
  height: 150px;


#div-4 
  height: 100px;

这里是 Jsfiddle 供您修改。

这是我对较小视口的追求,但想在下一个媒体查询断点上进行切换,以使 2 个中间 div 转移到右侧的单独列,如下所示:

我如何做到这一点?对我来说如何将最后几行 div 移动到另一列是很明显的,但不确定如何处理中间行...

有没有办法通过使用 flexbox 或网格来做到这一点?

【问题讨论】:

【参考方案1】:

另一种可能的解决方案是将 order-property 与 Flexbox 结合使用(缺点:您需要一点额外的 html 并设置 #page 容器的高度;优点:灵活的 div 高度和间隙大小):

#page 
  display: flex;
  flex-direction: column;
  align-items: center;


[id^="div-"] 
  border: 1px solid #ccc;
  margin-bottom: 10px;
  width: 50vw;


#div-1 
  height: 50px;
  background: lightgreen;


#div-2 
  height: 70px;
  background: lightyellow;


#div-3 
  height: 150px;
  background: lightcoral;


#div-4 
  height: 100px;
  background: lightblue;


@media (max-width: 1000px) 
  #page 
    flex-wrap: wrap;
    height: 300px;
  
  #small-screen-spacer 
    order: 3;
    align-self: stretch;
    flex: 1 0 100%;
    margin-right: 10px;
  
  #div-1 
    order: 1;
  
  #div-2 
    order: 4;
  
  #div-3 
    order: 5;
  
  #div-4 
    order: 2;
  
<div id="page">
  <div id="div-1">DIV 1</div>
  <div id="div-2">DIV 2</div>
  <div id="div-3">DIV 3</div>
  <div id="div-4">DIV 4</div>
  <div id="small-screen-spacer"> </div>
</div>

#small-screen-spacer 将填充整个可用的垂直空间,以便将所有位于分隔符之后的元素(由 order 属性定义)移动到第二列。此外,您可以通过将垫片上的 margin-right 设置为您想要的值来设置两列之间的所需间隙。

Fiddle

【讨论】:

这看起来像我所追求的,额外的 html 不是问题。有没有办法让#page 的高度不固定,或者可能是最小高度最大高度之类的?我想我也可以使用 vh 等单位,而不是 px @Acidon 我很高兴听到这个消息。使用两列布局的具体条件是什么? 媒体查询中的 #page height: 100vh; (或任何你想要的 vh)也应该可以工作。

以上是关于响应式 CSS:到达媒体查询断点后将中间 div 行移动到单独的列的主要内容,如果未能解决你的问题,请参考以下文章

CSS Float 内容创建空白并重叠其他 div

响应式布局简明示例

媒体查询不起作用?

融合响应式设计的知识点

iPhone 6 和 6 Plus 响应式断点 [重复]

如何创建响应式电子邮件模板?