Search code examples
javascripthtmlcsspure-css

Change column layout on mobile


I have a nav menu that consists of 3 columns each 33% wide. On mobile I want each column to be 100% wide AND rearrange the columns so that the middle column sits above all other columns.

Its much easier to see what I am trying to achieve by viewing the below example. Do you know how I could rearrange the middle column so it sits above all other columns when the screen width is <500px? If there is a css solution that would be great, I believe I could achieve this in Javascript easily I'd just prefer CSS2/CSS3 ideas if its possible.

.col-1 {
  background-color: #eee;
  text-align: center;
}
.col-2 {
  background-color: #ccc;
  text-align: center;
}
.col-3 {
  background-color: #aaa;
  text-align: center;
}
.title {
  text-align: center;
  margin-top: 75px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pure/2.0.3/pure-min.css">
<link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/grids-responsive-min.css">

<p class="title">Desktop Look</p>
<div id="menu" class="pure-g">
  <div class="col-1 pure-u-1-3">
    <div class="pure-menu pure-menu-horizontal custom-can-transform">
        <ul class="pure-menu-list">
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
        </ul>
    </div>
  </div>
  <div class="col-2 pure-u-1-3">
    <div class="pure-menu">
        <a href="#" class="pure-menu-heading custom-brand">Brand</a>
    </div>
  </div>
  <div class="col-3 pure-u-1-3">
    <div class="pure-menu pure-menu-horizontal custom-menu-3 custom-can-transform">
        <ul class="pure-menu-list">
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
        </ul>
    </div>
  </div>
</div>


<p class="title"><i>Desired </i>Mobile Look</p>
<div id="menu" class="pure-g">
  <div class="col-2 pure-u-1">
    <div class="pure-menu">
        <a href="#" class="pure-menu-heading custom-brand">Brand</a>
    </div>
  </div>
  <div class="col-1 pure-u-1">
    <div class="pure-menu pure-menu-horizontal custom-can-transform">
        <ul class="pure-menu-list">
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
        </ul>
    </div>
  </div>
  <div class="col-3 pure-u-1">
    <div class="pure-menu pure-menu-horizontal custom-menu-3 custom-can-transform">
        <ul class="pure-menu-list">
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
            <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
        </ul>
    </div>
  </div>
</div>


Solution

  • You can use order property on flex items depending on device size.

    here I have used order: -1; on .col-2 .

    Browser compatibility

    .col-1 {
      background-color: #eee;
      text-align: center;
    }
    
    .col-2 {
      background-color: #ccc;
      text-align: center;
      order: -1;
    }
    
    .col-3 {
      background-color: #aaa;
      text-align: center;
    }
    
    .title {
      text-align: center;
      margin-top: 75px;
    }
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pure/2.0.3/pure-min.css">
    <link rel="stylesheet" href="https://unpkg.com/purecss@2.0.3/build/grids-responsive-min.css">
    
    <p class="title">Desktop Look</p>
    <div id="menu" class="pure-g">
      <div class="col-1 pure-u-1-3">
        <div class="pure-menu pure-menu-horizontal custom-can-transform">
            <ul class="pure-menu-list">
                <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
                <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
            </ul>
        </div>
      </div>
      <div class="col-2 pure-u-1-3">
        <div class="pure-menu">
            <a href="#" class="pure-menu-heading custom-brand">Brand</a>
        </div>
      </div>
      <div class="col-3 pure-u-1-3">
        <div class="pure-menu pure-menu-horizontal custom-menu-3 custom-can-transform">
            <ul class="pure-menu-list">
                <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
                <li class="pure-menu-item"><a href="#" class="pure-menu-link">Link</a></li>
            </ul>
        </div>
      </div>
    </div>