flex布局对齐方式设置space-between,将最后一行元素左对齐
给盒子设置 justify-content: space-between , 可以均匀排列盒子中的每个元素,首个元素放置于起点,末尾元素放置于终点。达到左右对齐的效果。
但当最后一行元素不能铺满盒子时,会在盒子中均分排列,效果并不是我们需要的。
盒子设置flex布局, 对齐方式设置 justify-content: space-between时,将最后一行元素左对齐,有一下几种方法:
1. 使用占位元素:
特点:适用于任意列数布局,比较简单,缺点是会产生空标签
方案:使用循环体循环一整行空元素。宽度为单个元素宽度,高度为0
code
html
<ul> <li></li> <li></li> <li></li> <li></li> <li></li> <!-- 假设一行有5列,即5个元素 --> <li v-for="item in 5" :key="item" class="temp"></li> </ul>
复制
css
ul { display: flex; flex-wrap: wrap; justify-content: space-between; } li { width: 18%; margin-bottom: 20px; height: 200px; background: pink; } .temp { width: 18%; height: 0; margin: 0; }
复制
效果
2. 给父级元素后面添加伪元素
特点:只针对三列布局
方案:通过 ::after 选择器,给父元素添加伪元素
code
<ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul>
复制
css
ul { display: flex; flex-wrap: wrap; justify-content: space-between; } li { width: 30%; margin-bottom: 20px; height: 200px; background: pink; } ul:after { content: ''; width: 30%; }
复制
效果
3. 计算方式
特点:适用于每一行列数固定,且列宽度固定,需要进行计算,相比较复杂
方案: 对于最后一行的元素动态设置margin-right。判断如果最后一个元素处于当前列,会发生布局错乱,则设置元素的 margin-right 为剩余空间的大小(剩余列宽度+剩余间隙大小)。假设元素宽度是$width,总间隙是 $space(盒子宽度-元素宽度*列数)。
计算公式: margin-right: calc( ($space / 间隙数) * 剩余列数 + $width * 剩余列数 )
三列布局
计算方法:
最后一个元素所处列数 | 剩余空间 | margin-right |
---|---|---|
第二列(li:last-child:nth-child(3n - 1)) | 第三个元素宽度+剩余间隙 | ($space / 2) * 1 + $width * 1 |
code
/* 三列布局,li宽度为30%,则剩余间隙:100% - 30% * 3 = 10% */ /* 如果最后一行是2个元素 calc(10% / 2 * 1 + 30% * 1) 可简化 */ ul>li:last-child:nth-child(3n - 1) { margin-right: calc(10% / 2 + 30%) }
复制
四列布局
计算方法:
最后一个元素所处列数 | 剩余空间 | margin-right |
---|---|---|
第二列(li:last-child:nth-child(4n - 2)) | 第三个元素宽度+第四个元素宽度+剩余间隙 | ($space / 3) * 2 + $width * 2 |
第三列(li:last-child:nth-child(4n - 1)) | 第四个元素宽度+剩余间隙 | ($space / 3) * 1 + $width * 1 |
code
/* 四列布局,li宽度为22%,则剩余间隙:100% - 22% * 4 = 12% */ /* 如果最后一行是2个元素 calc(12% / 3 * 2 + 22% * 2) 可简化 */ ul>li:last-child:nth-child(4n - 2) { margin-right: calc(24% / 3 + 44%) } /* 如果最后一行是3个元素 calc(12% / 3 * 1 + 22% * 1) 可简化 */ ul>li:last-child:nth-child(4n - 1) { margin-right: calc(12% / 3 + 22%) }
复制
5列布局
计算方法:
最后一个元素所处列数 | 剩余空间 | margin-right |
---|---|---|
第二列(li:last-child:nth-child(5n - 3)) | 第三个元素宽度+第四个元素宽度+第五个元素宽度+剩余间隙 | ($space / 4) * 3 + $width * 3 |
第三列(li:last-child:nth-child(5n - 2)) | 第四个元素宽度+第五个元素宽度+剩余间隙 | ($space / 4) * 2 + $width * 2 |
第四列(li:last-child:nth-child(5n - 1)) | 第五个元素宽度+剩余间隙 | ($space / 4) * 1 + $width * 1 |
code
/* 五列布局,li宽度为18%,则剩余间隙:100% - 18% * 5 = 10% */ /* 如果最后一行是2个元素 calc(10% / 4 * 3 + 18% * 2) 可简化 */ ul>li:last-child:nth-child(5n - 3) { margin-right: calc(30% / 4 + 54%) } /* 如果最后一行是3个元素 calc(10% / 4 * 2 + 18% * 2) 可简化 */ ul>li:last-child:nth-child(5n - 2) { margin-right: calc(20% / 4 + 36%) } /* 如果最后一行是4个元素 */ ul>li:last-child:nth-child(5n - 1) { margin-right: calc(10% / 4 + 18%) }
复制
依次类推,当列数为6、7、8 …时,同样按照上述方式计算
flex布局其余知识了解
1. 部分元素被挤压的解决方法 flex-shrink: 0
概念:父元素宽度小于子元素宽度之和时,子元素如何缩小自己的宽度
取值:默认为1,值越大,缩小的越多;值为0,不缩小
2. 父元素剩余空间分配问题 flex-grow:1
概念:父元素宽度大于子元素宽度之和时,子元素如何分配父元素剩余空间
取值:默认为0,即使存在剩余空间,也不放大;为其他值时(Number),按照比例放大