box-sizing: border-box 详解

linbojue
• 阅读 7

🎯 核心作用 box-sizing: border-box 改变了CSS盒模型的计算方式,让元素的宽度和高度包含内边距(padding)和边框(border),而不是仅仅内容区域。 📊 盒模型对比 默认盒模型 (content-box) css 体验AI代码助手 代码解读复制代码CSS .content-box { box-sizing: content-box; /* 默认值 */ width: 200px; height: 100px; padding: 20px; border: 5px solid red; }

计算方式: css 体验AI代码助手 代码解读复制代码实际占用宽度 = width + padding-left + padding-right + border-left + border-right 实际占用宽度 = 200px + 20px + 20px + 5px + 5px = 250px

实际占用高度 = height + padding-top + padding-bottom + border-top + border-bottom
实际占用高度 = 100px + 20px + 20px + 5px + 5px = 150px

border-box 盒模型 css 体验AI代码助手 代码解读复制代码CSS .border-box { box-sizing: border-box; width: 200px; height: 100px; padding: 20px; border: 5px solid red; }

计算方式: css 体验AI代码助手 代码解读复制代码实际占用宽度 = width = 200px 实际占用高度 = height = 100px

内容区域宽度 = width - padding-left - padding-right - border-left - border-right 内容区域宽度 = 200px - 20px - 20px - 5px - 5px = 150px

内容区域高度 = height - padding-top - padding-bottom - border-top - border-bottom 内容区域高度 = 100px - 20px - 20px - 5px - 5px = 50px

🔍 可视化对比 HTML 示例 xml 体验AI代码助手 代码解读复制代码HTML

content-box
实际宽度: 250px
<div>
  <div class="box border-box">border-box</div>
  <div class="size-info">实际宽度: 200px</div>
</div>

🚀 实际应用场景

  1. 响应式布局 css 体验AI代码助手 代码解读复制代码CSS /* 传统方式 - 容易出错 / .traditional-grid { width: 33.33%; padding: 10px; border: 1px solid #ccc; / 实际宽度超过33.33%,会换行 */ }

/* 使用 border-box - 完美适配 / .modern-grid { box-sizing: border-box; width: 33.33%; padding: 10px; border: 1px solid #ccc; / 实际宽度就是33.33% */ }

  1. 表单元素统一 css 体验AI代码助手 代码解读复制代码CSS /* 统一所有表单元素的盒模型 / input, textarea, select { box-sizing: border-box; width: 100%; padding: 10px; border: 1px solid #ddd; / 所有元素宽度一致,不会因padding和border而不同 */ }

.form-row { display: flex; gap: 10px; }

.form-row input { flex: 1; /* 平均分配空间 */ }

  1. 卡片布局 css 体验AI代码助手 代码解读复制代码CSS .card { box-sizing: border-box; width: 300px; padding: 20px; border: 1px solid #e1e1e1; border-radius: 8px; /* 卡片总宽度始终是300px */ }

.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; }

🛠️ 全局设置最佳实践 通用重置 css 体验AI代码助手 代码解读复制代码CSS /* 方法1: 全局设置 */

  • { box-sizing: border-box; }

/* 方法2: 更优雅的继承方式 */ html { box-sizing: border-box; }

*, *:before, *:after { box-sizing: inherit; }

为什么推荐继承方式? css 体验AI代码助手 代码解读复制代码CSS /* 使用继承的好处 / .special-component { box-sizing: content-box; / 某些特殊组件需要content-box */ }

.special-component * { /* 子元素会继承父元素的content-box / / 而不是被全局的border-box覆盖 */ }

💡 实际开发示例 响应式网格系统 css 体验AI代码助手 代码解读复制代码CSS .grid-container { display: flex; flex-wrap: wrap; margin: -10px; /* 负边距抵消子元素的margin */ }

.grid-item { box-sizing: border-box; padding: 10px; border: 2px solid #ddd; }

.col-1 { width: 8.33%; } .col-2 { width: 16.66%; } .col-3 { width: 25%; } .col-4 { width: 33.33%; } .col-6 { width: 50%; } .col-12 { width: 100%; }

/* 不使用border-box的话,padding和border会让元素换行 */

模态框居中 css 体验AI代码助手 代码解读复制代码CSS .modal { box-sizing: border-box; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 500px; padding: 30px; border: 1px solid #ccc; background: white; /* 无论padding多少,宽度都是可控的 */ }

进度条组件 css 体验AI代码助手 代码解读复制代码CSS .progress-bar { box-sizing: border-box; width: 100%; height: 20px; border: 2px solid #ddd; border-radius: 10px; overflow: hidden; background: #f5f5f5; }

.progress-fill { box-sizing: border-box; height: 100%; background: linear-gradient(90deg, #4CAF50, #45a049); transition: width 0.3s ease; /* width百分比计算更直观 */ }

⚠️ 注意事项和陷阱

  1. 与旧代码的兼容性 css 体验AI代码助手 代码解读复制代码CSS /* 可能遇到的问题 / .old-component { width: 200px; padding: 20px; / 原本期望总宽度是240px */ }

/* 添加border-box后 / .old-component { box-sizing: border-box; / 现在总宽度变成200px / / 可能需要调整width值 */ }

  1. 表格元素的特殊性 css 体验AI代码助手 代码解读复制代码CSS /* table元素有自己的布局规则 / table { box-sizing: border-box; / 可能不会按预期工作 / border-collapse: collapse; / 需要配合使用 */ }

  2. 替换元素的行为 css 体验AI代码助手 代码解读复制代码CSS /* img, input等替换元素可能有特殊行为 / img { box-sizing: border-box; width: 100%; padding: 10px; / 在某些浏览器中可能显示异常 */ }

📱 移动端适配 视口单位配合使用 css 体验AI代码助手 代码解读复制代码CSS .mobile-card { box-sizing: border-box; width: 100vw; padding: 4vw; border: 1px solid #ddd; /* 在任何屏幕宽度下都不会溢出 */ }

.mobile-grid { box-sizing: border-box; width: 50vw; padding: 2vw; border: 0.5vw solid #333; /* 完美的50%宽度,包含所有装饰 */ }

🎨 CSS框架中的应用 Bootstrap 方式 css 体验AI代码助手 代码解读复制代码CSS /* Bootstrap 4+ 默认使用 */ *, *::before, *::after { box-sizing: border-box; }

.container { width: 100%; padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; }

Tailwind CSS 方式 css 体验AI代码助手 代码解读复制代码CSS /* Tailwind 的基础重置 */ *, ::before, ::after { box-sizing: border-box; border-width: 0; border-style: solid; border-color: theme('borderColor.DEFAULT', currentColor); }

📊 性能影响 重排和重绘 css 体验AI代码助手 代码解读复制代码CSS /* border-box 不会增加额外的性能开销 / .element { box-sizing: border-box; / 改变box-sizing不会触发重排 / / 但改变width/height/padding/border仍然会 */ }

🔧 调试技巧 开发者工具查看 rust 体验AI代码助手 代码解读复制代码CSS /* 在浏览器开发者工具中 / .debug-box { box-sizing: border-box; / Elements面板会显示: / / - 内容区域尺寸 / / - padding区域 / / - border区域 / / - 总尺寸 */ }

可视化边界 css 体验AI代码助手 代码解读复制代码CSS /* 调试时显示所有边界 */

  • { box-sizing: border-box; outline: 1px solid red !important; }

📚 总结 主要优势

直观的尺寸控制 - 设置的width就是最终宽度 简化响应式布局 - 百分比宽度更可预测 统一的盒模型 - 所有元素行为一致 减少计算错误 - 不需要手动计算总尺寸

使用建议

全局设置 - 在项目开始就设置为默认值 团队统一 - 确保团队成员都理解这个概念 渐进增强 - 在旧项目中谨慎引入,注意兼容性 文档说明 - 在项目文档中明确说明使用的盒模型

box-sizing: border-box 是现代CSS开发的标准做法,它让布局变得更加直观和可控!

作者:娜妹子辣 链接:https://juejin.cn/post/7598320487506001955 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

点赞
收藏
评论区
推荐文章
晴空闲云 晴空闲云
3年前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
秃头王路飞 秃头王路飞
3年前
总结前端元素的各种高度(上)
HTMLElement.clientHeight只读属性Element.clientHeight对于没有定义CSS或者内联布局盒子的元素为0;否则,它是元素内部的高度(以像素为单位),包含内边距,但不包括边框、外边距和水平
菜园前端 菜园前端
2年前
你真的了解的CSS3盒模型和CSS3特性知识吗
原文链接:什么是CSS3?CSS3是CSS一个新的标准,直接理解为是CSS的升级版,里面新增了很多样式(特性)。CSS3盒子模型:::warningCSS3盒子模型必须要掌握,否则你在实际开发中遇到样式错乱很难排查问题。:::旧版的IE浏览器与其它浏览器解
LeeFJ LeeFJ
3年前
Foxnic-Web 代码生成 (3) —— 配置模型
FoxnicWeb对模型体系进行了简化,默认创建PO和VO类,且VO继承自PO。其它代码基于PO和VO实现。当然开发者也可以按需自定义模型,但自定义模型并不建议手动创建,而是通过代码生成工具进行创建。  代码生成配置类的configModel方法将全部的模型配置集中于此,方便站在全局的高度理解与分析模型。开发者不必关心新建的模型应该放在哪个包下面,这些在代码生成配置上都已经定义,无需时时关注。  另外,由代码生成的模型有其规范和默认已经实现的方法,方便开发者的同时,也提高模型转换、克隆复制的性能。
凯特林 凯特林
4年前
你可能不知道的10个CSS新功能(2021版)
多年来,CSS已经超越了背景颜色、边框、文本样式、边距和盒模型。现代CSS能够提供一系列的功能,而在过去,您需要JavaScript或变通方法来实现这些功能。为了庆祝它在2021年取得的成就,在这篇文章中,我们想看看一些你可能不知道的令人惊叹的CSS新特性。我们将强调web设计人员和开发人员可以用现代CSS做的很酷的事情,讨论用例,浏览器支持,并给你一个
Wesley13 Wesley13
4年前
Vtiger CRM 几处SQL注入漏洞分析,测试工程师可借鉴
本文由云社区发表0x00前言干白盒审计有小半年了,大部分是业务上的代码,逻辑的复杂度和功能模块结构都比较简单,干久了收获也就一般,有机会接触一个成熟的产品(vtigerCRM)进行白盒审计,从审计的技术难度上来说,都比公司内的那些业务复杂得多,而真正要提高自己技术水平,更应该看的也是这些代码。vtigerCRM是一个客
Wesley13 Wesley13
4年前
HTML5中新增的布局标签
1.1.1  盒子模型层次盒子模型的层次遵循以下顺序:内容paddingà边框àbackgroundimageàbackgroundcoloràmargin!(https://oscimg.oschina.net/oscnet/722909c8dcfd273c73b0c6534e20f8d9bd4.gif)!(ht
Stella981 Stella981
4年前
HTML前端开发之路——盒子背景属性
1.backgroundclip属性简介backgroundclip属性用于设置盒子背景的一个显示区域,分别有borderbox,paddingbox,contentbox;borderbox表明背景是从边框开始,即包含边框;paddingbox表明背景是从内边距开始,不包含边框;
Stella981 Stella981
4年前
HTML前端开发之路——弹性盒模型
弹性盒模型(FlexibleBox)是一个CSS3新增布局模块,用于实现容器里项目的对齐、方向、排序;弹性盒模型最大的特效在于,能够动态的修改子元素的宽度和高度,以满足在不同尺寸屏幕下的恰当布局;下面是弹性盒模型的元素基本概念:!(http://static.oschina.net/uploads/space/2016/0212/210
linbojue linbojue
5小时前
若依vue 前端的 用户管理页面源码解析
1查询条件关注gzhb站同名,有视频笔记xml体验AI代码助手代码解读复制代码​​​​搜索重置1.1vshow的本质ElementUI的自带的属性是model、ref、inline、labelwidth等(这些是elform组件封装的专属属性),而vsho