小编典典

具有响应正方形的网格布局

css

我想创建一个带有响应正方形的网格布局。

我觉得我应该可以使用CSS Grid布局来做到这一点,但是在将每个正方形的高度设置为等于宽度时遇到麻烦。

在每个正方形之间设置水槽时也遇到麻烦。

使用flexbox会更好吗?

目前,我的HTML看起来像这样,但是它将是动态的,因此可以添加更多的正方形。当然,它需要响应,因此理想情况下将使用媒体查询将其折叠到一列。

<div class="square-container">

  <div class="square">
    <div class="content">
    </div>
  </div>

  <div class="square">
    <div class="content spread">
    </div>
  </div>

  <div class="square">
    <div class="content column">
    </div>
  </div>

</div>

使用CSS网格,据我所知

.square-container{
    display: grid;
    grid-template-columns: 30% 30% 30%;
    .square {

    }
}

我可以使用flexbox进行更进一步的操作,并能够使用空格之间的间距使正方形与漂亮的装订线对齐,但仍在努力使高度
与每个正方形的宽度相匹配。

我无法找到使用flexbox或grid 完成此操作的任何示例,但任何示例也将不胜感激。


阅读 561

收藏
2020-05-16

共1个答案

小编典典

padding-bottom诀窍是最常用的技巧。

您可以将其与Flexbox和CSS Grid结合使用,由于对利润/填充使用百分比会导致弹性/网格项目的结果不一致,因此可以添加一个额外的包装器,或者在此处使用伪类,因此带有百分比的元素
不会弹性/网格项目。

编辑:请注意,对规格进行了更新。,现在在弹性/网格项目上使用时应能提供一致的结果。但是请注意,该问题
在较旧的版本上仍然会发生。

请注意,如果要向content元素添加内容,则它必须是绝对位置,以保持正方形的纵横比。

.square-container {

  display: flex;

  flex-wrap: wrap;

}



.square {

  position: relative;

  flex-basis: calc(33.333% - 10px);

  margin: 5px;

  border: 1px solid;

  box-sizing: border-box;

}



.square::before {

  content: '';

  display: block;

  padding-top: 100%;

}



.square .content {

  position: absolute;

  top: 0; left: 0;

  height: 100%;

  width: 100%;

}


<div class="square-container">



  <div class="square">

    <div class="content">

    </div>

  </div>



  <div class="square">

    <div class="content spread">

    </div>

  </div>



  <div class="square">

    <div class="content column">

    </div>

  </div>



  <div class="square">

    <div class="content spread">

    </div>

  </div>



  <div class="square">

    <div class="content column">

    </div>

  </div>



</div>

CSS Grid version

.square-container {

  display: grid;

  grid-template-columns: repeat(auto-fill, minmax(30%, 1fr));

  grid-gap: 10px;

}



.square {

  position: relative;

  border: 1px solid;

  box-sizing: border-box;

}



.square::before {

  content: '';

  display: block;

  padding-top: 100%;

}



.square .content {

  position: absolute;

  top: 0; left: 0;

  height: 100%;

  width: 100%;

}


<div class="square-container">



  <div class="square">

    <div class="content">

    </div>

  </div>



  <div class="square">

    <div class="content spread">

    </div>

  </div>



  <div class="square">

    <div class="content column">

    </div>

  </div>



  <div class="square">

    <div class="content spread">

    </div>

  </div>



  <div class="square">

    <div class="content column">

    </div>

  </div>



</div>
2020-05-16