Flexbox: 4 items per row

前端 未结 9 1072
南笙
南笙 2020-11-22 13:01

I\'m using a flex box to display 8 items that will dynamically resize with my page. How do I force it to split the items into two rows? (4 per row)?

Here is a releva

相关标签:
9条回答
  • 2020-11-22 13:10

    I believe this example is more barebones and easier to understand then @dowomenfart.

    .child {
        display: inline-block;
        margin: 0 1em;
        flex-grow: 1;
        width: calc(25% - 2em);
    }
    

    This accomplishes the same width calculations while cutting straight to the meat. The math is way easier and em is the new standard due to its scalability and mobile-friendliness.

    0 讨论(0)
  • 2020-11-22 13:13

    .parent-wrapper {
    	height: 100%;
    	width: 100%;
    	border: 1px solid black;
    }
    	.parent {
    	display: flex;
    	font-size: 0;
    	flex-wrap: wrap;
    	margin-right: -10px;
    	margin-bottom: -10px;
    }
    	.child {
    	background: blue;
    	height: 100px;
    	flex-grow: 1;
    	flex-shrink: 0;
    	flex-basis: calc(25% - 10px);
    }
    	.child:nth-child(even) {
    	margin: 0 10px 10px 10px;
    	background-color: lime;
    }
    	.child:nth-child(odd) {
    	background-color: orange; 
    }
    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>Document</title>
    	<style type="text/css">
    
    	</style>
    </head>
    <body>
      <div class="parent-wrapper">
        <div class="parent">
          <div class="child"></div>
          <div class="child"></div>
          <div class="child"></div>
          <div class="child"></div>
          <div class="child"></div>
          <div class="child"></div>
          <div class="child"></div>
          <div class="child"></div>
        </div>
      </div>
    </body>
    </html>

    ;)

    0 讨论(0)
  • 2020-11-22 13:16

    Hope it helps. for more detail you can follow this Link

    .parent{ 
      display: flex; 
      flex-wrap: wrap; 
    }
    
    .parent .child{ 
      flex: 1 1 25%;
      /*Start Run Code Snippet output CSS*/
      padding: 5px; 
      box-sizing: border-box;
      text-align: center;
      border: 1px solid #000;
      /*End Run Code Snippet output CSS*/
    }
    <div class="parent">
      <div class="child">1</div>
      <div class="child">2</div>
      <div class="child">3</div>
      <div class="child">4</div>
      <div class="child">5</div>
      <div class="child">6</div>
      <div class="child">7</div>
      <div class="child">8</div>
    </div>

    0 讨论(0)
  • 2020-11-22 13:19

    Here is another apporach.

    You can accomplish it in this way too:

    .parent{
      display: flex;
      flex-wrap: wrap;
    }
    
    .child{
      width: 25%;
      box-sizing: border-box;
    }
    

    Sample: https://codepen.io/capynet/pen/WOPBBm

    And a more complete sample: https://codepen.io/capynet/pen/JyYaba

    0 讨论(0)
  • 2020-11-22 13:19

    Here's another way without using calc().

    // 4 PER ROW
    // 100 divided by 4 is 25. Let's use 21% for width, and the remainder 4% for left & right margins...
    .child {
      margin: 0 2% 0 2%;
      width: 21%;
    }
    
    // 3 PER ROW
    // 100 divided by 3 is 33.3333... Let's use 30% for width, and remaining 3.3333% for sides (hint: 3.3333 / 2 = 1.66666)
    .child {
      margin: 0 1.66666% 0 1.66666%;
      width: 30%;
    }
    
    // and so on!
    

    That's all there is to it. You can get fancy with the dimensions to get a more aesthetic sizes but this is the idea.

    0 讨论(0)
  • 2020-11-22 13:23

    You've got flex-wrap: wrap on the container. That's good, because it overrides the default value, which is nowrap (source). This is the reason items don't wrap to form a grid in some cases.

    In this case, the main problem is flex-grow: 1 on the flex items.

    The flex-grow property doesn't actually size flex items. Its task is to distribute free space in the container (source). So no matter how small the screen size, each item will receive a proportional part of the free space on the line.

    More specifically, there are eight flex items in your container. With flex-grow: 1, each one receives 1/8 of the free space on the line. Since there's no content in your items, they can shrink to zero width and will never wrap.

    The solution is to define a width on the items. Try this:

    .parent {
      display: flex;
      flex-wrap: wrap;
    }
    
    .child {
      flex: 1 0 21%; /* explanation below */
      margin: 5px;
      height: 100px;
      background-color: blue;
    }
    <div class="parent">
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
    </div>

    With flex-grow: 1 defined in the flex shorthand, there's no need for flex-basis to be 25%, which would actually result in three items per row due to the margins.

    Since flex-grow will consume free space on the row, flex-basis only needs to be large enough to enforce a wrap. In this case, with flex-basis: 21%, there's plenty of space for the margins, but never enough space for a fifth item.

    0 讨论(0)
提交回复
热议问题