flex布局优化(两端对齐,从左至右)

news/2024/5/19 3:15:57 标签: flex, css, 前端

文章目录

    • 前言
    • 方式一 nth-child
    • 方式二 gap属性
    • 方式三 设置margin左右两边为负值
    • 总结

前言

flex布局是前端常用的布局方式之一,但在使用过程中,我们总是感觉不太方便,因为日常开发中,大多数时候,我们想要的效果是这样的

在这里插入图片描述
即左右两端对齐并顶满,小盒子左右间距一致,并且从左至右排布。
今天主要就来讨论,通过css,有几种方式来实现,以及它们的优缺点。

方式一 nth-child

<template>
  <div class="main">
	<div class="flex-box">
		<div class="item-box">...</div>
		...
	</div>	
  </div>
</template>
css">.flex-box {
	display: flex; // 设置成为flex模式
    flex-wrap: wrap; // 允许换行
}

.item-box {
	width: 22%; // 以4个一行为例,有4个子盒子,3个间距
	margin-right: 4%; // 3 * 4 + 4 * 22 = 100
	margin-bottom: 20px; // 行与行之间也要设置边距。
}

// 如果一行是5个就是 5 + 5n
.item-box:nth-child(4 + 4n) {
	// 当n为0时,即表示第一行最后一个元素,不需要右外边距,否则就超出 100%了。
	margin-right: 0 !important;
}

优点:实现了我们想要的布局方案,代码量也并不复杂,基本没有兼容性的问题。

缺点1:当遇到下面这种情况时,该设置将会失效。

<template>
  <div class="main">
	<div class="flex-box">
		<div class="item-box">...</div>
		<div class="item-box" style="css language-css">display:none;"></div>
	</div>	
  </div>
</template>

在这里插入图片描述
这是因为nth-child是按照子盒子的个数来设置的,虽然其中一部分子盒子消失了,但它的元素依然存在,个数并没有变。

缺点2: 不够灵活,如果在不同屏幕分辨率下,每行个数不一样(做响应式的时候经常会遇见这种情况),需要在不同分辨率下,多写一套样式代码。

css"> @media screen and (max-width: 991px) {
 	.flex-box {
		display: flex; // 设置成为flex模式
    	flex-wrap: wrap; // 允许换行
	}

	.item-box {
		width: 48%; // 以2个一行为例,有2个子盒子,1个间距
		margin-right: 4%; // 1 * 4 + 2 * 48 = 100
		margin-bottom: 20px; // 行与行之间也要设置边距。
	}

	// 如果一行是2个就是 2 + 2n
	.item-box:nth-child(2 + 2n) {
	// 当n为0时,即表示第一行最后一个元素,不需要右外边距,否则就超出 100%了。
		margin-right: 0 !important;
	}
 }

方式二 gap属性

css">.flex-box {
	display: flex; // 设置成为flex模式
    flex-wrap: wrap; // 允许换行
    gap: 4%; // 设置间距为4%
}

.item-box {
	width: 22%; // 以4个一行为例,有4个子盒子,3个间距 
	margin-bottom: 20px; // 行与行之间也要设置边距。
}

优点: 显而易见,这种方式的代码量更少,更方便,并且不存在方式一的缺点1,即display:none;不会造成影响。

缺点1:gap目前还是一个很新的属性,对浏览器的兼容性并不高,尤其是不兼容ie11,如果项目对浏览器没有兼容性要求,可以使用gap,当然也可以换一种布局方式,display:grid;

缺点2:当然这种方式也需要对不同分辨率的设配,额外多写一套代码,但相对来说,也轻松许多。

方式三 设置margin左右两边为负值

css">.flex-box {
	display: flex; // 设置成为flex模式
    flex-wrap: wrap; // 允许换行
    margin: 0 -2% 0 -2% // 间距为4%
}

.item-box {
	width: 21%; // 以4个一行为例,有4个子盒子,4个间距 4 * 21 + 4 * 4 = 100  
	margin: 0 2% 20px 2%; // 左右两边各2%,所以间距为4%
}

优点:兼容性很好,能够兼容ie11,并且不存在display:none;时的问题。
缺点1:代码略微有些复杂,需要合理安排盒子宽度和间距的宽度,与前面的两种方式不同间距数量和盒子数量一致。需要分别设置左边距和右边距。

缺点2:需要对不同分辨率的设配,额外多写一套代码。

总结

三种方式中,第二种方式最简单,但兼容性有限;第一种方式代码量不少,兼容性适中,而且display:none;的问题严重,最后一种方式,最推荐,虽然有一些计算,并且也要合理分配宽度,但其兼容性最好,基本没啥场景不能适用,正所谓一招鲜,吃遍天。

至于缺点2,面对不同分辨率,每行数量会变化的问题,目前没有特别好的解决方案,都需要额外一套样式代码才能解决。

当然,你可以通过使用scss或者less,弄一个for循环,从一行2个到 10个 进行样式的封装,这样使用的时候,直接使用类名即可,比如 flex-row-6,flex-row-4等。

css">@for $i from 2 through 10 {
  .flex-row-#{$i} {
    display: flex;
    flex-wrap: wrap;

    .item {
      width: calc(96% / #{$i}) !important;
      margin-right: calc(4% / #{$i - 1}) !important;
      margin-bottom: 20px;
    }
    .item:nth-child(#{$i}n + #{$i}) {
      margin-right: 0 !important;
    }
  }
}

http://www.niftyadmin.cn/n/167030.html

相关文章

常见算法(三)

目录&#xff1a; &#xff08;1&#xff09;排序算法 &#xff08;2&#xff09;冒泡排序 &#xff08;3&#xff09;选择排序 &#xff08;1&#xff09;排序算法 &#xff08;2&#xff09;冒泡排序 1. 冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简…

经典排序算法

文章目录序言算法分类算法复杂度1、交换排序1.1 冒泡排序(Bubble Sort)1.2 快速排序(Quick Sort)2、选择排序2.1 直接选择排序3、插入排序3.1 直接插入排序3.2 希尔排序4、归并排序序言 算法分类 排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过相互比较来决…

11.0 自定义SystemUI下拉状态栏和通知栏视图(十三)之自定义通知布局构建

1.前言 在进行11.0的rom产品定制化开发中,在11.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删除通…

AdamW 优化器

Adam 优化器于 2014 年推出&#xff0c;其思想&#xff1a;既然知道某些参数移动得更快、更远&#xff0c;则每个参数不需要遵循相同的学习率&#xff0c;因为最近梯度的平方代表每一个权重可以得到多少信号&#xff0c;可以除以这个&#xff0c;确保即使是最迟钝的权重也有机会…

放过自己(转)

常听人说&#xff0c;人生有八苦&#xff1a;生、老、病、死、爱别离、怨长久、求不得、放不下。生老病死的苦&#xff0c;是人生必经之苦&#xff0c;没有人可以逃脱。而其余的苦&#xff0c;往往是人心里的苦。执念太深&#xff0c;不肯放过自己&#xff0c;才会让心负重太多…

使用ebpf 监控golang 应用

一、背景 使用ebpf 监控grpc-go的应用&#xff0c;grpc-go http2 client的处理点 func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.HeaderField, onWrite func()) error { ...... }// operateHeaders takes action on the decoded headers. f…

一口一口吃掉yolov8(2)

前面介绍了训练的第一个部分&#xff0c;也是大部分人在网上找得到的文章&#xff0c;但是后面2个部分应该是网上没有的资料了&#xff0c;希望大家喜欢。 0.数据 我的数据是一些栈板&#xff0c;主要是检测栈板的空洞&#xff0c;识别出空洞的位置和偏转角度。原图如下 我的…

Python 可视化最频繁使用的10大工具

今天介绍Python当中十大可视化工具&#xff0c;每一个都独具特色&#xff0c;惊艳一方。 文章目录Matplotlib技术提升SeabornPlotlyBokehAltairggplotHoloviewsPlotnineWordcloudNetworkxMatplotlib Matplotlib 是 Python 的一个绘图库&#xff0c;可以绘制出高质量的折线图、…