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

盒子模型

首先,盒子模型大家都知道,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

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

  1. mysql设置参数不生效_关于mysql的wait_timeout参数 设置不生效的问题【转】

    关于wait_timeout 有一次去online set wait_timeout 的时候发现改了不生效,如下: mysql> show variables like 'wait_timeou ...

  2. java 设置环境变量生效_配置java环境变量后没有生效的解决办法

    参考文章:https://blog.csdn.net/tooky_poom/article/details/60768458 系统安装了jdk1.7,环境变量正常,但是安装jdk1.8后,修改环境变量 ...

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

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

  4. 虚拟磁盘类型_一起来了解一下Window10系统中虚拟硬盘的相关操作

    大家好,我是波仔欢迎大家又来和我一起分享电脑知识,我们今天来分享一下虚拟硬盘部分的一些相关的操作. 虚拟硬盘 VHD格式的虚拟硬盘最开始应用在微软的Virtual PC和Virtual Server中 ...

  5. sequelize模型关联_使用Sequelize来计算关联模型中的行数(其中id ='x')

    我试图建立一个留言板来教自己的JavaScript.我正在与: 的NodeJS angularjs 表示 MySQL的 我有一个视图/board,它使用以下路径(和相应的sqlize查询)来获取显示& ...

  6. python诞生的时间地点人物_用Python来计算任意视频中各人物的出镜时间!这项目值50K吗?...

    用Python来计算任意视频中各人物的出镜时间!这项目值50K吗? 简介当我开始接触深度学习时,学到的第一件事就是图像分类.这个话题非常有趣,包括我在内的很多人都沉浸在它的魅力之中.但是在我处理图像分 ...

  7. ant design table column 设置width不生效解决方案

    ant design table column 设置width不生效解决方案 参考文章: (1)ant design table column 设置width不生效解决方案 (2)https://ww ...

  8. echarts的legend设置width不生效

    看了官方文档的你是不是还是懵,官方的试一试都width也并不生效 legend:{width: '300px' } 必须加入 backgroundColor属性 width才生效 legend:{wi ...

  9. html给div设置宽度无效,HTML学习之给div高度设置百分比不生效的问题

    这几天在学习HTML的知识,今天想做一个极为简单的页面,就是分为头部,内容和底部,本来用三个div即可,可是给div高度设置百分比时发现不生效,具体页面如下,非常简单. 下面是html部分: 1111 ...

最新文章

  1. java数据和窗口怎么结合_卖jsp编程技巧的那个垃圾的所有实例的答案全部
  2. 灰色预测模型代码_生信审稿人最常问的验证!临床预测模型中的PCA主成分分析!这点你注意到了没!(附代码)...
  3. 计组第一章(唐朔飞)——计算机系统概述章节总结
  4. 使用设计模式构建通用数据库访问类
  5. 混合字符串字符数统计
  6. Objective-C反射机制
  7. AI算法工程师手册!
  8. Go语言程序的命令行参数
  9. 计算机相关国外期刊,计算机 国外期刊
  10. 3:AngularJS:模糊查询过滤内容,下拉菜单排序,过滤敏感字符,验证判断后添加表格信息
  11. 传统语音识别介绍【二】—— 特征提取
  12. 使用C语言自定义函数计算三角形周长
  13. 湘潭大学数据库考试(郭云飞)
  14. 使用AVProVideo的一点小坑
  15. python列表中单个元素的访问方式_从boost::python::object列表中获取单个元素,用于python routin...
  16. win7下 VMware 9.0安装 MAC OS 10.8
  17. Adobe Dreamweaver 的基础知识
  18. python金融趋势指标计算:布林带
  19. 让人头疼的哈夫曼树与编码
  20. 电赛知识补充——电机篇

热门文章

  1. visual studio code搭建本地服务器(node.js+express)
  2. mongodb 部署
  3. B2C和B2B之间有多大差距
  4. machine ID问题 ( u-boot设置machine id , set mach_type 0x16a )
  5. 使用MeanJS Yeoman Generator
  6. [pytorch、学习] - 4.2 模型参数的访问、初始化和共享
  7. javascript --- [读书笔记] 回流与重绘 前端优化小结
  8. Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView
  9. vue --- vue.js实战基础篇课后练习
  10. vue --- compoent妙用