CSS中box-sizing属性值的使用

一、背景和意义

在CSS中,box-sizing是一个相对比较冷门的属性。对于某些样式问题,修改box-sizing属性是最简洁的解决办法。但是由于该属性相对比较冷门,等遇到问题时可能更容易想到其他麻烦一点的替代方案而不是使用box-sizing。本文将给出box-sizing的一个使用示例。

二、存在问题的网页代码

这里先给出一段存在样式问题的网页代码,后面再尝试用box-sizing及其他替代方案解决该问题。 假设需要构建一个两栏布局的页面,其网页代码如下:

html 复制代码
<style>
  header {
    background: #0000ff;
  }
  main {
    float: left;
    width: 70%;
    background: #ccff00;
  }
  aside {
    float: left;
    width: 30%;
    padding: 1.5rem;
    background: #cc00cc;
  }
</style>
<header>
  <h1>页面头部在此,使用h1标签和醒目的蓝色背景</h1>
</header>
<div class="container">
  <main>
    <h1>正文标题在此,使用h1标签</h1>
    <p>
      正文内容在此,使用醒目的绿色背景,预计正文将占据页面左侧70%的宽度。
    </p>
  </main>
  <aside>
    <div>侧边拦在此,使用醒目的紫色背景,预计侧边拦将占据页面右侧30%的宽度。</div>
  </aside>
</div>

以上代码展现的网页如下:

尽管代码设置了正文的width为70%,侧边栏的width为30%,但是展示的结果似乎不太符合预期。

三、box-sizing之外的解决方案

如果不太了解或者没有想到box-sizing属性,也有其他替代方案可以解决此问题。

3.1 使用魔术值宽度

新手最常想到的方法可能就是把侧边栏(即aside标签对应的元素)的width改小一点,试试29%、28%?在比较宽的屏幕下,当侧边边栏从30%试到26%时,正文和侧边栏在页面上就能够排下:

而对于页面比较窄的移动端应用,width要减少到25%才排得下。但这种方法对将来接手这段代码的同事来说很不友好,26%和25%都是一个奇怪的数值,后人在接手这段代码时可能会疑惑这个数字是怎么来的。

3.2 使用变量和calc函数

正文和侧边栏之所以排不下,是因为侧边栏有一个1.5rem的padding,其设置的width=30%加上padding之后实际宽度超过了30%。只要width减去padding的宽度,正文和侧边栏就能排得下。

修改前的CSS代码为:

css 复制代码
  aside {
    float: left;
    width: 30%;
    padding: 1.5rem;
    background: #cc00cc;
  }

将这段CSS代码修改为:

css 复制代码
  :root {
    --aside-padding: 1.5rem;
  }
  aside {
    float: left;
    width: calc(30% - var(--aside-padding) * 2);
    padding: var(--aside-padding);
    background: #cc00cc;
  }

修改后的页面效果为:

3.3 使用box-sizing

在不设置box-sizing的情况下,HTML元素的box-sizing会取默认值content-box,其表示任何指定的宽或高都只会设置元素内容的大小,这里的内容不包括内边距和边框。box-sizing有另外一个可用的值为border-box,其表示height和width属性会设置内容、内边距以及边框的大小总和,这刚好解决了本示例的样式问题。

修改前的CSS代码为:

css 复制代码
  aside {
    float: left;
    width: 30%;
    padding: 1.5rem;
    background: #cc00cc;
  }

将这段CSS代码增加一个box-sizing属性:

css 复制代码
  aside {
    box-sizing: border-box;
    float: left;
    width: 30%;
    padding: 1.5rem;
    background: #cc00cc;
  }

修改后的页面效果也符合预期:

相关推荐
泯泷4 小时前
手搓JSVMM第 8 篇:函数调用:参数、返回值与调用帧
前端·javascript·前端框架
Sherotree4 小时前
Google Antigravity——Agent 被提到主界面
前端·ide·后端·edge浏览器
里欧跑得慢5 小时前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
里欧跑得慢5 小时前
Flutter 三方库 function_tree — 鸿蒙应用开发中的动态数学公式解析与计算神器,实现鸿蒙深度适配下的复杂函数逻辑运行时求值实战(适配鸿蒙 HarmonyOS Next ohos)
android·前端·安全·flutter·华为·harmonyos
苏灿烤鱼5 小时前
没有机密文件,也没有付费数据,在浏览器里造一颗"间谍卫星"
前端·javascript·github
泯泷6 小时前
手搓JSVM第 5 篇:写第一个编译器:从 AST 生成 IR
前端·javascript·算法
泯泷6 小时前
手搓JSVM第 7 篇:控制流:if、while 与 jump
前端·javascript·算法
泯泷6 小时前
手搓JSVM第 6 篇:把 IR 编成字节码:emit 与 label fixup
前端·javascript·算法
泯泷6 小时前
手搓JSVM第 3 篇:从栈式 VM 到寄存器式 VM:为什么我们选择寄存器
前端·javascript·算法
泯泷6 小时前
第 4 篇:让 VM 支持变量:Slot、Environment 与 TDZ
前端·javascript·算法