今天主要更新的内容就是弹性布局,前端最最主要的就是布局了,页面的还原度,这里不得不提到弹性布局,这种布局是目前比较流行的一种,下面跟随我的步伐去学习一下弹性布局吧👇👇👇
1.支持的浏览器
从上面可以看出,各个主流的浏览器都支持flex布局
2.弹性布局的属性
float, clear and vertical-align 在flex项目中不起作用
display: flex | inline-flex; (适用于父类容器元素上)
flex:将对象作为弹性伸缩盒显示。
inline-flex:将对象作为内联块级弹性伸缩盒显示。
<style>
.father {
margin-top: 100px;
background-color: pink;
/* display: flex; */
display: inline-flex;
}
.son {
width: 100px;
height: 100px;
border: 1px solid red;
}
</style>
<body>
<div class="father">
<div class="son"></div>
<div class="son"></div>
<div class="son"></div>
</div>
</body>
从上面可以看出,父级不设置宽高,子级宽高已知的情况下:
display:flex;父级宽度100%,高度自适应;
display: inline-flex; 父级宽度高度自适应
flex-direction (适用于父类容器的元素上)
语法: flex-direction: row | row-reverse | column | column-reverse
row:横向从左到右排列(左对齐),默认的排列方式。
row-reverse:反转横向排列(右对齐,从后往前排,最后一项排在最前面。
column:纵向排列。
column-reverse:反转纵向排列,从后往前排,最后一项排在最上面。
<style>
* {
margin: 0;
padding: 0;
}
.father {
margin-top: 100px;
background-color: pink;
display: flex;
/* 默认 */
/* flex-direction: row ; */
flex-direction: column-reverse;
/* 纵向排列 */
/* flex-direction: column; */
}
.son {
width: 100px;
height: 100px;
border: 1px solid red;
}
</style>
<body>
<div class="father">
<div class="son"></div>
<div class="son"></div>
<div class="son"></div>
</div>
</body>
纵向排列
横向倒叙
纵向倒叙
flex-wrap (适用于父类容器上)
语法:flex-wrap: nowrap | wrap | wrap-reverse
nowrap:当子元素溢出父容器时不换行 默认。
wrap:当子元素溢出父容器时自动换行。
wrap-reverse:反转 wrap 排列。
<style>
.father {
width: 600px;
margin-top: 100px;
background-color: pink;
display: flex;
/* 不换行,此时子级宽度大于父级宽度,以父级宽度为准,
子级宽度自适应 */
/* flex-wrap: nowrap; */
/* 换行 */
/* flex-wrap: wrap; */
/* 倒叙换行 */
flex-wrap: wrap-reverse;
}
.son {
width: 210px;
height: 100px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="father">
<div class="son">a</div>
<div class="son">b</div>
<div class="son">c</div>
</div>
flex-flow (适用于父类容器上)
语法:flex-flow: <‘flex-direction’> || <‘flex-wrap’>
[ flex-direction ]:定义弹性盒子元素的排列方向。
[ flex-wrap ]:定义弹性盒子元素溢出父容器时是否换行。
flex-flow是一个复合属性,第一个值是flex-direction的属性,第二个值是flex-wrap的属性,这里只写一个简单的例子方便理解
<style>
* {
margin: 0;
padding: 0;
}
.father {
margin-top: 100px;
background-color: pink;
width: 600px;
display: flex;
/* 复合属性:方向,是否换行 */
flex-flow: column wrap-reverse;
}
.son {
width:200px;
height: 100px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="father">
<div class="son">a</div>
<div class="son">b</div>
<div class="son">c</div>
</div>
</body>
justify-content (适用于父类容器上)
语法:justify-content: flex-start | flex-end | center | space-between | space-around
flex-start:弹性盒子元素将向行起始位置对齐。该行的第一个子元素的主起始位置的边界将与该行的主起始位置的边界对齐,同时所有后续的伸缩盒项目与其前一个项目对齐。
flex-end:弹性盒子元素将向行结束位置对齐。该行的第一个子元素的主结束位置的边界将与该行的主结束位置的边界对齐,同时所有后续的伸缩盒项目与其前一个项目对齐。
center:弹性盒子元素将向行中间位置对齐。该行的子元素将相互对齐并在行中居中对齐,同时第一个元素与行的主起始位置的边距等同与最后一个元素与行的主结束位置的边距(如果剩余空间是负数,则保持两端相等长度的溢出)。
space-between:弹性盒子元素会平均地分布在行里。如果最左边的剩余空间是负数,或该行只有一个子元素,则该值等效于’flex-start’。在其它情况下,第一个元素的边界与行的主起始位置的边界对齐,同时最后一个元素的边界与行的主结束位置的边距对齐,而剩余的伸缩盒项目则平均分布,并确保两两之间的空白空间相等。
space-around:弹性盒子元素会平均地分布在行里,两端保留子元素与子元素之间间距大小的一半。如果最左边的剩余空间是负数,或该行只有一个伸缩盒项目,则该值等效于’center’。在其它情况下,伸缩盒项目则平均分布,并确保两两之间的空白空间相等,同时第一个元素前的空间以及最后一个元素后的空间为其他空白空间的一半。
<style>
* {
margin: 0;
padding: 0;
}
.father {
margin-top: 100px;
background-color: pink;
display: flex;
/* 默认 */
/* justify-content: flex-start; */
/* 向行结束位置对齐 */
/* justify-content: flex-end; */
/* 居中对齐 */
/* justify-content: center; */
/* 平均地分布在行里 */
/* justify-content: space-between*/
/* 平均地分布在行里,两端保留子元素与
子
元素之间间距大小的一半 */
justify-content: space-around;
}
.son {
width:200px;
height: 100px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="father">
<div class="son">a</div>
<div class="son">b</div>
<div class="son">c</div>
</div>
</body>
align-items (适用于父类容器上) :属性定义项目在交叉轴上如何对齐。
语法:align-items: flex-start | flex-end | center | baseline | stretch
flex-start:弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴(纵轴)起始边界。
flex-end:弹性盒子元素的侧轴(纵轴)结束位置的边界紧靠住父容器的侧轴结束边界。
center:弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。
baseline:如弹性盒子元素的行内轴与侧轴为同一条,则该值与’flex-start’等效。其它情况下,该值将参与基线对齐。
stretch:如果指定侧轴大小的属性值为’auto’,则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照’min/max-width/height’属性的限制。
<style>
* {
margin: 0;
padding: 0;
}
.father {
width: 700px;
height: 500px;
margin-top: 10px;
background-color: pink;
display: flex;
/* 交叉轴的起点对齐 */
/* align-items: flex-start; */
/* 交叉轴的终点对齐 */
/* align-items: flex-end; */
/* 交叉轴的中点对齐 */
/* align-items: center; */
/* /项目的第一行文字的基线对齐 */
/* align-items: baseline; */
/* 如果项目未设置高度或设为auto,
将占满整个容器的高度。 */
align-items: stretch;
}
.son1 {
width: 100px;
/* height: 100px; */
border: 1px solid red;
/* font-size: 20px; */
}
.son2{
border: 1px solid red;
width: 200px;
/* height: 300px; */
/* font-size: 60px; */
}
.son3{
border: 1px solid red;
width: 300px;
/* height: 200px; */
/* font-size: 100px; */
}
</style>
</head>
<body>
<div class="father">
<div class="son1">a</div>
<div class="son2">b</div>
<div class="son3">c</div>
</div>
</body>
交叉轴的起点对齐
交叉轴的终点对齐
交叉轴的中点对齐
项目的第一行文字的基线对齐
如果项目未设置高度或设为auto,将占满整个容器的高度。
align-content (适用于父类容器上)
属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
语法:align-content: flex-start | flex-end | center | space-between | space-around | stretch
flex-start:各行向弹性盒容器的起始位置堆叠。弹性盒容器中第一行的侧轴起始边界紧靠住该弹性盒容器的侧轴起始边界,之后的每一行都紧靠住前面一行。
flex-end:各行向弹性盒容器的结束位置堆叠。弹性盒容器中最后一行的侧轴起结束界紧靠住该弹性盒容器的侧轴结束边界,之后的每一行都紧靠住前面一行。
center:各行向弹性盒容器的中间位置堆叠。各行两两紧靠住同时在弹性盒容器中居中对齐,保持弹性盒容器的侧轴起始内容边界和第一行之间的距离与该容器的侧轴结束内容边界与第最后一行之间的距离相等。(如果剩下的空间是负数,则各行会向两个方向溢出的相等距离。)
space-between:各行在弹性盒容器中平均分布。如果剩余的空间是负数或弹性盒容器中只有一行,该值等效于’flex-start’。在其它情况下,第一行的侧轴起始边界紧靠住弹性盒容器的侧轴起始内容边界,最后一行的侧轴结束边界紧靠住弹性盒容器的侧轴结束内容边界,剩余的行则按一定方式在弹性盒窗口中排列,以保持两两之间的空间相等。
space-around:各行在弹性盒容器中平均分布,两端保留子元素与子元素之间间距大小的一半。如果剩余的空间是负数或弹性盒容器中只有一行,该值等效于’center’。在其它情况下,各行会按一定方式在弹性盒容器中排列,以保持两两之间的空间相等,同时第一行前面及最后一行后面的空间是其他空间的一半。
stretch:各行将会伸展以占用剩余的空间。如果剩余的空间是负数,该值等效于’flex-start’。在其它情况下,剩余空间被所有行平分,以扩大它们的侧轴尺寸。
<style>
* {
margin: 0;
padding: 0;
}
.father {
margin-top: 10px;
height: 500px;
background-color: pink;
display: flex;
flex-wrap: wrap;
/* 与交叉轴的起点对齐 */
/* align-content: flex-start ; */
/* 与交叉轴的终点对齐 */
/* align-content: flex-end ; */
/* 与交叉轴的中点对齐。 */
/* align-content: center; */
/* 与交叉轴两端对齐,轴线之间的间隔平均
分布。 */
/* align-content:space-between; */
/* 每根轴线两侧的间隔都相等。所以,
轴线之间的间隔比轴线与边框的间隔大一倍*/
/* align-content:space-around; */
/*默认 :轴线占满整个交叉轴。 */
align-content: stretch;
}
.son {
width:200px;
height: 100px;
margin-right: 20px;
margin-top: 10px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="father">
<div class="son">a</div>
<div class="son">b</div>
<div class="son">c</div>
<div class="son">d</div>
<div class="son">e</div>
<div class="son">f</div>
<div class="son">g</div>
</div>
与交叉轴的起点对齐
与交叉轴的终点对齐
与交叉轴的中点对齐。
与交叉轴两端对齐,轴线之间的间隔平均分布。
每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
默认 轴线占满整个交叉轴。
order (适用于弹性盒模型容器子元素)
语法:order: integer(integer:用整数值来定义排列顺序,数值小的排在前面。可以为负值。)
<style>
.father{
background-color: pink;
display: flex;
}
.son{
width: 200px;
height: 100px;
margin-top: 10px;
margin-right: 20px;
border: 1px solid red;
}
.son1{
order: 5;
}
.son2{
order: -1;
}
.son3{
order: 3;
}
.son4{
order:4;
}
.son5{
order: 1;
}
</style>
</head>
<body>
<div class="father">
<div class="son son1">1:order是5</div>
<div class="son son2">2:order是-1</div>
<div class="son son3">3:order是3</div>
<div class="son son4">4:order是4</div>
<div class="son son5">5:order是1</div>
</div>
</body>
flex-grow (适用于弹性盒模型容器子元素)
语法:flex-grow: number (default 0)
flex-grow的默认值为0,如果没有显示定义该属性,是不会拥有分配剩余空间权利的。本例中b,c两项都显式的定义了flex-grow,可以看到总共将剩余空间分成了4份,其中b占1份,c占3分,即1:3
<title>flex-grow</title>
<style>
.father{
background-color: pink;
display: flex;
width: 600px;
}
.son{
width:100px;
height: 100px;
border: 1px solid red;
}
.son3{
flex-grow: 1;
}
</style>
</head>
<body>
<div class="father">
<div class="son son1">1</div>
<div class="son son2">2</div>
<div class="son son3">3</div>
<div class="son son4">4</div>
<div class="son son5">5</div>
</div>
</body>
flex-shrink (适用于弹性盒模型容器子元素)
语法:flex-shrink: number (default 1)
flex-shrink的默认值为1,如果没有显示定义该属性,将会自动按照默认值1在所有因子相加之后计算比率来进行空间收缩。
本例中c显式的定义了flex-shrink,a,b没有显式定义,但将根据默认值1来计算,可以看到总共将剩余空间分成了5份,其中a占1份,b占1份,c占3分,即1:1:3
我们可以看到父容器定义为400px,子项被定义为200px,相加之后即为600px,超出父容器200px。那么这么超出的200px需要被a,b,c消化
按照以上定义a,b,c将按照1:1:3来分配200px,计算后即可得40px,40px,120px,换句话说,a,b,c各需要消化40px,40px,120px,那么就需要用原定义的宽度相减这个值,最后得出a为160px,b为160px,c为80px
<style>
.father{
background-color: pink;
display: flex;
width:400px;
}
.son{
width:200px;
height: 100px;
border: 1px solid red;
}
.son3{
flex-shrink: 2;
}
</style>
</head>
<body>
<div class="father">
<div class="son son1">1</div>
<div class="son son2">2</div>
<div class="son son3">3</div>
</div>
</body>
flex-basis (适用于弹性盒模型容器子元素)
语法:flex-basis: length | auto (default auto)
auto:无特定宽度值,取决于其它属性值
length:用长度值来定义宽度。不允许负值
percentage:用百分比来定义宽度。不允许负值
// An highlighted block
var foo = 'bar';
flex (适用于弹性盒模型子元素)
复合属性。设置或检索伸缩盒对象的子元素如何分配空间。 如果缩写flex:1, 则其计算值为:1 1 0
语法:flex:none | [ flex-grow ] || [ flex-shrink ] || [ flex-basis ]
none:none关键字的计算值为: 0 0 auto
[ flex-grow ]:定义弹性盒子元素的扩展比率。
[ flex-shrink ]:定义弹性盒子元素的收缩比率。
[ flex-basis ]:定义弹性盒子元素的默认基准值。
<style>
.father{
background-color: pink;
display: flex;
width:800px;
}
.son{
width:100px;
height: 100px;
border: 1px solid red;
}
.son3{
/* 指定宽度 */
/* flex-basis: 600px; */
/* 默认 */
/* flex-basis: auto; */
flex-basis: 50%;
}
</style>
</head>
<body>
<div class="father">
<div class="son son1">1</div>
<div class="son son2">2</div>
<div class="son son3">3</div>
<div class="son son4">4</div>
<div class="son son5">5</div>
</div>
align-self (适用于弹性盒模型子元素):设置或检索弹性盒子元素自身在侧轴(纵轴)方向上的对齐方式。
语法:align-self: auto | flex-start | flex-end | center | baseline | stretch
auto:如果’align-self’的值为’auto’,则其计算值为元素的父元素的’align-items’值,如果其没有父元素,则计算值为’stretch’。
flex-start:弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。
flex-end:弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界。
center:弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。
baseline:如弹性盒子元素的行内轴与侧轴为同一条,则该值与’flex-start’等效。其它情况下,该值将参与基线对齐。
stretch:如果指定侧轴大小的属性值为’auto’,则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照’min/max-width/height’属性的限制。
<style>
.father{
background-color: pink;
display: flex;
height: 200px;
}
.son{
margin-right: 40px;
}
.son1{
width: 50px;
height: 50px;
background-color: #f6f6f6;
align-self: flex-end;
font-size: 20px;
}
.son2{
width: 30px;
height: 40px;
background-color:red ;
align-self: center;
font-size: 30px;
}
.son3{
width: 40px;
height: 40px;
background-color:rgb(74, 248, 89) ;
align-self: flex-start;
font-size: 40px;
}
.son4{
width:160px;
height: 150px;
font-size: 50px;
background-color:rgb(56, 40, 196) ;
align-self: baseline;
}
.son5{
font-size: 60px;
align-self: stretch;
background-color:rgba(44, 196, 102, 0.397) ;
}
.son6{
align-self: auto;
width: 170px;
height: 170px;
font-size:70px;
background-color:rgba(44, 196, 102, 0.397) ;
}
</style>
</head>
<body>
<div class="father">
<div class="son son1">son1</div>
<div class="son son2">son2</div>
<div class="son son3">son3</div>
<div class="son son4">son4</div>
<div class="son son5">son5</div>
<div class="son son6">son6</div>
</div>
</body>
以上就是弹性布局经常使用的属性了,欢迎纠错,补充评论