关于padding被计算在width中问题——box-sizing相关
前一阵子遇到一个小问题,在同样的样式(主要是宽高边距之类的)条件下,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有关
关于padding被计算在width中问题——box-sizing相关的更多相关文章
- CSS3: box-sizing & content-box 属性---元素的border 和 padding 影响内容的 width 和 height解决方案
/* 关键字 值 */ box-sizing: content-box; box-sizing: border-box; /* 全局 值 */ box-sizing: inherit; box-siz ...
- OpenCV C++ 计算文件夹中对象文件数目及批量处理后保存到txt文件
//采用windows控制台实现计算文件夹中对象总数以及批量读取对象 //#include <afx.h> //和windows.h是一样的作用 #include <opencv2/ ...
- ML学习分享系列(2)_计算广告小窥[中]
原作:面包包包包包包 改动:寒小阳 && 龙心尘 时间:2016年2月 出处:http://blog.csdn.net/Breada/article/details/50697030 ...
- python_计算1+……+100中偶数和
如何计算1+--+100中偶数和? 1. 把奇数去掉,通过if,判断累加数除以2的余数,是否为1,判断是否是奇数 2. 通过continue 跳过对奇数的累加 #!/usr/bin/python3 d ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- QuantLib 金融计算——修复 BatesProcess 中的两个 Bug
QuantLib 金融计算--修复 BatesProcess 中的两个 Bug 我发现了 BatesProcess 中的两个 Bug: 基类 HestonProcess::factors 的返回值取决 ...
- 计算数组arr中所有元素的和
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JAVA经典题--计算一个字符串中每个字符出现的次数
需求: 计算一个字符串中每个字符出现的次数 思路: 通过toCharArray()拿到一个字符数组--> 遍历数组,将数组元素作为key,数值1作为value存入map容器--> 如果k ...
- 【Unity】贝塞尔曲线关于点、长度、切线计算在 Unity中的C#实现
原文:[Unity]贝塞尔曲线关于点.长度.切线计算在 Unity中的C#实现 写在前面 最近给项目做了个路径编辑,基本思路是满足几个基本需求: [额外说明]其实本篇和这个没关系,可以跳过" ...
随机推荐
- Kubernetes pod 状态
CrashLoopBackOff: 容器退出,kubelet正在将它重启 InvalidImageName: 无法解析镜像名称 ImageInspectError: 无法校验镜像 ErrImageNe ...
- Maven学习归纳(五)——继承与聚合实例讲解
一.Maven的继承 1.1 什么是继承? 继承:父工程拆分出很多子工程,可以通过父工程,统一管理依赖的版本 1.2 为什么要使用继承呢? 在A.jar 依赖着——>B.jar依赖着——> ...
- 基础知识:Mysql基本操作命令
启动mysql : mysql -hlocalhost -uroot -p 创建数据库:create database 数据库名字; 指定要操作的数据库:use 数据库名字; 查看数据表建表语句:s ...
- 【原创】我们还需要学jQuery吗?
引言 最近撸Vue的项目,感觉的有点心累.恰巧近日,有读者来信,就是想咨询一下 烟哥,现在还有必要学习jQuery么? 我明白,现在MVVM框架逐渐占据了主要市场,很多老项目也逐渐的从jQuery转向 ...
- 四大组件初始之ContentProvider
在android中,除了存放在外部存储的共享目录下的数据,各个应用的数据库文件,资源等都是私有的,其他应用没有访问权限.所以有了ContentProvider,不包含功能逻辑,用于不同应用进程间共享数 ...
- 新手学习FFmpeg - 调用API调整视频局部速率
通过修改setpts代码实现调整视频部分的播放速率. 完整代码可参考: https://andy-zhangtao.github.io/ffmpeg-examples/ 在前面提到了PTS/DTS/T ...
- 新建Servlet工程——IDEA
Servlet是sun公司提供的一套接口规范,是运行在服务端的java程序.实现了Servlet的类能够被服务器识别,而普通的java类不能被识别. 1.新建工程 2. 3.工程名字“: 4.在WEB ...
- python+selenium十:selenium的二次封装
python+selenium十:基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.w ...
- 如何从请求、传输、渲染3个方面提升Web前端性能
什么是WEB前端呢?就是用户电脑的浏览器所做的一切事情.我们来看看用户访问网站,浏览器都做了哪些事情: 输入网址 –> 解析域名 -> 请求页面 -> 解析页面并发送页面中的资源请求 ...
- SpringCloud-Hystrix Dashboard 之 Unable to connect to Command Metric Stream
实践hystrix dashboard仪表盘的时候,不管是按照书上的还是网上的,都提示Unable to connect to Command Metric Stream. 查了好久发现,如果使用sp ...