CSS盒子模型,排版布局的基石

1 简介

在HTML中,有一个很重要的理论:块元素和行内元素。在CSS中极其重要的一个理论——CSS盒子模型。
在“CSS盒子模型”理论中,页面中的所有元素都可以看成一个盒子,并且占据着一定的页面空间。

一个页面由很多盒子组成,这些盒子之间会互相影响,因此掌握盒子模型需要从两个方面来理解:一是理解单独一个盒子的内部结构(往往是padding),二是理解多个盒子之间的相互关系(往往是margin)。

2 盒子模型概念

盒模型指的是网页元素的结构。当指定一个元素的宽度或高度时,便设置了元素内容的尺寸,可以把每个元素都看成一个盒子,盒子模型是由4个属性组成,号称“盒尺寸四大家族”:

  • content(内容区),可以是文本或图片 —— 变化多端
  • padding(内边距),用于定义内容与边框之间的距离 —— 温和向内
  • margin(外边距),用于定义当前元素与其它元素之间的距离 —— 激进对外
  • border(边框),用于定义元素的边框 —— 功勋卓越

此外,在盒子模型中,还有宽度(width)和高度(height)两大辅助性属性。记住,所有的元素都可以看成一个盒子
。如下图所示:

2.1 内容区

内容区是CSS盒子模型的中心,它呈现了盒子的主要信息内容,这些内容可以是文本、图片等多种类型。内容区是盒子模型必备的组成部分,其他3个部分都是可选的。
内容区有3个属性:width、height和overflow。使用width和height属性可以指定盒子内容区的高度和宽度。在这里注意一点,width和height这两个属性是针对内容区content而言的,并不包括padding部分。
当内容过多,超出width和height时,可以使用overflow属性来指定溢出处理方式。

2.2 内边距

内边距,指的是内容区和边框之间的空间,可以看成是内容区的背景区域。padding属性接受长度值或百分比值,但不允许使用负值。
关于内边距的属性有5种:padding-top、padding-bottom、padding-left、padding-right,以及综合了以上4个方向的简写内边距属性padding。使用这5种属性可以指定内容区与各方向边框之间的距离。

2.2.1 元素的尺寸

因为CSS中默认的box-sizing是content-box,所以使用padding会增加元素的尺寸。

.box {
   width: 80px;   
    padding: 20px;
}

如果不考虑其他CSS干扰,此时.box元素所占据的宽度就应该是120像素(80px+20px×2),这其实是不符合现实世界的认知的,人们总是习惯把代码世界和现实世界做映射,因此,新人难免会在padding的尺寸问题上踩到点坑。这也导致很多人乐此不疲地设置box-sizing
为border-box,甚至全局设置。

2.2.2 标签元素内置的padding

  • ol/ul列表内置padding-left,但是单位是px不是em。
  • 很多表单元素都内置padding。例如:所有浏览器/输入框内置padding;所有浏览器按钮内置padding;所有浏览器/单复选框无内置padding。

2.3 外边距

外边距,指的是两个盒子之间的距离,它可能是子元素与父元素之间的距离,也可能是兄弟元素之间的距离。外边距使得元素之间不必紧凑地连接在一起,是CSS布局的一个重要手段。
外边距的属性也有5种:margin-top、margin-bottom、margin-left、margin-right,以及综合了以上4个方向的简写外边距属性margin。
同时,CSS允许给外边距属性指定负数值,当外边距为负值时,整个盒子将向指定负值的相反方向移动,以此产生盒子的重叠效果,这就是传说中的“负margin技术”。

2.3.1 margin与元素尺寸

  • 元素的内部尺寸

只有元素是“充分利用可用空间”状态的时候,margin才可以改变元素的可视尺寸。比方说,如下CSS:

.header {
 width: 160px; 
  margin: 0 -5px;
}

此时元素宽度还是160像素,尺寸无变化。因为只要宽度设定,margin就无法改变元素尺寸,这和padding是不一样的。

但是,如果是下面这样的HTML和CSS:

<div class="header">
   <div class="son">
</div></div>
.header { width: 160px; }
.menu { margin: 0 -5px; }

则.menu元素的宽度就是165像素了,尺寸通过负值设置变大了,因为此时的宽度表现是“充分利用可用空间”。

  • 元素的外部尺寸

只要元素具有块状特性,无论有没有设置width/height,无论是水平方向还是垂直方向,即使发生了margin合并,margin对外部尺寸都着着实实发生了影响。

2.3.2 margin合并

块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距,这样的现象称为“margin合并”。

  • margin合并一般出现在以下3种场景:
    (1)相邻兄弟元素margin合并。这是margin合并中最常见、最基本的。
    (2)父级和第一个/最后一个子元素。
    (3)空块级元素的margin合并。
  • margin合并的计算规
    我把margin合并的计算规则总结为:“正正取大值”, “正负值相加” ,“负负最负值”。
  • margin合并的意义
    对于兄弟元素的margin合并其作用和em类似,都是让图文信息的排版更加舒服自然。
    父子margin合并的意义在于:在页面中任何地方嵌套或直接放入任何裸
    ,都不会影响原来的块状布局。
    是网页布局中非常常用的一个元素,其语义是没有语义,也就是不代表任何特定类型的内容,是一个通用型的具有流体特性的容器,可以用来分组或分隔。由于其作用就是分组的,因此,从行为表现上来看,一个纯粹的
    元素是不能够也不可以影响原先的布局的。
    自身margin合并的意义在于可以避免不小心遗落或者生成的空标签影响排版和布局。

2.3.3 margin:auto

margin:auto的填充规则如下。
(1)如果一侧定值,一侧auto,则auto为剩余空间大小。
(2)如果两侧均是auto,则平分剩余空间。

2.4 边框

在CSS盒子模型中,边框与我们之前学过的边框是一样的。
边框属性有border-width、border-style、border-color,以及综合了3类属性的简写边框属性border。

border属性总是能解决很多棘手的问题,在在图形构建、体验优化以及网页布局这块几大放异彩,,同时保证其良好的兼容性和稳定性。下面我们一起看看border都有哪些精彩的特性表现。

2.4.1 为什么border-width不支持百分比值

我们通过比对笔记本、手机发现,虽然两台设备的尺寸差异很大,但是边框的大小相比而言就可以忽略不计了。边框是不会因为设备大就按比例变大的。因此,如果支持百分比值,是不是就意味着设备大了边框也跟着变大?有一张图片,大片区域都是白色的,在白底背景上和文字混在一起,就会有一片奇怪的空白区域,会让人产生没对齐的假象,此时,我们给这张图片套个1px灰色边框,区域就明显了,对吧!设计的初衷就是为了这么点儿事,没有需要使用百分比值的场景。于是,综合这两点,造成了border-width不支持百分比值。

2.4.2 border与图形构建

border属性可以轻松实现兼容性非常好的三角图形效果,为什么可以呢?其底层原因受inset/outset
等看上去没有实用价值的border-style属性影响,边框3D效果在互联网早期其实还是挺潮的,那个时候人们喜欢有质感的东西,为了呈现逼真的3D效果,自然在边框转角的地方一定要等分平滑处理,然后不同的方向赋予不同的颜色。然后,这一转角规则也被solid类型的边框给沿用了。因此,我们就不难理解下面的4色边框的表现了:

div {
   width: 10px; height: 10px;    
	border: 10px solid;    
	border-color: #f30 #00f #396 #0f0;
}

运行一下上面的代码看一下效果吧!

2.4.3 border与透明边框技巧

这是提高用户体验的一个小技巧,尤其在移动端,我们的操作工具一般就是我们的手指,但是,我们的手指粗细可以媲美胡萝卜,而屏幕尺寸就那么点儿,如果我们正在走路,则一些精致的图标和按钮很容易就点不中甚至误点。

稳妥的方法是外部再嵌套一层标签,专门控制点击区域大小。如果对代码要求较高,则可以使用padding或者透明border增加元素的点击区域大小。

3 总结

现实生活中看到的盒子,有正方形、长方形、圆柱形等,依据形状特点,可包裹不同物件。CSS中的盒子虽然没有那么多的形状,但在视觉呈现上不同类型的盒子还是会有很大的不同,有的盒子要占据一行,有的盒子不能定义外边距、宽度和高度,有的盒子宽度和高度能自适应。CSS中用display指定盒类型(即框类型),常用的有 block(块)、inline(行内)、inline-block(行内块)、table(表格),以及CSS3新增的flexbox(伸缩盒)。
HTML 元素只有两种默认的盒类型,即块级元素(block-level element)和行内元素(inline-level element)。其中行内元素不可定义CSS属性width、height、上下margin和上下padding。常用的span和div分别是行内元素和块级元素。

由此可见,需要掌握的内容太多,要想学会所有布局相关的技术不太现实。高级的布局话题基于文档流和盒模型等概念,这些是决定网页元素的大小和位置的基本规则。因此理解和掌握如何设置元素的大小和位置至关重要。

4 最后的最后

为初学者提供学习指南,为从业者提供参考价值。我坚信码农也具有产生洞见的能力。关注【码农洞见】,一起学习和交流吧!

猜你喜欢

转载自blog.csdn.net/pangpengshuai/article/details/119538157
今日推荐