代码之家  ›  专栏  ›  技术社区  ›  TomR

嵌套的flexbox(在两个维度中)

  •  0
  • TomR  · 技术社区  · 6 年前

    我试图理解嵌套的flexbox的用法。有一篇关于flexbox的好文章 https://css-tricks.com/snippets/css/a-guide-to-flexbox/ . 它将flexbox的属性分为父组和项组。我是否理解正确:如果我有3个嵌套的flexbox,那么中间的flexbox同时扮演项目的角色和父项目的角色,因此它的css属性应该包括flexbox的父属性和项目属性?

    我有密码 https://jsfiddle.net/tomrhodes/szmt7pL8/ 在这篇文章中,我试图将这一理论应用于实践:

    <div>
      <div class="container">
        <div class="row2">HEADER</div>
        <div class="container">
          <div class="row2">header</div>
          <div class="container">content</div>
          <div class="row2">footer</div>
        </div>
        <div class="row2">FOOTER</div>
      </div>
    </div>
    

    和CSS:

    html,
    body {
      height: 100%;
      margin: 0;
      border: solid magenta;
    }
    
    .row2 {
      background: #f8f9fa;
      margin-top: 20px;
      flex: 0 1 auto;
      -webkit-flex: 0 1 auto;
    }
    
    .container {
      flex: 1 1 auto;
      display: flex;
      display: -webkit-flex;
      flex-flow: column;
      -webkit-flex-flow: column;
      height: auto;
      border: solid blue;
    }
    

    我想得到具有两个特性的解决方案:

    • 外部flexbox(容器)应填满可用屏幕的整个空间。目前它是有界的;
    • 最内侧的flexbox(带 内容 文本)应该是屏幕的两个维度中的灵活区域-如果屏幕变宽或变长,则此内容应该展开,而在相反的情况下,它应该收缩。它应该是目前屏幕上唯一的灵活性。

    我的窝怎么了?

    1 回复  |  直到 6 年前
        1
  •  0
  •   TomR    6 年前

    似乎不可能在框角色中使用一个DIV作为嵌套的flexbox-作为外部flexbox的项,作为内部内容的父级。应该引入另一个DIV。解决方案如下: https://jsfiddle.net/tomrhodes/8pf1q706/

    <div class="outsidebox">
      <div class="box">
        <div class="headerstyle">header</div>
        <div class="contentstyle">
          <div class="outsidebox">
            <div class="headerstyle">header 2</div>
            <div class="contentstyle">content 2</div>
            <div class="footerstyle">footer 2</div>
          </div>
        </div>
        <div class="footerstyle">footer</div>
      </div>
    </div>
    

    CSS是:

    html,
    body {
      height: 100%;
      margin: 0;
      border: solid magenta;
    }
    
    .row2 {
      background: #f8f9fa;
      margin-top: 20px;
      flex: 0 1 auto;
      -webkit-flex: 0 1 auto;
    }
    
    .container {
      display: flex;
      display: -webkit-flex;
      flex-flow: column;
      -webkit-flex-flow: column;
      height: 100%;
      border: solid blue;
    }
    
    .box {
      display: flex;
      flex-flow: column;
      height: 100%;
      border: solid blue;
    }
    
    .outsidebox {
      display: flex;
      flex-flow: column;
      height: 100%;
      border: solid purple;
    }
    
    .headerstyle {
      flex: 0 1 auto;
      border: solid green;
    }
    
    .contentstyle {
      flex: 1 1 auto;
      border: solid green;
    }
    
    .footerstyle {
      flex: 0 1 40px;
      border: solid green;
    }