前端基础-深入理解css盒模型

css盒模型是前端开发中非常基础和重要的知识,它是元素大小的呈现方式,它包括marginborderpaddingcontent,如图:

css盒模型

一、 box-sizing

css盒模型主要分为IE盒模型(border-box)、W3C标准盒模型(content-box)和padding-box。在声明DOCTYPE的情况下,box-sizing默认为W3C标准盒模型;若不声明,IE浏览器默认为IE盒模型(border-box),chrome和Firefox等默认为W3C标准盒模型(content-box)。

1.1 IE盒模型(border-box)

dom.width = content.width + padding-left + padding-right + border-left + border-right;
dom.height = content.height + padding-top + padding-bottom + border-top + border-bottom;

1.2 W3C标准盒模型(content-box)

dom.width = content.width;
dom.height = content.height;

1.3 padding-box

dom.width = content.width + padding-left + padding-right;
dom.height = content.height + padding-top + padding-bottom;

1.4 如何设置和获取盒模型对应的宽和高

  • dom.style.width/height -- 只能获取到内联style设置的宽和高
  • dom.currentStyle.width/height -- 只支持IE
  • Window.getComputeStyle(dom).width/height -- 支持Firefox和chrome
  • dom.getBoundingClientRect().width/height

二、内边距padding

padding是一个比较老实的属性,定义元素的内边距,接受长度值或百分比值,但不允许使用负值。有意思的是,padding的百分比值,是根据父元素的宽度设定的!在我们潜意识里可能认为,padding水平方向的百分比值应该是根据元素的宽度计算的,padding垂直方向的值应该是元素的高度,这是不对的!我在开发中,通常可以使用padding百分比的特性实现一个响应式的正方形。
padding属性通常包含在元素的实际的布局尺寸中,一般情况下padding的值不会影响元素的布局尺寸。但是padding属性值都特别大的时候呢?对于block元素,当box-sizing是border-box时候或者width:auto 元素width不会变,但当paddind大于width时,元素宽度会增加,元素内的文字会以內联元素的最小宽度显示;相对于inline水平元素,水平padding影响尺寸,垂直padding会影响尺寸,但会影响背景色。
许多标签元素都会有默认的padding值。button标签元素的padding兼容性特别差。。。

三、边框border

border是padding和margin中间的边框样式属性,目前支持10种border-style,其中最为常用的是solid(直线),还可以使用border-image来代替边框样式。border-width只接受长度值,不接受百分比值和负值,但是如果边框没有样式,就没有宽度。在开发中,我们可以利用border-width和border-color来实现许多的不规则图形。比如一个黄色的三角形:

{
    width: 0;
    height: 0;
    border: 0 solid transparent;
    border-left: 50px solid yellow;
}

四、外边距margin

margin就好像是元素的气场,气场有多大,别人就离你有多远了,是一个特别不老实的属性。margin可以接受任何长度单位,包括负值。

4.1 margin 负值

margin负值在不同方向的产生的效果不同。margin-top为负值不会增加高度,只会产生向上位移,margin-bottom为负值不会产生位移,会减少自身的高度。margin所产生的位移效果,不会脱离文档流。当元素不存在width属性或者width=auto的时候,margin负值会增加元素的宽度,我们可以使用这一特性实现等高布局的效果哦。

4.2 margin auto

auto就是自动意思。当元素为block元素,我们可以使用margin: auto实现元素水平方向居中。那么问题来了,为什么要是block元素?margin auto是什么意思?垂直方向为什么不居中呢?
我们知道block会自动填充父元素的宽度,但是不能自动填充父元素的高度。当元素能够自动填充父元素时,margin auto才能生效,auto = (father.width - content.width)/ 2,所以垂直方向不能产生居中的效果。如果设置writing-mode为垂直方向,block会自动填充父元素的高度,那么就可以实现垂直居中了。设置writing-mode产生一个方向的自动填充,如果需要水平和垂直方向都居中,就可以使用relative来产生两个方向的自动填充了!

4.3 margin 百分比值

margin的百分比值,也是根据父元素的宽度设定的!下面的代码可以实现一个2:1的长方形:

{
  width: 0;
  height: 0;
  margin: 50%;
}

诶?为什么padding:50%呈现出来的是正方形?margin呈现出来的是长方形呢?让我们来看看边距重叠吧!

4.4 边距重叠

为什么说margin是一个特别不老实的属性呢,很大一部分是因为边距重叠了。产生边距重叠的特性:

  • 不脱离文档流的block元素
  • 作用于writing-mode方向

发生边距重叠的情景:

  • 相邻的两个元素之间的margin
  • 父元素与第一个和最后一个子元素
  • 元素height = 0时 (4.3例子)

边距重叠的计算方法:

  • 正正负负取最大值
  • 负正相加

避免产生边距重叠的方法:

  • BFC(block formatting context)
  • margin-collapse: unset;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342