Search code examples
htmlcssflexboxresponsive

How to change the flex order when wrapping?


I would like to achieve something that renders like this, depending on the screen size:

+---------------------------+
|  A  |       B       |  C  |
+---------------------------+

+---------------+
|   A   |   C   |
|       B       |
+---------------+

If all size are fixed, I can manage using the flex order property but the size of my C container is not fixed and so I can't use a static media query.

Is there a way to achieve this?

Edit: I managed a good enough approximation: In a media query selecting all screens that might need wrapping, I change the order of the B container to something big, and at the same time, I set its min-width to 100% which forces the wrap.


Solution

  • You can make b element full width with flex: 0 0 100% and change order to order: 2 with media queries DEMO

    * {
      box-sizing: border-box;
    }
    body, html {
      margin: 0;
      padding: 0;
    }
    .content {
      display: flex;
      flex-wrap: wrap;
    }
    .b {
      background: lightblue;
    }
    .a, .b, .c {
      border: 1px solid black;
      flex: 1;
      padding: 10px;
    }
    @media(max-width: 768px) {
      .b {
        flex: 0 0 100%;
        order: 2;
      }
    }
    <div class="content">
      <div class="a">A</div>
      <div class="b">B</div>
      <div class="c">C</div>
    </div>