前一阵子遇到一个小问题,在同样的样式(主要是宽高边距之类的)条件下,DIV在移动端和PC端的宽度不一样,排除了绝大多数样式的问题,但是有个比较陌生,就是box-sinzing,其实经常看到,只不过没怎么注意过,连具体的值都不知道有哪些,在开发者工具里面试了一下,果然和这个样式有关,因此查了一些资料并记录一下。

盒子模型

首先,盒子模型大家都知道,W3C标准的Box Model由四部分组成——content、padding、border、margin

Every box is composed of four parts (or areas), defined by their respective edges: the content edge, padding edge, border edge, and margin edge.

如果我们给一个应用了标准盒模型的div设置一个宽度,那么,实际上我们设置的是上文提到的content的宽度,也就是下图这个样子

  • Element空间高度 = content height + padding + border + margin

还有个不那么“标准”的盒模型,就是IE6以下(也就是处于Quirks怪异模式)的浏览器所使用的,在这种情况下:

  • Element空间宽度 = content Width + margin (Width包含了元素内容宽度、边框宽度、内距宽度)

这个时候如果我们给div设置一个宽度,那就是为元素的内容+边框+内边距设置了一个总值,如图所示

上面张图片都使用以下这段代码

div {width: 200px;height: 100px;margin: 40px;padding: 20px;border: 10px solid blue;
}

与box-sizing有什么关系

通过box-sizing这个样式我们可以改变这种宽度计算方式,它的属性值有两个:content-box和border-box。默认值为content-box,也就是标准的盒子模型,此时的计算公式为

  • width = 内容的宽度
  • height = 内容的高度

另一个属性为border-box,它的width和height属性包括内容,内边距和边框,但不包括外边距。看到这里相信大家都已经明白了,我们用了一个新的属性重现了一个不太“标准”的标准,被设置为border-box的元素在计算宽高时使用的就是IE6的模式。

我们为什么要开历史的“倒车”

其实也不能那么说,只是绕了一圈之后时间又证明了哪一种方式更合理而已,也并没有谁对谁错的问题,那么这种计算宽高的模式好在哪里呢?我们举个简单的例子

<div id="container"><div id="header" class="content_box">header</div><div id="left" class="content_box">left</div><div id="right" class="content_box">right</div><div style="clear: both;"></div><div id="footer" class="content_box">footer</div>
</div>
.content_box {height: 48px;
}#container {width: 480px;background: yellow;
}#left {width: 120px;background: red;float: left;
}#right {width: 360px;background: blue;float: left;
}

这种左右布局的应用可以说十分广泛,并且看起来很直观且合理,但是如果我们随便在left或right中加1px的内边距或border,整个布局就会被破坏,原因很好理解,按我们上面所说,现代浏览器默认是content-box模式,设定的宽度是内容的宽度,当我们增加了padding或者border的时候,left+right就不再是120+360=480了,而是120+360+1=481,由于容器的宽度不够,div就会自动换到下一行,就变成了现在这个样子:

bootstrap怎么解决的

说到这里,已经有人开始想了,为什么以前没有发现这个问题,我也是最近才遇到这种情况,因为bootstrap已经预先重置了默认的box-sizing,而很多组件又是以bootstrap为基底来做文章,所以即使我们不知道box-sizing这一样式,很可能也已经熟悉了这种模式。

* {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;
}
*:before,
*:after {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;
}

另外,bootstrap并不是在所有地方都用border-box,在一些特定元素上还是使用content-box

hr {height: 0;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;
}input[type="checkbox"],
input[type="radio"] {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;padding: 0;
}

控件的box-sizing

当看到bootstrap对控件单独设置box-sizing时我产生一些疑问,控件的默认box-sizing难道不一样吗?事实证明确实不一样,以常见的text和button来说,text默认就是content-box,而button则是border-box,这就不难理解为什么有时候我们给不同的控件设置同样的宽高却又无法对齐,这也是box-sizing在作祟。

注意甄别

不过对于这一样式也有分歧,所以不同的样式库使用box-sizing标准就不太相同,当我们引入了不同的库之后就要额外甄别这一问题,选择项目最适合的那种。

关于padding值不包含在width里面的问题,可能和box-sizing有关
box-sizing

关于padding被计算在width中问题——box-sizing相关相关推荐

  1. 设置width不生效_关于padding被计算在width中问题——box-sizing相关

    前一阵子遇到一个小问题,在同样的样式(主要是宽高边距之类的)条件下,DIV在移动端和PC端的宽度不一样,排除了绝大多数样式的问题,但是有个比较陌生,就是box-sizing,其实经常看到,只不过没怎么 ...

  2. [量子计算]日常生活中一些量子世界相关的概念

    概要 [1]原子[Atoms]的存在性 [2]随机的存在性 [3]原子光谱的离散性 [4]光有量子性 [5]电子具有干涉和衍射特性 [6]量子世界中失效的贝尔不等式? 正文 对于[1]原子[Atoms ...

  3. 深度 | 一文读懂“情感计算”在零售中的应用发展

    作者 | 黄程韦博士.刘刚.包飞博士.杨现博士.孙皓博士.沈艺博士 来源 | 苏宁零售技术研究院 零售商需要不断通过创新服务来提高顾客的购物体验,而情感计算在该领域具有独特优势.它在零售行业的应用,主 ...

  4. 【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)

    首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 ! 宏offsetof的介绍 : 参数:第一个是结构体类型名称,第二个是结构体成员名 返回类型:size_t无符号整形 引用的头文 ...

  5. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均、例如,计算某公司的多个店铺每N天(5天)的滚动销售额指数权重移动(滚动)平均

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均(Exponential Moving Average).例如,计算某公司的多个店铺每N天(5 ...

  6. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max).例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值 目录

  7. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动计数个数(rolling count).例如,计算某公司的多个店铺每N天(5天)的滚动销售额计数个数 目录

  8. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差

    pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动标准差(rolling std).例如,计算某公司的多个店铺每N天(5天)的滚动销售额标准差 目录

  9. pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list

    pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list(index of rows with missing values in dataframe ...

最新文章

  1. Samba nsswitch/pam_winbind.c文件输入验证漏洞
  2. hana::detail::variadic::reverse_apply用法的测试程序
  3. 洛谷 - P1989 无向图三元环计数(思维建图)
  4. java中什么是同步_Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized? - Break易站...
  5. Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者
  6. 揭秘!闲鱼拉新投放系统如何设计
  7. 猎豹浏览器网页声音怎么关闭
  8. app头像上传vue_Vue+Electron开发跨平台桌面应用实践
  9. [swift 进阶]读书笔记-第八章:错误处理 C8P3 带有类型的错误
  10. C语言SM2算法实现(基于GMSSL)
  11. android 歌曲的流派信息,音乐流派分类介绍.doc
  12. 时钟周期 指令周期 MIPS CPI
  13. eclipse配置red5服务器
  14. 2021年中国网上办理车辆和驾驶证业务情况:网上办理车辆和驾驶证相关业务6769万次其中,网上发放临时号牌2043万副[
  15. 32 | KafkaAdminClient:Kafka的运维利器
  16. Big Faceless Java PDF Library[BFO]
  17. 视频文件头解析--mkv
  18. 开课吧里的python学习是真的吗-Python是个什么鬼,为何火遍留学圈?
  19. java计算机毕业设计医疗器械销售电子商城源程序+mysql+系统+lw文档+远程调试
  20. Django 模型(model)

热门文章

  1. 韩非子中的管理故事2 (赏罚)
  2. 网络安全工具 Godzilla 哥斯拉内存马使用
  3. 现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、Axure原型
  4. 【刷题-剑指 Offer】 06. 从尾到头打印链表
  5. BZOJ2687: 交与并
  6. MySQL期中上机操作(有答案)
  7. 软件设计师 备考经历
  8. 【解决】Windows 10 任务栏上或图标自动隐藏
  9. Lr controller运行时,报错missing newline in C:\user\Administrator\Desktop\jiekou\username.dat
  10. 手把手带你开发一款云开发版点餐小程序,微信扫码点餐,店铺地图导航,外卖小程序,用户端和后厨端都有