Skip to content

弹性限度

min/max-width

image-20251024091325952

属性作用优先级备注
flex-basis定义元素在主轴上的初始尺寸优先于 width
width元素的默认宽度(在主轴为水平时)flex-basis: auto 时才生效
min-width限制最小宽度高于 flex即使压缩也不会小于此值
max-width限制最大宽度高于 flex即使放大也不会超过此值

三栏式布局

基本布局

左右两栏宽度固定,中间一栏占据所有剩余空间

vue
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .container {
        display: flex;
        height: 100vh;
      }
      .left,
      .right {
        width: 100px;
        flex-shrink: 0;
        background-color: yellowgreen;
      }
      .middle {
        flex: 1;
        max-width: 1000px;
        background-color: #f0f0f0;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="left">left</div>
      <div class="middle">middle</div>
      <div class="right">right</div>
    </div>
  </body>
</html>

当浏览器窗口调整至很小时,侧边栏将会收缩,因为shrink默认为1

禁止侧边栏收缩

  • 解决方案1:
css
.left,.right {
  width: 100px;
  flex-shrink:0;
}
  • 解决方案2:

flexbox会尊重元素的最小宽度限制

css
.left,.right {
  width: 100px;
  min-width:100px;
}

超宽屏优化

为内容区添加max-width即可解决弹性盒子过宽导致内容区过宽的问题

css
.middle {
  max-width:1000px;
  flex: 1;
}

最终效果:

屏幕宽度middle 实际宽度container宽度空白区域
800px600px800px
1200px1000px1200px
2000px1000px2000px三栏居左,右侧出现800px空白

container宽度没有设置宽度,因此其宽度是父容器的100%