文章目录
学习链接
flex
使用display:flex,可以让一个元素变成弹性容器(flex容器),该元素中的直接子元素成为弹性项(flex项)
flex-direction
使用flex-direction可以控制flex容器的主轴的方向:垂直(从上至下,或从下至上) 或 水平(从左至右,或从右至左)
flex元素的自动宽度
未使用flex布局
/* flex.css */
body {
margin: 0;
}
.container {
border: 1px dashed black;
}
.item {
background-color: #46b0e0;
border: 2px solid #000;
border-radius: 4px;
}
<!-- flex.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./css/flex.css">
</head>
<body>
<div class="container">
<div class="item">item 1111111</div>
<div class="item">item 2</div>
<div class="item">item 3</div>
<div class="item">
item 4 <br />
item 4 <br />
item 4 <br />
</div>
<div class="item">item 5</div>
<div class="item">item 5</div>
</div>
</body>
</html>
宽度设置为max-content
子元素的宽度,会一直不换行,即使超出了父元素的宽度
宽度设置为min-content
min-content的宽度是这段文字中最长的单词的宽度
使用flex布局
使用display:flex,开启flex布局后,原本每个子元素都独占一行,现在每一个元素都有一个默认的宽度
,水平的排布到flex容器中。这里的默认宽度width就是max-content
当元素宽度远远超过flex容器的宽度时,元素的宽度就会默认变成min-content(min-content的宽度是这段文字中最长的单词的宽度)
flex元素宽度增大逻辑
flex-grow
指定flex元素的宽度
一般情况下,也可以直接使用width,如果定义了width,flex-basis:auto会直接拿width的值来用。
占满剩余宽度
使用flex-grow,指定flex元素的可获得的剩余宽度占比,设置该值后,当flex容器中还有剩余宽度时,将会把剩余宽度按照占比分配给各个flex元素。flex-grow默认值为0,即不占用剩余宽度。
设置flex元素宽度占比
将第一个元素的宽度设置为后面元素宽度的3倍,可以将flex-basis:0;然后使用flex-grow指定占比
但是,上面设置的占比有前提:默认的话,需要保证flex元素中的内容可读,width最小宽度是min-content(这样就会导致第一个元素并不是后面元素宽度的100倍)
但是如果一定要按照指定的占比的话,可以指定width,如下所示
flex元素宽度缩小逻辑
flex-shrink
默认收缩
收缩,但保证最小宽度
收缩也是有一个限制的,不能超过它的min-content
不收缩
flex简写属性
flex: grow shrink basis; ,默认是:flex:0 1 auto;
如果不写全,默认会不全,如下:
flex: 1; => flex:1 1 auto;
flex: 1 1; => flex:1 1 auto;
flex: 1 100px; => flex:1 1 100px;
flex: initial; => flex:0 1 auto;
flex: auto; => flex:1 1 auto;
flex: none; => flex:0 0 auto;
flex: 1 0px; /* 子元素等分父元素宽度,因为这里指定了flex-basis:0px; */
flex容器的交叉轴对齐
align-items
注意到,当我们未设置display:flex时,每个div独占一行,但是它们的行高不一致;当设置了display:flex时,div都排在一行,并且高度相等。
这是因为align-items默认为stretch,它决定元素在交叉轴上的对齐方式。
stretch
stretch的含义是:把所有的元素都拉成统一的行高,如果flex容器没有设置高度,则由其中行高最大的元素来定义,如果flex容器设置了高度,则每个元素会撑满整个高度。
flext-start
在交叉轴的起点对齐
flext-end
在交叉轴的终点对齐
center
baseline
不管字体大小基线是什么,它们统一由文字的基线来对齐
flex容器的主轴对齐
justify-content
该属性决定主轴的对齐方式,默认值为flex-start;
flex-start
主轴的起点对齐
flex-end
主轴的终点对齐
center
space-between
两边边缘对齐,中间间隔相等
space-around
每个元素左右两边间隔相等,两边不贴着边缘
space-evenly
元素与元素、元素与边缘之间间隔相等,两边不贴着边缘
flex元素的换行
flex-wrap
nowrap
默认值:flex-wrap:nowrap;即默认不换行
wrap
换行,保证每个子元素都是200px,当父元素宽度不够容纳子元素时,子元素会换行
wrap-reverse
不常用
flex多轴之间的对齐
align-content
normal
align-content的默认值是normal,效果默认与上面相同。
注意,多行子元素会把父元素指定的高度给占满(父容器的剩余高度,平分给子元素)。
flex-start
每行的高度,由最高的子元素决定
space-around
这个就让多行的交叉轴,多行的排布,有点类似主轴的那味了
space-between
这个就让多行的交叉轴,多行的排布,有点类似主轴的那味了
space-evenly
这个就让多行的交叉轴,多行的排布,有点类似主轴的那味了