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;
  }

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

相关推荐
羲云7 分钟前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
行者全栈架构师21 分钟前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
全栈Agent 小李28 分钟前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
羲云28 分钟前
别让 AI 凭记忆做调研:给 WorkBuddy 接上可核验的实时搜索
前端
deli0071 小时前
连接池到底配多大?QPS 和 RT 算一遍,再跑 1 万次请求实测超时率
前端
风花一世月1 小时前
🏮 我把三坊七巷做成了能飞的 3D 地图(901 个真实建筑轮廓、20 处景点,在线直接玩)
前端
特立独行的猫A1 小时前
用仓颉语言写一个串口调试助手:cj-tauri 实战
前端
小凯在掘金1 小时前
Shadow DOM 和 Virtual DOM ?别再傻傻分不清
前端·html
郑州光合科技余经理1 小时前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
数据掘金1 小时前
埋点事件命名升级时老数据怎么办
前端