flex-grow、flex-shrink、flex-basis和九宫格布局理解

2020-04-27 07:13:45易采站长站整理

在本例中,父元素宽度设为320px,通过计算,三个子元素比父元素的宽度多出了80px,按照缩小比例,div.item-1的宽度缩小80(1/5)=16px,div.item-2和div.item-3的宽度都缩小80(2/5)=32px,因此,三个子元素的最终宽度为84px,68px,168px,如下图所示:

二、九宫格布局

1)使用flex实现

HTML代码:


<div class="squ-4">
<div class="squ-inner flex">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
</div>

CSS代码:


.squ-4 {
position: relative;
width: 100%;
height: 0;
padding-bottom: 100%; /* padding百分比是相对父元素宽度计算的 */
margin-bottom: 30px;
}
.squ-4 .squ-inner {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; /* 铺满父元素容器,这时候宽高就始终相等了 */
}
.squ-4 .squ-inner>div {
width: calc(98% / 3);
height: calc(98% / 3);
margin-right: 1%;
margin-bottom: 1%;
overflow: hidden;
}
.squ-4 .flex {
display: flex;
flex-wrap: wrap;
}
.flex>div {
flex-grow: 1;
background-color: skyblue;
text-align: center;
color: #fff;
font-size: 50px;
line-height: 2;
}
.flex>div:nth-of-type(3n) {
margin-right: 0;
}
.flex>div:nth-of-type(n+7) {
margin-bottom: 0;
}

这里需要注意的是,为了使每个格子的宽和高都相等,div.item的外面包裹了两层父元素。最外一层div.squ-4使用height: 0和padding-bottom: 100%,因为padding百分比是相对于父元素宽度计算的,这个时候设置div.squ-inner元素的width: 100%和height: 100%,就能使该元素的宽高始终相等了。

2)使用Grid实现