CSS布局相关——盒模型和浮动

html-css022

CSS布局相关——盒模型和浮动,第1张

在CSS中,所有元素被“ 盒子 ”所包围,利用盒模型的基本原理来实现CSS准确布局,元素排列等处理

CSS广泛使用的两种盒子,其在页面流和元素之间的关系表现为不同的行为:

对于定义为块级盒子(block)的元素会表现出以下行为:

对于定义为内联盒子(inline)的元素会表现出以下行为:

通过对盒子设置display的属性值,来控制盒子的外部显示类型

外部显示类型与内部显示类型

外部显示类型:决定盒子是块级还是内联,即决定了盒子之间的布局方式

内部显示类型:决定了盒子内部的元素是如何布局的,默认情况是按照正常文档流布局,也可以通过设置display值为flex和grid来改变内部元素之间的布局方式

不同显示类型的例子

block:

图中段落里的 <span>word </span>被设置为 display:block

因此其独占一行,宽度填满整个父元素

flex:

图中的列表被设置为 display:block ,每个列表是一个块级元素 —— 像段落一样 —— 会充满整个容器的宽度并且换行

inline-flex与inline

图中的列表被设置为 display:inline-flex ,使得在一些flex元素外创建一个内联框

最后设置两个段落为 display: inline , inline flex 容器和两个段落在同一行上,而不是像块级元素一样换行

CSS组成一个盒模型需要以下几个部分:

在标准模型中,如果你给盒设置 width 和 height,实际设置的是 content box。 padding 和 border 再加上设置的宽高一起决定整个盒子的大小

如果使用标准模型宽度 = 410px (350 + 25 + 25 + 5 + 5),高度 = 210px (150 + 25 + 25 + 5 + 5),padding 加 border 再加 content box

如果使用替代模型,一切都将变得简单很多,此时的 width 和 height 就是盒子可见的宽度与高度,无论怎么改变 padding 或 border 的值,都会通过压缩 conten box 的大小来保持 width 和 height 的值不变

如需使用,只需要声明以下CSS样式:

外边距是盒子周围一圈看不到的空间。它会把其他元素从盒子旁边推开。 外边距属性值可以为正也可以为负。设置负值会导致和其他内容重叠。无论使用标准模型还是替代模型,外边距总是在计算可见部分后额外添加

CSS:

html:

结果如下:因为上外边距设置为负值,所以两个边框会重叠

外边距折叠

理解外边距的一个关键是外边距折叠的概念。如果你有两个外边距相接的元素,这些外边距将合并为一个外边距,即最大的单个外边距的大小

结果如下,中间间隔的部分为50px

如下图所示,对内联盒子设置 width 和 height 都不会生效,虽然margin,padding和border会生效,但不会改变与其它内联盒子的关系,因此其内边距和边框会与段落的其它元素重叠

要避免上述情况,只需要将内联盒子的display值设置为inline-block即可

设置之后的效果为:

但因其保留有inline的特征,所以它不会跳转到新行

float可以使得当前元素脱离正常文本流,并吸附到父元素的左边(left)或者右边(right)正常布局中位于该浮动元素之下的内容,此时会围绕着浮动元素进行排列

基本的常见用途在于图片与文字环绕排版以及首字母下沉:

重点是这个,元素浮动具有一定的规则与限制

设置如下三个盒子(均以块级元素方式呈现):

将box1设置为向右浮动:

因为box1脱离正常文档流,所以box2和box3会向上填补box1的空位,box1浮动到父元素(body)的最右边

设置box1向左浮动:

同理,box1脱离正常文档流,box2与box3向上填补box1的空位,此时box1浮动到父元素(body)的最左边,所以会覆盖掉box2(浮动元素在正常流文档的上方)

设置box2向左浮动:

可以看到box3因为box2脱离正常文档流而向上填充其空位,box2因为浮动到左边覆盖了box3,然而box1仍处于正常文档流中,并且在html文件中最先声明,所以box2只能在box1的下方进行浮动(即使box2设置为向右浮动也是一样)

设置box1、box2与box3都向左浮动:

可以看到三个盒子均向左浮动,直到碰到前一个浮动框的边缘为止(对于box1来说是碰到父元素的边缘),因此呈现如此的排列状况

如果当父元素太窄,无法包含三个盒子的宽度,则无法容纳的元素向下移动,直到有足够的空间使得其能向某个方向浮动,如下图所示:

如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”

相关参考:

https://zhuanlan.zhihu.com/p/21286019?refer=miaomiaoji

https://www.jianshu.com/p/fe1052f1a8b6

浮动的规则先讨论到此

高度塌陷

在父元素container内设置一个盒子box1,此时没有设置浮动,box1会撑起父元素container的高度

如果此时设置box1浮动,因为其脱离了正常文档流,无法撑起盒子的高度,所以将发生高度塌陷:

为了解决这个问题,在此提供三种方法:

1. 添加额外标签

首先在父元素内添加空白内容的额外标签clearfix

然后再CSS规则中添加以下内容:

通过清除父元素内空白元素的浮动,使得父元素边框重新包含浮动内容

2. 父级元素添加overflow属性

直接在父元素内添加overflow属性:

同样可以清除浮动,结果如下:

3. after伪元素

html文档改为:

在CSS规则里添加:

属性值

float 是最开始出现的一种布局方式,主要解决:文本在图像周围环绕,也即应用于图像。但是在css中,任何元素都可以浮动, 浮动元素会生成一个块级框 ,而不论它本身是何种元素。

元素一般是处于普通流中,也即块级元素独占一行,从上往下依次显示布局。行级元素可以在一行显示多个,按照顺序进行显示布局。

而添加了 float 布局的元素则会脱离原来所在的文档流。并 ‘漂浮’ 在当前所在的文档流的位置(如果前一个元素没有添加 float 布局的情况下),由于当前元素文档流实际上没有被元素占用,因此当前元素之后的元素会按照普通流布局的方式,占用当前元素的文档流。表现为: 丢失空间

也即:

此时由于第一个元素添加了 float:left ,则脱离了原来的文档流,后面元素会向上移动,占用第一个元素的空间。

如果第二个元素也添加了 float ,那么可以这样去思考,由于第一个元素的原因,第二个元素所处的文档流变成了第一个元素所处的文档流,此时再给第二个元素添加 float ,那么也会像第一个元素一样,脱离当前的文档流,使得当前元素和第一个元素一样处于 '漂浮' 状态,并紧跟着第一个元素显示一排。

同样,如果第二个元素后面还有其他元素,那么也会向上移动,改变原来所处的文档流位置。

注意:添加了 float 的元素,只是在会脱离当前所在的文档流,但是仍然漂浮在当前文档流 上一层 ,而不是说直接脱离整个文档流,跑到所有文档流的最顶部

从上面案例可以看出,添加了浮动的元素会影响其后元素的布局。此外由于元素脱离原来的文档流,且父盒子没有添加高度属性,那么父盒子无法感知到子盒子的存在,因此父盒子不会被撑开。

知道了 float 带来的不好的地方,则需要去清除浮动带来的影响。

方法一:采用css clear 属性

将该属性添加在被浮动影响的后面元素,即可以清除浮动

则受浮动影响的元素就可以正常显示了

因此在受浮动影响的父元素,就可以利用此方法,在浮动元素之后新增加一个元素,使新增加的元素清除浮动,这样新增加的元素的位置就在浮动元素的下面,使得在一定程度上实现了撑开盒子的作用。

方法二:BFC

其次还可以采用BFC,使得父元素形成独立的空间,也即可以感知子元素的高度和宽度,在一定程度上也不会影响外面的元素的布局。

浮动元素边界不能超过父元素的padding

元素浮动后会变为块元素包括行元素如 span ,所以浮动后的元素可以设置宽高。

通过形状浮动可以让内容围绕图片,类似于我们在word 中的环绕排版。要求图片是有透明度的PNG格式。

shape-outside 定义了一个可以是非矩形的形状,相邻的内联内容应围绕该形状进行包装。默认情况下,内联内容包围其边框, shape-outside 提供了一种自定义此包装的方法,可以将文本包装在复杂对象周围而不是简单的框中。

理解:使用形状值来定义浮动区域的浮动,这将使得内联内容会环绕着形状,而不是产生浮动的边框。

关键字属性值

函数值属性

url值

文字通过给定的图片,并且通过计算图片的透明度后获取的形状区域进行围绕,这里需要注意的是此效果必须在服务器端预览,本地预览会报图片跨域问题,给定的图片必须是有透明区域的图片

渐变值

按照给定的渐变通过计算排除透明通道后得到的形状,然后文字按照此形状的边缘进行环绕

最后:函数值/url/linear-gradient可以和关键字属性值搭配使用,此时关键字属性作为基本形状提供相应的参考框盒。

clip-path 使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。且此方式原来的区域仍然存在,只是显不显示的问题。裁剪之后只有规定的区域可以显示。

基本语法

其中: