CSS grid with columns of unequal height and width

若如初见. 提交于 2019-12-22 09:54:37

问题


I have 5 boxes: three on the first row, the next two on the second row:

I want all the boxes but the second to be of equal height and the 5th box to go right under the 3th.

I tried this with flexbox and I am now trying it with display: grid. I am looking for a CSS only solution, if possible.

.grid-container {
  display: grid;
  grid-template-columns: auto auto auto;
  grid-auto-rows: min-content;
  grid-gap: 0;
  background-color: #2196F3;
}
.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  border: 1px solid #ccc;
  font-size: 30px;
}
.item4 {
  grid-column-start: 1;
  grid-column-end: 3;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<div class="grid-container">
  <div class="item1"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
  <div class="item2"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Totam sunt blanditiis facere eius placeat suscipit consequuntur ullam dolor quod tenetur. Nostrum deleniti id temporibus officia, itaque voluptatibus laudantium ad porro.</p></div>
  <div class="item3"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>  
  <div class="item4"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
  <div class="item5"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
</div>

What I am looking for is well illustrated in the picture bellow:

What shall I do to achieve the desired result?


回答1:


Use grid-template-areas for parent container and specify grid-area for children items.

.grid-container {
  display: grid;
  grid-template-areas: 'left middle right';
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-flow: row;
  grid-gap: 0;
  background-color: #2196F3;
}
.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  border: 1px solid #ccc;
  font-size: 30px;
}
.item1 {
  grid-area: left;
  grid-row: auto;
}
.item2 {
  grid-area: middle;
  grid-row: auto / span 2;
};
.item3 {
  grid-area: right;
  grid-row: auto;
};
.item4 {
  grid-area: left;
  grid-row: auto;
};
.item5 {
  grid-area: right;
  grid-row: auto;
}
<div class="grid-container">
      <div class="item1"><p><strong>Item1</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
      <div class="item2"><p><strong>Item2</strong>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Totam sunt blanditiis facere eius placeat suscipit consequuntur ullam dolor quod tenetur. Nostrum deleniti id temporibus officia, itaque voluptatibus laudantium ad porro.</p></div>
      <div class="item3"><p><strong>Item3</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>  
      <div class="item4"><p><strong>Item4</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
      <div class="item5"><p><strong>Item5</strong> Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
</div>



回答2:


Here's one method using line-based placement.

.grid-container {
  display: grid;
  grid-template-columns: auto auto auto;
  grid-template-rows: repeat(10, 1fr);
  grid-gap: 5px;
  padding: 5px;
  height: 100vh;
  background-color: #2196F3;
}

/* line-based placement */
.item1 { grid-column: 1 / 2; grid-row: 1 / 4; }
.item2 { grid-column: 2 / 3; grid-row: 1 / 8; }
.item3 { grid-column: 3 / 4; grid-row: 1 / 4; }
.item4 { grid-column: 1 / 3; grid-row: 8 / 11; }
.item5 { grid-column: 3 / 4; grid-row: 4 / 11; }

.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  border: 1px solid #ccc;
}
* { box-sizing: border-box; margin: 0; }
<div class="grid-container">
  <div class="item1"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
  <div class="item2"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Totam sunt blanditiis facere eius placeat suscipit consequuntur ullam dolor quod tenetur. Nostrum deleniti id temporibus officia, itaque voluptatibus laudantium ad porro.</p></div>
  <div class="item3"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>  
  <div class="item4"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
  <div class="item5"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
</div>

Here's another method using grid-template-areas.

.grid-container {
  display: grid;
  grid-template-columns: auto auto auto;
  grid-template-rows: repeat(10, 1fr);
  grid-gap: 5px;
  padding: 5px;
  height: 100vh;
  background-color: #2196F3;
  
  grid-template-areas:
  
    " item1 item2 item3 "
    " item1 item2 item3 "
    " item1 item2 item3 "
    "   .   item2 item5 "
    "   .   item2 item5 "
    "   .   item2 item5 "
    "   .   item2 item5 "
    " item4 item4 item5 "
    " item4 item4 item5 "
    " item4 item4 item5 ";
}

.item1 { grid-area: item1; }
.item2 { grid-area: item2; }
.item3 { grid-area: item3; }
.item4 { grid-area: item4; }
.item5 { grid-area: item5; }

.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  border: 1px solid #ccc;
}
* { box-sizing: border-box; margin: 0; }
<div class="grid-container">
  <div class="item1"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
  <div class="item2"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Totam sunt blanditiis facere eius placeat suscipit consequuntur ullam dolor quod tenetur. Nostrum deleniti id temporibus officia, itaque voluptatibus laudantium ad porro.</p></div>
  <div class="item3"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>  
  <div class="item4"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
  <div class="item5"><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p></div>
</div>


来源:https://stackoverflow.com/questions/50700360/css-grid-with-columns-of-unequal-height-and-width

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!