【问题标题】:How to make a grid container shrink to fit the content?如何使网格容器缩小以适应内容?
【发布时间】:2019-12-05 04:07:39
【问题描述】:

我正在尝试使用网格制作游戏。我有 x div,里面有 x div,用于创建网格。

问题在于,我希望所有这些的容器 div 都尽可能大(例如,5x5 正方形,每个 25px = 125px x 125px 容器 div)。高度很好,但宽度延伸到最后。每个框为 25px。

我试过grid-template-rows: repeat(auto-fill, 25px) 似乎不起作用。我无法将其设置为特定宽度(125 像素),因为正方形的数量将是动态的(但始终是平方数)。

* {
  margin: 0px;
  padding: 0px;
  box-sizing: border-box;
}

#start {
  position: relative;
  width: auto;
  margin: 50px auto;
  display: grid;
  grid-template-rows: repeat(auto-fill, 25px);
}

.row {
  display: grid;
  grid-template-columns: repeat(auto-fill, 25px);
}

.gameNode {
  margin: 0px;
  height: 25px;
  width: 25px;
}

.even {
  background-color: #666;
}

.odd {
  background-color: #999;
}
<div id="start">
  <div id="row_0" class="row">
    <div class="gameNode odd" id="node_1"></div>
    <div class="gameNode even" id="node_2"></div>
    <div class="gameNode odd" id="node_3"></div>
    <div class="gameNode even" id="node_4"></div>
    <div class="gameNode odd" id="node_5"></div>
  </div>
  <div id="row_1" class="row">
    <div class="gameNode even" id="node_6"></div>
    <div class="gameNode odd" id="node_7"></div>
    <div class="gameNode even" id="node_8"></div>
    <div class="gameNode odd" id="node_9"></div>
    <div class="gameNode even" id="node_10"></div>
  </div>
  <div id="row_2" class="row">
    <div class="gameNode odd" id="node_11"></div>
    <div class="gameNode even" id="node_12"></div>
    <div class="gameNode odd" id="node_13"></div>
    <div class="gameNode even" id="node_14"></div>
    <div class="gameNode odd" id="node_15"></div>
  </div>
  <div id="row_3" class="row">
    <div class="gameNode even" id="node_16"></div>
    <div class="gameNode odd" id="node_17"></div>
    <div class="gameNode even" id="node_18"></div>
    <div class="gameNode odd" id="node_19"></div>
    <div class="gameNode even" id="node_20"></div>
  </div>
  <div id="row_4" class="row">
    <div class="gameNode odd" id="node_21"></div>
    <div class="gameNode even" id="node_22"></div>
    <div class="gameNode odd" id="node_23"></div>
    <div class="gameNode even" id="node_24"></div>
    <div class="gameNode odd" id="node_25"></div>
  </div>
</div>

我希望容器 div 只占用与正方形一样多的空间,但它会延伸到整个页面。高度看起来不错。

这是它正在执行的操作的屏幕截图:

它创建了一堆额外的方块,填充空间而不是仅仅填充实际的 div。

我是否正确处理了这个问题,或者我应该以不同的方式格式化我的 HTML 以获得预期的效果?

【问题讨论】:

    标签: html css flexbox css-grid


    【解决方案1】:

    在这种情况下,网格将不起作用。你需要使用弹性盒子。在主容器上切换到display: inline-flex


    display: grid

    您不能使用 display: grid,因为这会创建一个块级容器,默认情况下,它会占据父级的整个宽度。由于您无法定义宽度,因为:

    我无法将其设置为特定宽度,因为正方形的数量将是动态的...

    ...那么你不能使用块级容器。这就是你现在的立场:

    #start {
      display: grid;
      border: 2px solid red;
    }
    
    .row {
      display: grid;
      grid-template-columns: repeat(auto-fill, 25px);
      grid-auto-rows: 25px;
    }
    
    .even { background-color: #666; }
    .odd  { background-color: #999; }
    <div id="start">
      <div id="row_0" class="row">
        <div class="gameNode odd" id="node_1"></div>
        <div class="gameNode even" id="node_2"></div>
        <div class="gameNode odd" id="node_3"></div>
        <div class="gameNode even" id="node_4"></div>
        <div class="gameNode odd" id="node_5"></div>
      </div>
      <div id="row_1" class="row">
        <div class="gameNode even" id="node_6"></div>
        <div class="gameNode odd" id="node_7"></div>
        <div class="gameNode even" id="node_8"></div>
        <div class="gameNode odd" id="node_9"></div>
        <div class="gameNode even" id="node_10"></div>
      </div>
      <div id="row_2" class="row">
        <div class="gameNode odd" id="node_11"></div>
        <div class="gameNode even" id="node_12"></div>
        <div class="gameNode odd" id="node_13"></div>
        <div class="gameNode even" id="node_14"></div>
        <div class="gameNode odd" id="node_15"></div>
      </div>
      <div id="row_3" class="row">
        <div class="gameNode even" id="node_16"></div>
        <div class="gameNode odd" id="node_17"></div>
        <div class="gameNode even" id="node_18"></div>
        <div class="gameNode odd" id="node_19"></div>
        <div class="gameNode even" id="node_20"></div>
      </div>
      <div id="row_4" class="row">
        <div class="gameNode odd" id="node_21"></div>
        <div class="gameNode even" id="node_22"></div>
        <div class="gameNode odd" id="node_23"></div>
        <div class="gameNode even" id="node_24"></div>
        <div class="gameNode odd" id="node_25"></div>
      </div>
    </div>

    display: inline-grid

    您不能使用display: inline-grid,因为所有项目都会垂直堆叠。

    #start {
      display: inline-grid;
      border: 2px solid red;
    }
    
    .row {
      display: grid;
      grid-template-columns: repeat(auto-fill, 25px);
      grid-auto-rows: 25px;
    }
    
    .even { background-color: #666; }
    .odd  { background-color: #999; }
    <div id="start">
      <div id="row_0" class="row">
        <div class="gameNode odd" id="node_1"></div>
        <div class="gameNode even" id="node_2"></div>
        <div class="gameNode odd" id="node_3"></div>
        <div class="gameNode even" id="node_4"></div>
        <div class="gameNode odd" id="node_5"></div>
      </div>
      <div id="row_1" class="row">
        <div class="gameNode even" id="node_6"></div>
        <div class="gameNode odd" id="node_7"></div>
        <div class="gameNode even" id="node_8"></div>
        <div class="gameNode odd" id="node_9"></div>
        <div class="gameNode even" id="node_10"></div>
      </div>
      <div id="row_2" class="row">
        <div class="gameNode odd" id="node_11"></div>
        <div class="gameNode even" id="node_12"></div>
        <div class="gameNode odd" id="node_13"></div>
        <div class="gameNode even" id="node_14"></div>
        <div class="gameNode odd" id="node_15"></div>
      </div>
      <div id="row_3" class="row">
        <div class="gameNode even" id="node_16"></div>
        <div class="gameNode odd" id="node_17"></div>
        <div class="gameNode even" id="node_18"></div>
        <div class="gameNode odd" id="node_19"></div>
        <div class="gameNode even" id="node_20"></div>
      </div>
      <div id="row_4" class="row">
        <div class="gameNode odd" id="node_21"></div>
        <div class="gameNode even" id="node_22"></div>
        <div class="gameNode odd" id="node_23"></div>
        <div class="gameNode even" id="node_24"></div>
        <div class="gameNode odd" id="node_25"></div>
      </div>
    </div>

    发生这种情况是因为default value for grid-auto-columnsauto,这意味着单个列的大小适合内容。

    为了使您的布局使用display: inline-grid,您需要定义列,这在您的布局中似乎是不可接受的。

    #start {
      display: inline-grid;
      grid-template-columns: repeat(5, auto);
      border: 2px solid red;
    }
    
    .row {
      display: grid;
      grid-template-columns: repeat(auto-fill, 25px);
      grid-auto-rows: 25px;
    }
    
    .even { background-color: #666; }
    .odd  { background-color: #999; }
    <div id="start">
      <div id="row_0" class="row">
        <div class="gameNode odd" id="node_1"></div>
        <div class="gameNode even" id="node_2"></div>
        <div class="gameNode odd" id="node_3"></div>
        <div class="gameNode even" id="node_4"></div>
        <div class="gameNode odd" id="node_5"></div>
      </div>
      <div id="row_1" class="row">
        <div class="gameNode even" id="node_6"></div>
        <div class="gameNode odd" id="node_7"></div>
        <div class="gameNode even" id="node_8"></div>
        <div class="gameNode odd" id="node_9"></div>
        <div class="gameNode even" id="node_10"></div>
      </div>
      <div id="row_2" class="row">
        <div class="gameNode odd" id="node_11"></div>
        <div class="gameNode even" id="node_12"></div>
        <div class="gameNode odd" id="node_13"></div>
        <div class="gameNode even" id="node_14"></div>
        <div class="gameNode odd" id="node_15"></div>
      </div>
      <div id="row_3" class="row">
        <div class="gameNode even" id="node_16"></div>
        <div class="gameNode odd" id="node_17"></div>
        <div class="gameNode even" id="node_18"></div>
        <div class="gameNode odd" id="node_19"></div>
        <div class="gameNode even" id="node_20"></div>
      </div>
      <div id="row_4" class="row">
        <div class="gameNode odd" id="node_21"></div>
        <div class="gameNode even" id="node_22"></div>
        <div class="gameNode odd" id="node_23"></div>
        <div class="gameNode even" id="node_24"></div>
        <div class="gameNode odd" id="node_25"></div>
      </div>
    </div>

    显示:inline-flex

    使用 flexbox,块级容器 (display: flex) 将因上面 display: grid 部分中描述的相同原因而无法工作。

    但是,display: inline-flex 有效,因为default value of flex-basisauto,这意味着项目的大小适合内容,并且与网格布局不同,没有默认设置强制项目堆叠成单列。

    #start {
      display: inline-flex;
      border: 2px solid red;
    }
    
    .row {
      display: grid;
      grid-template-columns: repeat(auto-fill, 25px);
      grid-auto-rows: 25px;
    }
    
    
    .even { background-color: #666; }
    .odd  { background-color: #999; }
    <div id="start">
      <div id="row_0" class="row">
        <div class="gameNode odd" id="node_1"></div>
        <div class="gameNode even" id="node_2"></div>
        <div class="gameNode odd" id="node_3"></div>
        <div class="gameNode even" id="node_4"></div>
        <div class="gameNode odd" id="node_5"></div>
      </div>
      <div id="row_1" class="row">
        <div class="gameNode even" id="node_6"></div>
        <div class="gameNode odd" id="node_7"></div>
        <div class="gameNode even" id="node_8"></div>
        <div class="gameNode odd" id="node_9"></div>
        <div class="gameNode even" id="node_10"></div>
      </div>
      <div id="row_2" class="row">
        <div class="gameNode odd" id="node_11"></div>
        <div class="gameNode even" id="node_12"></div>
        <div class="gameNode odd" id="node_13"></div>
        <div class="gameNode even" id="node_14"></div>
        <div class="gameNode odd" id="node_15"></div>
      </div>
      <div id="row_3" class="row">
        <div class="gameNode even" id="node_16"></div>
        <div class="gameNode odd" id="node_17"></div>
        <div class="gameNode even" id="node_18"></div>
        <div class="gameNode odd" id="node_19"></div>
        <div class="gameNode even" id="node_20"></div>
      </div>
      <div id="row_4" class="row">
        <div class="gameNode odd" id="node_21"></div>
        <div class="gameNode even" id="node_22"></div>
        <div class="gameNode odd" id="node_23"></div>
        <div class="gameNode even" id="node_24"></div>
        <div class="gameNode odd" id="node_25"></div>
      </div>
    </div>

    【讨论】:

    • 谢谢,这帮助很大。虽然我决定用一张桌子代替,但这提供了很多我不知道的信息。
    • 这是一个出色而全面的答案,帮助我解决了类似的问题(我使用了内联网格解决方案)。谢谢!
    【解决方案2】:

    你可以使用 display inline-grid 来通过它的子容器来增长容器,但是你需要在 repeat(5, 25px); 中设置元素的数量;

    #start {
        display: inline-grid;
    }
    .row {
        grid-template-columns: repeat(5, 25px);
    }
    

    但有一个问题:它是为了什么? 两个方向的 CSS GRID,您不需要 div.row,您只需使用根容器即可控制所有内容。 对于您正在制作的内容,您应该使用 css flex。

    【讨论】:

    • 好吧,我正在制作一个网格,所以我认为网格会更好。我会尝试弯曲。我也无法设置重复数量,因为网格数是一个变量。谢谢
    【解决方案3】:

    尝试使用 margin-left 和 margin-right 属性来增加宽度。您也可以尝试对 with 使用百分比(低于 100%)。由于您的内容居中,这可能会使您的盒子脱离左右边缘。

    【讨论】:

    • 基于百分比的宽度没有帮助,这就是imgur.com/3ZM4slq
    • 您能否以不同的方式阐明您的最终目标?是不是你只想要一个高度为 125px 且宽度相等的盒子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多