CSS3弹性盒模型的布局理解

html-css025

CSS3弹性盒模型的布局理解,第1张

什么是flex布局?

传统的布局方案是基于盒模型,依赖于display:block和float+position,但是对于一些特殊的布局来说就不是很方便,如在盒模型中垂直居中。

2009年W3C提出一种新的布局方案,flex弹性盒布局,目前兼容的浏览器有chrome opera IE Firefox Sifari 

flex兼容浏览器版本

但是在未来flex布局将会成为布局的首选方案。

flex是flexinle BOX的缩写。意思是弹性布局,用来为盒模型提供最大的灵活性。    任何一个容器(标签)都可以指定为flex布局。用display:flex;

如果给容器设置flex的时候当前容器内子元素的float,clear,vericla-align都将会失效

flex的基本概念

容器默认存在两根轴:水平的主轴(main axis)和垂直交叉轴(cross axis).主轴的开始位置(与边框的交叉点)叫做main start, 结束位置叫做main end 交叉轴的开始位置叫做cross start ,结束位置叫做cross end.项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴叫做cross size.

如果给一个元素设置为flex后,这个元素就会作为子元素的flex容器。通过给容器设置属性来改变里面子元素的位置。

首先要给父元素添加display:flex;将父元素转化为弹性盒

2.用flex-direction来改变盒子里元素的位置

row 默认在一行内排列(从左向右)

row-reverse:反转横向排列(右对齐,从后往前排,最后一项排在最前面。)

column :纵向排列。

column-reverse:反转纵向排列,从下往上排,最后一项排在最上面

3.内容对齐(justify-content)属性应用在 弹性容器 上,把弹性项沿着弹性容器的主轴线(main axis)对齐

justify-content:flex-start 默认,左对齐(图1)

justify-content:flex-end 右对齐(图2)

justify-content:center 居中对齐(图3)

justify-content:space-between 两端对齐,中间自动分配

justify-content:space-around 自动分配距离

主轴对齐方式

4.align-items(交叉轴对齐方式)

flex-start:顶端对齐

flex-end:底对齐

center:垂直居中对齐

baseline:项目内文本的底线对齐

stretch  默认值    项目的高度自适应容器(注:子元素不能设置高)

交叉轴对齐方式

5.flex-wrap

该属性控制flex容器是单行或者多行,同时横轴的方向决定了新行堆叠的方向。

  nowrap:flex容器为单行。该情况下flex子项可能会溢出容器

  wrap:flex容器为多行。该情况下flex子项溢出的部分会被放置到新行,子项内部会发生断行

  wrap-reverse:反转 wrap 排列。

图1(nowrap)注意如果父元素盒设置宽度会自动缩子元素容器宽度

图2(wrap)

图3(warp-reverse)

容器单行或者多行方式

 6、align-content(行与行之间对齐方式)

当伸缩容器的侧轴还有多余空间时,本属性可以用来调整「伸缩行」在伸缩容器里的对齐方式,这与调整伸缩项目在主轴上对齐方式的 <‘ justify-content’>属性类似。 注:本属性在只有一行的伸缩容器上没有效果。

flex-start没有行间距

flex-end底对齐没有行间距

center居中没有行间距

space-between两端对齐,中间自动分配

space-around自动分配距离

在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规则里添加:

div

所谓<div>标签我们可以理解为一个盒子。

例如:<div class="top" style='border:1px solid #000background-color:#EEE'>这里是Top</div

border:1px solid #000(这是把边框显示出来,方便我们布局)。

background-color:#EEE(这是背景色设置,#EEE为颜色值)。

div的设置属性有很多,我就大致说一下。

这里可以设置一下字体居中,字体距离上下边框的距离。

text-align:center(文字横向居中)

padding:30px(字体距离上下左右边框的距离,因为左右已经超出了30px,所以这个30px就对左右不起限制作用了。)

同样的道理,我们可以设置一部分的布局了。

布局一个中间层。

<div class="container" style='border:1px solid #000background-color:#ffetext-align:centerpadding:30px 0px'><div class="left"style='float:rightwidth:80%border:1px solid #000height:600px'>左边</div><div class="right"style='width:20%border:1px solid #000height:600px'>右边</div></div>

<--!

float:right向右浮动

width:80%宽度为整个屏幕的80%

border:1px solid #000边框,方便查看。

height:600px高度为600px。

-->

如果想像我的效果图一样铺满整个屏幕可以加入以下代码。

<style type="text/css">body{height:100% margin:0pxpadding:0px}</style>每个div,都有父容器。body就是最根源的父容器。只有把body设置为100%就可以满屏幕。