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

news2024/11/19 4:37:02

文章目录

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

前言

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

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

方式一 nth-child

<template>
  <div class="main">
	<div class="flex-box">
		<div class="item-box">...</div>
		...
	</div>	
  </div>
</template>
.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="display:none;"></div>
	</div>	
  </div>
</template>

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

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

 @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属性

.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左右两边为负值

.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等。

@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.coloradmin.cn/o/409310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年网络安全比赛--CMS网站渗透中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交; 4.使用渗透机对服务器渗透,…

全网最新的vue.js下载和安装的3种方法(2023年)

文章目录1. 文章引言2. 环境搭建3. 安装vue.js3.1 方法一&#xff1a;官网下载vue.js源代码3.2 方法二&#xff1a;使用npm install创建3.3 方法三&#xff1a;使用bower下载4. 总结1. 文章引言 我主要从事java后端开发&#xff0c;但对前端也非常感兴趣&#xff0c;立志成为全…

【vite·5】vite中环境变量的使用与配置(全网最全)

什么是环境变量 根据当前的代码环境变化的变量就叫做环境变量。比如&#xff0c;在生产环境和开发环境将BASE_URL设置成不同的值&#xff0c;用来请求不同的环境的接口。 环境变量一般可以在全局访问到。在webapck中&#xff0c;我们也许看到过这样的代码 // webpack.config.…

JavaWeb:实现购物商城(课程设计完整版)

前言 做一个javaweb可以对前后端基础知识进行巩固。 就比如 前端可以用 htmlcssjsjQuery&#xff1b; 后端Http协议&#xff0c;Servlet基础&#xff0c;JSP技术&#xff0c;Mysql等 该程序做的这个就相对比较基础&#xff0c;适合大学生当课程设计用 在文章结尾附项目源代码和…

Vue生命周期钩子剖析(共12个钩子)

生命周期示意图&#xff1a; 生命周期及其钩子函数理解 生命周期&#xff1a; Vue是一个构造函数&#xff0c;当执行执行这个函数时&#xff0c;相当于初始化vue实例&#xff1b;在创建实例过程中&#xff0c;需要设置数据监听&#xff0c;编译模板&#xff0c;将实例挂载到DO…

Vue warn]: Component is missing template or render function.

警告&#xff1a;Component is missing template or render function. 问题声明&#xff1a; 组件缺少模板或渲染功能。 解决问题 方式一&#xff1a; 在写vue项目时&#xff0c;网页没有加载出来东西一片空白&#xff0c;然后控制台出现黄色的警告&#xff1a; 原因是&…

html--盒子的边框属性(border)

content:内容框&#xff08;我们设置的宽高是内容框的宽高&#xff09; padding:内边距 top right bottom left&#xff08;四边--一般默认指定的方向&#xff09; border:边框线包裹了内边距&#xff08;四边&#xff09; margin:外边距 在边框的外面 元素和其他元素的间…

【手把手带你学JavaSE】String类(下篇)

目录前言一、字符串查找二、字符串转换2.1 数值和字符串转化2.2 大小写转化2.3 字符串和数组的转换2.4 格式化三、字符串替换四、字符串拆分4.1 拆分处理4.2 部分拆分4.3 拆分IP地址五、字符串截取六、其他的方法6.1 String trim()6.2 boolean isEmpty()6.3 int length()6.4 判…

vue3与vue2的区别(你不知道细节全在这)

先来说说当下市场开发使用的问题&#xff0c;目前2021年使用vue3开发的企业还是少&#xff0c;基本上都还是以vue2的形式进行开发&#xff0c;vue3的开发模式跟react很像&#xff0c;这时候有人就会想那我学vue3有用么&#xff0c;淦&#xff0c;他喵的&#xff0c;先别激动&am…

Vue开发项目入门——Vue脚手架

1.什么是Vue脚手架 Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;&#xff0c;它提供命令行和UI界面&#xff0c;方便创建vue工程、配置第三方依赖、编译vue工程。 特别注意&#xff1a;Vue脚手架是用来方便开发的&#xff0c;但vue脚手架不是最终发…

Canvas百战成神-圆(1)

Canvas百战成神-圆 初始化容器 <canvas id"canvas"></canvas>canvas{border: 1px solid black; }让页面占满屏幕 *{margin: 0;padding: 0; } html,body{width: 100%;height: 100%;overflow: hidden; } ::-webkit-scrollbar{display: none; }初始化画笔…

【网络请求之Axios】axios的基础用法

1. axios概述 axios 是一个专注于网络请求的库。axios 在请求到数据之后&#xff0c;在真正的数据之外&#xff0c;套了一层外壳。 2.axios的基本使用 2.1 发送get请求 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta cha…

前端:弹幕标签用法详细介绍(跑马灯)

弹幕标签 1&#xff0c;注意弹幕标签marquee&#xff0c;现在一些浏览器是不支持的 2&#xff0c;弹幕标签也叫跑马灯 marquee格式及其含有的属性 1.基本格式 如下&#xff1a; <marquee></marquee>2.一些属性 1&#xff0c;direction属性&#xff1a;表示的…

39.JavaScript中Promise的基本概念、使用方法,回调地狱规避、链式编程

《JavaScript再出发》系列文章阅读《仙宗》发布招仙贴&#xff0c;广招天下道友 文章目录JavaScript中Promise的基本概念、使用方法&#xff0c;以及回调地狱规避一、前言二、Promise基本概念2.1 异步工作的封装2.2 Promise执行结果获取thencatchfinally三、使用Promise解决回调…

qiankun微应用之间、主微应用之间相互跳转方式总结与实践

一、子应用互相访问 1、背景 &#xff08;1&#xff09;未来可能需要做不同子应用菜单的合并&#xff0c;如在bi应用下的侧边栏或者别的地方&#xff0c;需要跳转到数据治理的数仓主题里&#xff0c;或者涉及到子应用值改变&#xff0c;其他应用也需要使用&#xff1b; &…

【JWT鉴权】如何来写一个token令牌认证登录?

目录一. &#x1f981; 话题引入1.2 什么是JWT&#xff1f;二. &#x1f981; 技术体现2.1 引入依赖2.2 编写JWT工具类2.3 编写登录方法2.4 编写JWT拦截器验证令牌2.5 编写要配置拦截的接口三. &#x1f981; 话题终结一. &#x1f981; 话题引入 在做项目过程中&#xff0c;我…

vue-element-ui前后端交互实现分页查询

大体思路&#xff1a; ①添加element-ui分页组件 ②在data里定义几个参数用来存放当前页&#xff0c;每页条数&#xff0c;条目总数以及存放后端分页查询的结果 ③后端使用分页查询&#xff0c;controller层接收当前页以及每页条数的参数 ④前端编写方法发送请求到controll…

用jsp实现简单登入注册界面功能(css美化)(软件idea)

思路&#xff1a;创建登入界面&#xff08;login&#xff09;&#xff0c;再创建登入成功与登入失败界面&#xff08;loginsuccess与loginfail&#xff09;&#xff0c;再创建注册成功界面&#xff08;registersuccess&#xff09;与注册界面&#xff08;register&#xff09;以…

用HTML实现简易版计算器

计算器功能&#xff1a;实现了加减乘除、清零、回退、四则运算、幂运算、根式运算等等。 运行结果如下&#xff1a; 引入的图片&#xff1a;back.png HTML部分&#xff1a;用table表格添加计算器的按键&#xff0c;给每个按键设置一个相应的单击事件&#xff0c;点击一个按键后…

RuoYi-Vue——图标使用

使用若依的小伙伴们&#xff0c;是否有遇到找图标的烦恼。若依框架里图标分两种&#xff0c; 1.用在表格中的图标&#xff1a; 2.用在菜单及个人信息的图标&#xff1a; 下面我就针对这两种图标给大家总结一下。 1.表格图标&#xff08;ElementUI图标Icon&#xff09; 若依的表…