div不会留在容器中[重复]

Posted

技术标签:

【中文标题】div不会留在容器中[重复]【英文标题】:divs won't stay in container [duplicate] 【发布时间】:2021-06-11 00:18:26 【问题描述】:

这些 div 具有显示内联块,高度和宽度为 50%,并且没有边距,但它们不断从容器中掉落。出了什么问题,我该如何解决?

body 
  margin: 0;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;


.gameboard 
  border: 5px solid black;
  width: 300px;
  height: 300px;
  display: flex;
  flex-wrap: wrap;


.box 
  height: 50%;
  width: 50%;
  border: 1px solid black;
  display: inline-block;
  margin: 0;
<div class="gameboard">
  <div class="box left"></div>
  <div class="box right"></div>
  <div class="box left"></div>
  <div class="box right"></div>
</div>

【问题讨论】:

【参考方案1】:

正如@neatlysliced 提到的,边框的计算不计算在内。您已应用 1px 边框,因此增加了 2px(1px 右边框 + 1px 左边框)的宽度。你可以简单地添加

box-sizing: border-box;

到盒子类。 box-sizing:border-box 属性将计算框的宽度,包括赋予该元素的任何填充或边框。

这是工作演示:

body 
  margin: 0;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;


.gameboard 
  border: 5px solid black;
  width: 300px;
  height: 300px;
  display: flex;
  flex-wrap: wrap;


.box 
  height: 50%;
  width: 50%;
  border: 1px solid black;
  display: inline-block;
  margin: 0;
  box-sizing: border-box;
<div class="gameboard">
  <div class="box left"></div>
  <div class="box right"></div>
  <div class="box left"></div>
  <div class="box right"></div>
</div>

【讨论】:

@neatlysliced 你在说什么 unitnend 副作用?几乎没有。 box-sizing 只是确定是否应该使用边框来计算宽度。最后,它们是更清洁的解决方案,因为如果您更改 broder 厚度,您无需进行计算,也无需修复多条线。 @natlysliced 我已经明确提到边框框将计算宽度,包括应用于它的任何边框或填充。我不明白你想通过说明“副作用”来指出什么。 @tacoshy 谢谢。这是完美的答案。【参考方案2】:

根据您的框尺寸,边框宽度超过 50%。因此,每个框占用 50% + 2px(左侧边框为 1px,右侧边框为 1px,顶部和底部边框的高度也类似)。幸运的是,我们可以使用内置的 calc() 来进行数学运算,它会很合适。您想要的宽度将是 50% 减去边框的总和 2px。

编辑添加: 如果您正在调整内容框大小,如果您添加了填充,则可能需要调整 calc() 以适应额外的填充。

      <style>

         body
          margin: 0;
          height: 100vh;
          display: flex;
             align-items: center;
          justify-content: center;
            
     .gameboard
       border: 5px solid black;
         width: 300px;
           height: 300px;
         display: flex;
       flex-wrap: wrap;

     

     .box

      height: calc(50% - 2px);
       width: calc(50% - 2px);
       border: 1px  solid black ;
       display: inline-block;
       margin: 0;
      
         

       </style>
     <!DOCTYPE html>
      <html lang="en">
         <head>
         <meta charset="UTF-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <title>Document</title>


   </head>
    <body>
     <div class="gameboard">
          <div class="box left"></div>
           <div class="box right"></div>
          <div class="box left"></div>
         <div class="box right"></div>
    </div>


</body>
</html>

【讨论】:

使用calc funtion 很麻烦。您需要计算填充和边框。如果您更改其中任何一个,则需要调整多个值。最简单的解决方案是使用box-sizing-borderbox;。默认情况下,它将宽度计算更改为在总宽度中包含填充和边框。您使解决方案过于复杂,因为不存在副作用。 box-sizingcontent-box 更改为 border-box 没有任何区别。它根本没有影响。它唯一做的就是content box 使用内容的宽度,border-box 使用content + padding + border) 的宽度。不知道为什么你仍然在谈论问题或副作用。它不会产生副作用。试着提一个可能发生的“副作用” box-sizing 没有被继承...box-sizing 的默认值是content-box 而不是inherit @tacoshy 我的错!老实说,我忘记了这一点,我通常设置一次就忘记了。感谢您的耐心和亲切的教导。原发帖人应更改正确答案。

以上是关于div不会留在容器中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Flex 容器不会扩展以适应 IE 中的内容 [重复]

div覆盖flex容器中的其他div [重复]

将 div 调整为容器中最大可能的正方形 [重复]

在 div 容器底部对齐 div [重复]

如何让 div 在容器 div 的底部对齐 [重复]

水平对齐两个div(一个在最左边,另一个在容器的最右边)[重复]