CSS盒模型

记忆:

常用的 border-box 是IE盒模型,padding/border 的变化会修改其 width 内在盒子。

盒模型

页面就是由一个个盒模型堆砌起来的, 每个HTML元素 都可以叫做 盒模型,盒模型由外而内包括:边距(margin)、边框(border)、填充(padding)、内容(content)。

补充:
每个元素的盒子由内容两层组成:外在盒子容器盒子(内在盒子)

平时:
display: inline-block实际是display: inline-block的简写
display: block实际是display: block-block的简写
display: table实际是display: block-table的简写

问:width/height 作用在哪个盒子上?
答:内在盒子,也就是 content

20190302-12:54于文二路博库书城:
暂时理解盒模型由: margin + 外在盒子 + 容器盒子组成
应该不对吧?

20190302-15:48:
"内在盒子" 又被分成了 4 个盒子,分别是 content boxpadding boxborder boxmargin box

屏幕快照 2019-03-02 下午3.55.19.png
屏幕快照 2019-03-02 下午3.56.11.png

“margin 的背景永远是透明的”!!!

对于块状元素,如果设置width:
1)流动性丢失
对于块状元素,如果 width:auto,则元素会如水流般充满整个容器,而一旦设定了 width
具体数值,则元素的流动性就会被阻断,因为元素给定宽度就像河流中间竖了两个大闸一样, 就没有了流动性。尤其宽度作用在 content box 上,更是内外流动性全无,如图 3-21 所示。
这世界上任何事物,一旦限死了,就丧失了灵活性,其发展潜力及作用范围就会大大 受限。
长江为何生机勃勃数千年,就是因为滔滔江水,奔流不息。CSS 的流动性也是其生机蓬勃 之本,如果直接宽度设死,流动性丢失,在我看来,就是江河变死水,手机变板砖。这就是我 提出 “无宽度准则”的原因— 布局会更灵活,容错性会更强。

屏幕快照 2019-03-02 下午4.06.49.png

(2)与现实世界表现不一致的困扰。
包含 padding 或 border 会让元素宽度变大的这种 CSS 表现往往会让 CSS 使用者困惑: 我设置宽度为 100 像素,其实是希望整个最终的宽度是 100 像素,这样才符合现实理解嘛。

或许是因为 CSS 2.1 是面向内容(图文信息)设计的,所以,width 设计成了直接作用在 content box 上。

屏幕快照 2019-03-02 下午4.22.39.png

问:为何没有box-sizing: margin-box?
答:

  • margin-box本身不会改变元素尺寸,其本身没有存在的意义。而borderpadding 不一样
  • 另外一个原因牵扯到语义。如果 box-sizing 开了先河支持了 margin-boxmargin box就变 成 了 一 个“ 显 式 的 盒 子 ”,你 让 background-origin 等 属 性 何 去 何 从 ,支 持 还 是 不 支 持 呢 ?“ margin 的背景永远是透明的”这几个大字可是在规范写得清清楚楚,难道让背景色在所谓的 margin box 中也 显示?

关于“流”的重点:CSS 的默认流是水平方向的,宽度是稀缺的,高度是无限的。

分类

标准盒模型(W3C)
内容大小就是content

image.png

IE盒模型
内容大小是:padding+border+content

image.png

切换

使用box-sizing可以切换两者类型的模型content-boxborder-box

JS如何获取和设置Box宽高

1、
兼容性好(非IE):window.getComputedStyle(dom).width/height
仅限IE:dom.currentStyle.width/height

var obj = document.getElementById("test");

if(window.getComputedStyle){
  // window.getComputedStyle(obj).width
}else{
  // obj.currentStyle.width
}

2、dom.style.width/height(只能用于行内元素)

3、dom.offsetWidth/height(box-sizing:border-box;下)

4、dom.getBoundingClientRect().width/height !!!!!
这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离。

ps:能获取元素在页面可视区域的坐标

这些盒子如何摆放呢?

根据:块级格式化上下文和行内格式化上下文
盒子在摆放过程中,会通过盒的类型生成格式化上下文。

块级格式化上下文:Block Formtting Content(BFC)
规定了内部的块级盒如何布局,并且使该盒子在页面上形成一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。

margin塌陷的解释

所谓的塌陷其实是两个BFC的相邻盒或者父子盒相互作用时产生的。
在形成BFC的两个盒子会取两个盒子相邻边的最大margin作为相邻边的共用margin

BFC块级格式化上下文如何产生

属性值为下面时,box会产生BFC:

  • overflow: auto/ hidden;
  • position: absolute/ fixed;
  • float: left/ right;
  • display: inline-block/ table-cell/ table-caption/ flex/ inline-flex

元素浮动时BFC的应用

浮动元素会从正常文档流中删除,这也是为什么其它正常元素会看不见浮动的原因,也是为什么有父级塌陷的原因
清除浮动一种方法是使用overflow:auto/hidden,使用后整体形成了BFC,相当于清除了浮动。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,809评论 1 92
  • css盒模型是前端开发中非常基础和重要的知识,它是元素大小的呈现方式,它包括margin、border、paddi...
    zhiqiangx阅读 732评论 1 1
  • 课程目标 掌握盒模型相关知识点 了解IE盒模型和W3C 盒模型区别 学习建议 视频未覆盖的知识点会提供详细的文档资...
    饥人谷_江君阅读 620评论 0 3
  • 盒模型 盒模型的特点: 每个盒子都有:边界、边框、填充、内容四个属性;每个属性都包括四个部分:上、右、下、左;这四...
    xiaolizhenzhen阅读 1,330评论 0 0
  • 你有因为想要深入理解一首歌而懊恼自己是个“没有故事的女同学”吗? 在听陈医生的那些经典备胎之歌时,心想当备胎...
    南方的偶像派歌手阅读 352评论 0 1