CSS justify-content布局让最后一行元素左对齐的两种实用方式

justify-content 问题描述

在CSS fle布局中,最后一行的元素个数不满的时候,使用justify-content来实现某中对其方式的时候,我们发现在最后一行的元素是space-around或者space-between的样式,而不是我们想要的左对齐。

如下代码以space-around举例:

.wrap {
    width: 300px;
    border: 1px solid skyblue;
    display: flex;        
    flex-wrap: wrap;
    justify-content: space-around;
}
.wrap div {
    width: 80px;
    height: 80px;
    margin: 10px;
    background: skyblue;
}
<div class="wrap">
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>

可以看到最后一行的元素个数不够,不是我们想要的效果

使用margin自适应的方法解决

.wrap div:last-child {
     /* 让最后一个元素的右边距自动适应,从而实现左对齐的效果。*/
    margin-right: auto; 
}

给最后一个元素设置margin-right取值为auto,让该元素的右边距自适应剩余空间

控制台查看最后一个子元素,可以明确的看到最后一个子元素会根据剩余空间自动适应

当我们随机删除某一个的时候最后一个元素的边距会自动适应吗?

.wrap {
    width: 300px;
    border: 1px solid skyblue;
    display: flex;        
    flex-wrap: wrap;
    justify-content: space-around;
}
.wrap div {
    width: 80px;
    height: 80px;
    margin: 10px;
    background: skyblue;
}
.wrap div:last-child {
    /* 让最后一个元素的右边距自动适应,从而实现左对齐的效果。 */
    margin-right: auto; 
}
<div class="wrap">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
</div>
let oDiv = document.querySelectorAll(".wrap div");
for (var i = oDiv.length - 1; i >= 0; i--) {
    oDiv[i].onclick = function() {
        this.remove();
    }
}

删除某一个后,CSS样式会自动映射到最后一个元素身上,效果还是我们想要的,所以没问题

如果子项的宽度在不确定的情况下呢

.wrap {
    width: 300px;
    border: 1px solid skyblue;
    display: flex;        
    flex-wrap: wrap;
    justify-content: space-around;
}
.wrap div {
    width: 80px;
    height: 80px;
    margin: 10px;
    background: skyblue;
}
.wrap div:last-child {
    /* 让最后一个元素的右边距自动适应,从而实现左对齐的效果。 */
    margin-right: auto; 
}
<div class="wrap">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
</div>
let oDiv = document.querySelectorAll(".wrap div");
for (var i = oDiv.length - 1; i >= 0; i--) {
    oDiv[i].style.width = rand(80, 30) + "px";
}

// 封装随机数
function rand(max, min) {
    return Math.floor( Math.random() * (max - min + 1) + min);
}

最后一子项设置margin-right: auto,最终效果如下:

使用CSS中after(伪元素)来实现最后一行的左对齐

.wrap {
    width: 300px;
    border: 1px solid skyblue;
    display: flex;        
    flex-wrap: wrap;
    justify-content: space-around;
}
.wrap div {
    width: 80px;
    height: 80px;
    margin: 10px;
    background: skyblue;
}
.wrap::after {
    content: "";
    display: block;
    flex: 1; /* 与flex: auto;等效都是自适应剩余空间*/
}
<div class="wrap">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
</div>

效果如下:

控制台查看伪元素,可以看到伪元素进行了占位

 

posted @ 2022-06-15 11:44  86727515  阅读(3315)  评论(1编辑  收藏  举报