【问题标题】:Using CSS For Two-Dimensional Div Layout使用 CSS 进行二维 div 布局
【发布时间】:2017-09-28 03:09:52
【问题描述】:

我正在尝试垂直和水平地调整页面内容,并且在大多数情况下,我已经实现了这种效果。但是,我的一些“行”超出了我为它们定义的大小。我重新创建了我的环境here。我似乎无法弄清楚为什么topHalf div 的边框会一直延伸到menuBar div。

html, body, #page {
  margin: 0;
  padding: 0;
  height: 100%;
}

#menuBar {
  height: 5%;
  text-align: center;
  vertical-align: middle;
}

#topHalf,
#bottomHalf {
  display: flex;
  position: relative;
}

#topHalf {
  height: 50%;
}

#bottomHalf {
  height: 45%;
}

#menuPanel,
#storagePanel,
#equipmentPanel,
#statsPanel,
#mapPanel,
#craftingPanel,
#utilityPanel {
  padding: 25px;
  position: relative;
  flex: 1;
  overflow-wrap: normal;
  overflow: auto;
  border: 2px solid;
}
<div id="page">
  <div id="menuBar">
    <div id="menuPanel">
      <h3>Menu</h3>
    </div>
  </div>
  <div id="topHalf">
    <div id="storagePanel">
      <h3>Inventory</h3>
    </div>
    <div id="equipmentPanel">
      <h3>Equipment</h3>
    </div>
    <div id="statsPanel">
      <h3>Stats</h3>
    </div>
  </div>
  <div id="bottomHalf">
    <div id="mapPanel">
      <h3>Map</h3>
    </div>
    <div id="craftingPanel">
      <h3>Crafting</h3>
    </div>
    <div id="utilityPanel">
      <h3>Utilities</h3>
    </div>
  </div>
</div>

【问题讨论】:

  • 你能举个例子来说明你真正在寻找什么吗?看起来正在发生的事情是菜单溢出到“topHalf”容器中。另外,你用的是什么浏览器?
  • Checkout display: grid 这允许您进行二维布局。 css-tricks.com/snippets/css/complete-guide-grid
  • 我想要实现的效果看起来像this,所有面板都垂直弯曲。我的目标是在调整窗口大小时使所有内容都固定在适当的位置并与其他面板相关,我希望它们都相应地适应窗口的高度和宽度。
  • 您需要在此处发布您的标记,而不是明天会改变或消失的 jsfiddle 不会帮助任何人:minimal reproducible example
  • jsfiddle 是分叉的和静态的,将保持不变。但我会编辑问题以包含我的标记。

标签: html css layout flexbox


【解决方案1】:

Your updated fiddle.


这是我使用的:

#page {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
#page > * {
  flex-grow: 1;
}
#menuBar {
  flex-grow: 0;  
}

我还删除了#page 的所有孩子的硬编码高度。


Ref我似乎无法弄清楚为什么 topHalf div 的边框会一直延伸到 menuBar div 中。

边框重叠效果的原因是#menuBar超过了其父高度的5%
您可能想要的是它占用它需要的空间,但不是更多(它是 #page 唯一不应该增长的孩子)。
其余的孩子应该在剩余的可用高度上平均成长。

min-height:100vh 使#page 至少为设备屏幕高度的100%。如果#page 的子级不适合单个屏幕高度,它将开发一个滚动条(这可能是您想要的 - 您希望所有内容都可访问)。

【讨论】:

  • 谢谢,这看起来很棒。但是你是说没有办法垂直弯曲内容,这样无论窗口大小如何,div 都将保持它们的纵横比?
  • 不,我不是这么说的。我只是说这是不好的做法。在移动设备上以横向模式查看时,视口高度的5% 甚至不允许单行文本,更不用说填充。在纵向移动设备或大型显示器上查看时,5% 可能太多了。那么,如果大部分时间看起来都很糟糕,为什么还要使用它呢?为什么您认为所有网站上的大多数菜单都有固定高度?看:Stack Overflow 菜单:top-bar { height: 60px;}
  • 啊,很公平。非常感谢你。这非常有效!
【解决方案2】:

https://jsfiddle.net/La3bcqkx/1/

移除 h3 的默认边距。并且 div 的填充使它们比规定的 % 大。

#menuBar h3 {
    margin:0;
}
#menuBar {
    padding: 0;
}

使用border-box解决填充问题。

另请阅读:https://quirksmode.org/css/user-interface/boxsizing.html

【讨论】:

    【解决方案3】:

    您可以尝试从#menuBar 中删除height:5% 我想你正在寻找这个。删除height 后,布局看起来正确。我在这里添加了sn-p。

    html, body, #page {
      margin: 0;
      padding: 0;
    }
    
    #menuBar {
      text-align: center;
      vertical-align: middle;
    }
    
    #topHalf,
    #bottomHalf {
      display: flex;
      position: relative;
    }
    
    #topHalf {
      height: 50%;
      
    }
    
    #bottomHalf {
      height: 45%;
    }
    
    #menuPanel,
    #storagePanel,
    #equipmentPanel,
    #statsPanel,
    #mapPanel,
    #craftingPanel,
    #utilityPanel {
      padding: 25px;
      position: relative;
      flex: 1;
      overflow-wrap: normal;
      overflow: auto;
      border: 2px solid;
    }
    <div id="page">
      <div id="menuBar">
        <div id="menuPanel">
          <h3>Menu</h3>
        </div>
      </div>
      <div id="topHalf">
        <div id="storagePanel">
          <h3>Inventory</h3>
        </div>
        <div id="equipmentPanel">
          <h3>Equipment</h3>
        </div>
        <div id="statsPanel">
          <h3>Stats</h3>
        </div>
      </div>
      <div id="bottomHalf">
        <div id="mapPanel">
          <h3>Map</h3>
        </div>
        <div id="craftingPanel">
          <h3>Crafting</h3>
        </div>
        <div id="utilityPanel">
          <h3>Utilities</h3>
        </div>
      </div>
    </div>
    1. 垂直对齐。

    html, body, #page {
      margin: 0;
      padding: 0;
    }
    
    #menuBar {
      text-align: center;
      vertical-align: middle;
    }
    
    #topHalf,
    #bottomHalf {
      display: flex-row;
      position: relative;
    }
    
    #topHalf {
      height: 50%;
      
    }
    
    #bottomHalf {
      height: 45%;
    }
    
    #menuPanel,
    #storagePanel,
    #equipmentPanel,
    #statsPanel,
    #mapPanel,
    #craftingPanel,
    #utilityPanel {
      padding: 25px;
      position: relative;
      flex: 1;
      overflow-wrap: normal;
      overflow: auto;
      border: 2px solid;
    }
    <div id="page">
      <div id="menuBar">
        <div id="menuPanel">
          <h3>Menu</h3>
        </div>
      </div>
      <div id="topHalf">
        <div id="storagePanel">
          <h3>Inventory</h3>
        </div>
        <div id="equipmentPanel">
          <h3>Equipment</h3>
        </div>
        <div id="statsPanel">
          <h3>Stats</h3>
        </div>
      </div>
      <div id="bottomHalf">
        <div id="mapPanel">
          <h3>Map</h3>
        </div>
        <div id="craftingPanel">
          <h3>Crafting</h3>
        </div>
        <div id="utilityPanel">
          <h3>Utilities</h3>
        </div>
      </div>
    </div>

    【讨论】:

    • 这确实解决了重叠错误,但是内容超出了页面的高度,并且必须滚动...
    • 好的..我在sn-p中也做了同样的修改。您需要做的是删除 html, body, #page height:100%;height 将被自动获取。
    • 当你移除它时,它看起来不再垂直弯曲面板了。我在某处读到,如果您不指定 html 正文的高度,则它不会相应地垂直弯曲内容。
    • 因为#page 不是一个弹性盒子,所以不必担心它的内部 div 的垂直对齐方式。但是topHalf & bottomHalf 是弹性的,所以它会接受display: flex-row
    • 添加了用于垂直对齐内部 div 的 sn-p
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多