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

在较小屏幕上的其他元素之间移动侧边栏

  •  2
  • ultraloveninja  · 技术社区  · 7 年前

    我不确定这是否可行,但我想我会问的。

    我想知道当一个边栏碰到断点时,它是否会在一些内容之间移动。

    举个例子:

    +---------------------+ +-------------+
    |                     | |             |
    |    Top Content      | |             |
    |                     | |  Sidebar    |
    |                     | |             |
    +---------------------+ |             |
    +---------------------+ |             |
    |                     | |             |
    |                     | |             |
    |                     | |             |
    |     Other           | |             |
    |     Content         | |             |
    |                     | |             |
    |                     | |             |
    |                     | |             |
    |                     | |             |
    |                     | |             |
    |                     | |             |
    +---------------------+ +-------------+
    

    对此:

      +-------------------------+
      |                         |
      |        Top Content      |
      |                         |
      +-------------------------+
      +-------------------------+
      |                         |
      |                         |
      |     Sidebar             |
      |                         |
      |                         |
      |                         |
      +-------------------------+
      +-------------------------+
      |                         |
      |                         |
      |                         |
      |                         |
      |       Other             |
      |       Content           |
      |                         |
      |                         |
      |                         |
      |                         |
      +-------------------------+
    

    所以我知道我可以设置命令,但我不太确定如何正确设置“流”。

    我在想这样的事情:

    .flex-container {
      display: flex;
      flex-direction: row;
    }
    
    .top-content {
      order: 1;
    }
    
    .sidebar {
      order: 3;
      justify-self: flex-end;
    }
    
    .other-content {
      order: 2;
    }
    
    @media screen and (max-width: 767px) {
      .flex-container {
        flex-direction: column;
      }
      .sidebar {
        order: 2;
      }
      .other-content {
        order: 3;
      }
    }
    <div class="flex-container">
      <div class="top-content">
        ...
      </div>
      <div class="sidebar">
        ...
      </div>
      <div class="other-content">
        ...
      </div>
    </div>

    2 回复  |  直到 7 年前
        1
  •  1
  •   Michael Benjamin William Falcon    7 年前

    使用CSS网格更简单、更容易。

    .grid-container {
      display: grid;
      grid-template-columns: 1fr 1fr;
      grid-template-rows: 1fr 3fr;
      grid-gap: .5em;
      height: 100vh;
      background-color: gray;
    }
    
    .top-content {
      grid-column: 1;
      background-color: orangered;
      border: 1px dashed black;
    }
    
    .sidebar {
      grid-column: 2;
      grid-row: 1 / -1;
      background-color: aqua;
      border: 1px solid black;
    }
    
    .other-content {
      grid-column: 1;
      background-color: lightgreen;
      border: 1px dashed black;
    }
    
    body {
      margin: 0;
    }
    
    @media (max-width: 500px) {
      .grid-container {
        grid-template-columns: 1fr;
        grid-template-rows: auto;
      }
      .sidebar {
        grid-column: 1;
        grid-row: 2;
      }
    }
    <div class="grid-container">
      <div class="top-content">top content</div>
      <div class="sidebar">sidebar</div>
      <div class="other-content">other content</div>
    </div>

    jsFiddle demo

        2
  •  0
  •   z3nth10n    7 年前

    好吧,我想好了如何做到这一点,看:

            .flex-container {
              display:flex;
              flex-flow: row wrap;
              box-sizing: border-box;
            }
    
        
        @media screen and (max-width: 600px) {
          break {display:none;}
        
        }
        
        div {
          border: 1px black solid;
          
        }
        
        .flex-container > div {
          box-sizing: border-box;
        }
        
    .flex-container > div, break{ 
      display: inline-block; 
    }
        
    break{
      flex-basis: 100%;
      width: 0px; 
      height: 0px; 
      overflow: hidden;
    }
         <div class="flex-container">
          <div class="top-content" style="width: 350px; height: 500px;">
            ...
          </div>
          <div class="sidebar" style="width: 350px; height: 500px;">
            ...
          </div>
          <break></break>
          <div class="other-content" style="width: 350px; height: 500px;">
            ...
          </div>
        </div>

    我做的唯一一件事就是创建一个名为 <break> . 此标记在指定的div之间创建新行。因此,如果您的媒体查询达到(由于较低的分辨率),您只需要隐藏它。

    https://codepen.io/hrgdavor/pen/waXEqz

    编辑:

    this ,我创建了这个演示:

    .flex-container {
      display:flex;
      flex-flow: row wrap;
      box-sizing: border-box;
      flex-direction: column;
      flex-wrap: wrap;
      height: 1000px;
    }
     
     @media screen and (min-width: 600px) {
      .top-content, .other-content {flex: 0 0 50%;}
      .sidebar {flex: 0 0 100%; order: 1;}
     }
      
     @media screen and (max-width: 600px) {
       .flex-container {flex-direction: row;}
       .top-content, .other-content, .sidebar {flex: 0 0 100%;}
       .other-content {order:2;}
     }
     
     .flex-container > div {
      box-sizing: border-box;
     }
    
     /* Only for doing example */
    .flex-container > div {
      border: 1px black solid;
    }
         <div class="flex-container">
          <div class="top-content">
            ...
          </div>
          
          <div class="sidebar">
            ...
          </div>
          
          <div class="other-content">
            ...
          </div>
        </div>

    注: box-sizing: border-box; 这很重要。

    推荐文章