将 flexbox 网格转换为具有不同顺序的堆叠

Posted

技术标签:

【中文标题】将 flexbox 网格转换为具有不同顺序的堆叠【英文标题】:Convert a flexbox grid to stacked with different order 【发布时间】:2018-03-13 14:39:00 【问题描述】:

我需要实现以下响应式布局:

这是我的桌面设备代码:

.container 
  background-color: red;
  display: flex;


.sidebar-wrapper 
  @media only screen and (min-width: 600px) 
    width: 264px;
    padding-right: 30px;
  


.sidebar-header 
  padding: 20px;
  background-color: #1CA4FC;


.sidebar-footer 
  padding: 20px;
  background-color: #65D643;


.site-content 
  padding: 20px;
  background-color: #F7B92B;
  width: calc(100%);
<div class="container">
  <div class="sidebar-wrapper">
    <div class="sidebar-header">
      Sidebar Header
    </div>
    <div class="sidebar-footer">
      Sidebar Footer
    </div>
  </div>
  <div class="site-content">
    Site Content
  </div>
</div>

如何为 flexbox 排序如上图所示的移动设备创建流畅的布局?

【问题讨论】:

你不能不使用 JS 克隆/移动站点内容。这三个部分需要是兄弟,然后您可以通过order 更改顺序。不过,你可以用浮点数更好地解决这个问题。页眉和页脚向左浮动,内容向右浮动。不过,仍然需要有相同的父级。 请注意,如果有一天display:contents 无处不在,这些结构将不再是麻烦制造者。 (在 Firefox 中测试:codepen.io/gc-nomade/pen/borJaY)。还有可以和flex模型切换的grid模型。 codepen.io/gc-nomade/pen/yzorEQ (sidebar-wrapper 就不再需要了。 【参考方案1】:

鉴于div 结构,我会这样做:

.container 
  background-color: red;
  display: flex;
  flex-direction: column;


.sidebar-header 
  padding: 20px;
  background-color: #1ca4fc;


.sidebar-footer 
  padding: 20px;
  background-color: #65d643;


.site-content-mobile 
  padding: 20px;
  background-color: #f7b92b;


.site-content 
  display: none;


@media (min-width: 787px) 
  .container 
    flex-direction: row;
  
  .site-content-mobile 
    display: none;
  
  .site-content 
    display: block;
    width: calc(100%);
    padding: 20px;
    background-color: #f7b92b;
  
<div class="container">
  <div class="sidebar-wrapper">
    <div class="sidebar-header">
      Sidebar Header
    </div>
    <div class="site-content-mobile">
      Site Content
    </div>
    <div class="sidebar-footer">
      Sidebar Footer
    </div>
  </div>
  <div class="site-content">
    Site Content
  </div>
</div>

【讨论】:

谢谢 :) 你太棒了。这正是我正在寻找的!干杯!! 没问题 :) 我很高兴它有帮助。【参考方案2】:

您可以在flexgrid 之间切换,避免使用额外的.sidebar-wrapper

.container 
  background-color: red;
  display: flex;
  flex-direction: column;


@media only screen and (min-width: 600px) 
  .sidebar-wrapper 
    display: block;
    width: 264px;
  
  .container 
    display: grid;
    grid-template-columns: 264px 1fr;
  


.sidebar-header 
  padding: 20px;
  background-color: #1ca4fc;


.sidebar-footer 
  padding: 20px;
  order: 2;
  background-color: #65d643;


.site-content 
  padding: 20px;
  background-color: #f7b92b;
  flex: 1;
  order: 1;
  grid-row: auto / span 2
<div class="container">
  <div class="sidebar-header">
    Sidebar Header
  </div>
  <div class="sidebar-footer">
    Sidebar Footer
  </div>
  <div class="site-content">
    Site Content
  </div>
</div>

https://codepen.io/gc-nomade/pen/yzorEQ


如果不修改结构,display:contents; 会很有用(此时,Firefox 理解它 - 使用 FF 来测试预期的结果:()。

这些元素本身不会产生特定的框。它们被它们的伪盒子和它们的子盒子取代。

.container 
  background-color: red;
  display: flex;
  flex-direction: column;


.sidebar-wrapper 
  display: contents;
  width: 264px;


@media only screen and (min-width: 650px) 
  .sidebar-wrapper 
    display: block;
    width: 264px;
  
  .container 
    flex-direction: row;
  


.sidebar-header 
  padding: 20px;
  background-color: #1ca4fc;
  order: 2;


.sidebar-footer 
  padding: 20px;
  background-color: #65d643;


.site-content 
  padding: 20px;
  background-color: #f7b92b;
  flex: 1;
  order: 1;
<div class="container">
  <div class="sidebar-wrapper">
    <div class="sidebar-header">
      Sidebar Header
    </div>
    <div class="sidebar-footer">
      Sidebar Footer
    </div>
  </div>
  <div class="site-content">
    Site Content
  </div>
</div>

https://codepen.io/gc-nomade/pen/borJaY


注意:媒体查询通常是包装选择器集,而不是嵌套在选择器本身中。

【讨论】:

第一个解决方案看起来更简洁,并且我认为受到浏览器的广泛支持。但是,Site HeaderSite Footer div 的排列顺序相反。 @TaherJodhpurwala 哦,是的,订单规则放错了位置。我也会选择第一个,可能会使用页眉/页脚和主标签。 display-box contents 看起来很方便,希望有一天能得到广泛的支持。

以上是关于将 flexbox 网格转换为具有不同顺序的堆叠的主要内容,如果未能解决你的问题,请参考以下文章

Flexbox在垂直堆叠的盒子上保持相等的高度[重复]

html 将flexbox强制转换为网格

Flexboxes:堆叠、居中、环绕,具有颜色匹配的边和动态、同步的宽度(参见示例)

如何使 flexbox 响应式?

scss 传统的sass网格系统没有flexbox,但也没有使用浮动。为具有IE9支持的项目创建。

使用 flexbox CSS 的左列和堆叠的右列 [重复]