浮动
float的初衷
首先介绍引入float
属性的初衷:为了实现文字环绕图片的效果,就像下面的例子:
1 | <div style="width: 500px; border: 1px solid black;"> |
利用float布局
在此之后,人们开始利用float
属性进行布局,不过需要了解如下内容:
- 一定要为浮动元素设置宽度。
- 当前一个元素非浮动,后一个元素浮动时,浮动元素在原水平位置向左或向右浮动。
- 当前一个元素浮动,后一个元素也浮动时,后一个元素会在宽度允许的条件下与前一个元素挤在同一行。如果两个元素都是向左浮动,且前一个元素宽度过大导致两个元素无法放置在同一行,这个时候如果给后一个浮动元素设置适当的负的左边距,那么它会浮动上去与前一个元素发生重叠(默认后一个元素在上方)。
- 当前一个元素浮动,后一个元素非浮动时,如果后一个元素不是BFC,则会发生重叠。如果后一个元素是BFC,则不会发生重叠。
围住浮动元素
浮动元素脱离了文档流,其父元素也看不到它了,因而也不会包围它。
1 | <div style="width: 500px; border: 1px solid black;"> |
这个效果明显不是我们实际想要的,为了解决这个问题,介绍下面几种让父元素围住子元素的方法。
下面几种方案的效果都是一致的,如下所示:
利用overflow
1 | <div style="width: 500px; border: 1px solid black; overflow: hidden;"> |
同时浮动父元素
1 | <div style="width: 500px; border: 1px solid black; float: left;"> |
利用clear
clear
属性的值分别为:left
、right
和both
;clear
属性指定一个元素是否必须移动(清除浮动后)到它之前的浮动元素下方。
1 | <div style="width: 500px; border: 1px solid black;"> |
定位
position
属性有四个可选值:static
、relative
、absolute
、fixed
和sticky
,默认值为static
- 只有当
position
属性为relative
、absolute
、fixed
或sticky
时,top
、right
、bottom
和left
才会其作用。 top
、right
、bottom
和left
是根据盒模型进行设置的。- 如果使用百分比值设置
top
、right
、bottom
和left
,则是相对于最近的块级祖先元素的宽高来计算的。
静态定位
1 | <p>First Paragraph</p> |
相对定位
- 相对定位是元素相对于它原来在文档流中的位置定位;
- 可以使用
top
、right
、bottom
和left
来调整元素的位置; - 相对定位的元素仍然处于文档流中,它原来的位置会被保留。
1 | <p>First Paragraph</p> |
绝对定位
- 绝对定位会将元素从文档流中拿出来,它是相对于定位上下文进行定位的;
- 可以使用
top
、right
、bottom
和left
来调整元素的位置; - 绝对定位默认的定位上下文是
<body>
元素; - 如果绝对定位的祖先元素中有
position
属性值不为static
的元素,那么绝对定位就以其为定位上下文。
1 | <p>First Paragraph</p> |
固定定位
- 固定定位会将元素从文档流中拿出来,它是根据视口(浏览器窗口或手持设备的屏幕)进行定位的,所以在页面滚动时,它的位置也不会改变;
- 可以使用
top
、right
、bottom
和left
来调整元素的位置。
1 | <p>First Paragraph</p> |
粘性定位
- 粘性定位没有脱离正常的文档流。它可以看作是相对定位和固定定位的结合。
- 必须使用
top
、right
、bottom
或left
来设定一个阀值。 - 当距离没有达到阀值时显示效果与相对定位相同。当距离在阀值范围之内时,显示效果与固定定位相同。
- 粘性元素被最近的块级祖先元素限制着,即当块级祖先元素消失在BFC范围时,粘性元素也会随之消失。
这里我理解的还不够透彻,就不写demo了,想看效果可以去MDN
flex布局
Flexbox是一种布局方式,我们称之为弹性布局。设置了display: flex
的元素被称为容器(flex container),而它的子元素则称之为项目(flex item)。对于容器和项目,它们各自有着不同的CSS属性。
容器的属性
flex-direction
Flexbox中有两根轴:主轴和交叉轴。这两个轴代表什么取决容器上的flex-direction
属性,它共有四个可供选择的值:row
(默认)、row-reverse
、column
和column-reverse
。
justify-content
justify-content
属性用于定义项目在主轴上的对齐方式。
align-items
align-items
属性用于定义项目在交叉轴上的对齐方式。
align-content
align-content
属性用于定义多根轴线的对齐方式,如果项目只有一根轴线,该属性不起作用。
flex-wrap
flex-wrap
属性用于定义当主轴上项目过多时,是否允许折行。
flex-flow
flex-flow
属性是flex-direction
和flex-wrap
的简写形式。
项目的属性
order
order
属性用于定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow
flex-grow
属性用于定义项目的放大比例,默认为0,即就算存在剩余空间,也不放大。
flex-shrink
flex-shrink
属性用于定义项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
flex-basis
flex-basis
属性用于定义项目在未放大或缩小前,占据的主轴空间大小,默认为auto
,即项目本来的大小。
flex-basis
设置的是元素的border-box
,而不是content-box
。
flex
flex
属性是flex-grow
、flex-shrink
和flex-basis
的简写形式。
align-self
align-self
属性允许单个项目有与其他项目不一样的对其方式。可覆盖容器的align-items
属性。
column布局
CSS多列布局扩展块布局模式,以便更容易地定义多列文本
根据定义来看多列布局是为了定义文本的布局方式的,但实际上多列布局也可以应用于其他类型的元素上。看下面的例子,多列布局竟然能将元素以这种方式截断!
术业有专攻,还是将多列布局用于文本布局吧
column-count
:设置列数column-width
:设置期望最小列宽column-gap
:设置列之间的缝隙大小
CSS3多列规范需要列高平衡:即浏览器自动设置最大列高,因此每列中的内容高度大致相同。除此之外,也允许通过height
或max-height
属性来限制列高,在生成新的一列之前每一列都会仅允许增加到这个高度
display属性
none
:完全移除元素;inline
:将元素变为行内元素,它的height
和weight
将不会起作用;block
:将元素变为块级元素;inline-block
:将元素变成具有height
和weight
的行内元素;list-item
:元素表现得像是<li>
一样;table
:元素表现得像是<table>
一样;flex
:将元素变为flex container,其子元素变为flex item;inline-flex
:将元素变为行内flex container;grid
:将元素变为grid container。
元素层叠
- 元素层叠是相对的;
z-index
属性只有当对应元素的postion
属性不为static
时才有效。
下面的例子有助于理解元素层叠是相对的。
1 | <div id="outer"> |