使用Flex布局的几个小技巧

news/2024/12/12 21:33:51/文章来源:https://www.cnblogs.com/xwwin/p/18603495

前情

Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 Flex 布局,如果说目前我开发中离不开的布局方式那就非Flex莫属了,而且小程序就是推荐使用Flex布局的,对 Grid布局的支持不太理想。

在一次次使用flex布局的时候遇到了一些小困扰,而解决这些小困扰的过程中发现了一些小技巧,特记录并分享出来。

技巧内容

技巧 1:flex-direction为column的子元素自适应内容宽

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><style>.test {width: 100%;display: flex;flex-direction: column;}.test-item {height: 100px;display: flex;flex-direction: row;justify-content: center;align-items: center;background-color: red;color: white;}.test-item:nth-of-type(3){align-self: flex-start;}</style></head><body><div class="test"><div class="test-item">010101</div><div class="test-item">020202</div><div class="test-item">030303</div></div></body>
</html>

当设置为flex-direction: column后,项目元素align-self样式值默认为stretch,导致项目元素会充满整行,如果你想做到项目元素自适应内容宽你设置为align-self:baseline或者flex-start即可

上述示例可以实现如下图布局效果:

体验链接:CSS Playground

技巧 2:利用margin:auto实现一些特殊布局

对于如下需求你第一想到的flex布局方式是怎么实现:

按正常的实现思路是左边一个div包住左边内容,右边再一个div,再使用justify-content:between可以实现或者让左边的div为 flex:1,那有什么方式可以让结构打平一层,左边的包裹div免去了,那就是margin:auto,利用好margin:auto可以实现一些特殊布局,演示代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><style>.test,.test0,.test1 {width: 100%;display: flex;flex-direction: row;background-color: black;}.test-item,.test-item0,.test-item1 {width: 100px;height: 100px;display: flex;justify-content: center;align-items: center;color: white;background-color: green;}.test-item:nth-last-of-type(1){margin-left: auto;}.test-item0:nth-last-of-type(2){margin-left: auto;}.test-item1:nth-of-type(2){margin-left: auto;}.test-item1:nth-of-type(3){margin-right: auto;}</style></head><body><div class="test"><div class="test-item">1</div><div class="test-item">2</div><div class="test-item">3</div><div class="test-item">4</div></div><div class="test0"><div class="test-item0">1</div><div class="test-item0">2</div><div class="test-item0">3</div><div class="test-item0">4</div></div><div class="test1"><div class="test-item1">1</div><div class="test-item1">2</div><div class="test-item1">3</div><div class="test-item1">4</div></div></body>
</html>

上述示例可以实现如下图布局效果:

体验链接:CSS Playground

技巧 3:利用align-self实现交叉轴(Cross Axis)上单个元素位置控制

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>.test {display: flex;flex-direction: column;align-items: center;}.test-item {width: 100px;height: 100px;display: flex;flex-direction: row;justify-content: center;align-items: center;color: white;background-color: red;}.test-item:nth-of-type(1){align-self: flex-start;}.test-item:nth-of-type(3){align-self: flex-end;}</style></head><body><div class="test"><div class="test-item">1</div><div class="test-item">2</div><div class="test-item">3</div></div></body>
</html>

通过align-items可以整体控制交项目元素在叉轴上的对齐方式,但如果想单个控制它的对齐方式,那就用好align-self吧,上述示例可以实现如下图布局效果:

体验链接:CSS Playground

技巧 4:使用gap设置容器内项目之间的间距

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><style>.wrap {display: flex;flex-direction: row;}.test {width: 320px;display: flex;flex-direction: row;align-items: center;justify-content: space-between;flex-wrap: wrap;margin-right: 20px;}.test-item {width: 100px;height: 100px;margin-bottom: 10px;flex: none;display: flex;flex-direction: row;justify-content: center;align-items: center;color: white;background-color: red;}.test0 {width: 320px;display: flex;flex-direction: row;align-items: center;flex-wrap: wrap;margin-right: 20px;gap: 10px 10px;}.test-item0 {width: 100px;height: 100px;flex: none;display: flex;flex-direction: row;justify-content: center;align-items: center;color: white;background-color: red;}</style></head><body><div class="wrap"><div class="test"><div class="test-item">01</div><div class="test-item">02</div><div class="test-item">03</div><div class="test-item">04</div><div class="test-item">05</div><div class="test-item">06</div><div class="test-item">07</div><div class="test-item">08</div></div><div class="test0"><div class="test-item0">11</div><div class="test-item0">12</div><div class="test-item0">13</div><div class="test-item0">14</div><div class="test-item0">15</div><div class="test-item0">16</div><div class="test-item0">17</div><div class="test-item0">18</div></div></div></body>
</html>

Flex布局如果不依赖gap想实现如下右图的布局是比较麻烦的,通过justify-content: space-between可以做到平分余下空间让元素间有间距,但是如果遇到未行元素不够的时候就会出现如下左图的问题,解决办法是手动生成一个空的元素让它补齐一行内容也是可以做到的;另一种实现方式是通过margin来实现元素间距,再通过:nth-child()方式来去除每行最边缘元素的margin。上述二种方式都相对比较麻烦,如果你使用gap就可以轻松实现右图效果

体验地址:CSS Playground

技巧 5:比较常用的几个缩写

flex: 1/flex: 0%; 等效于flex:1 1 0%; 子元素平分父元素空间,各子元素尺寸一样

flex: none; 等效于flex:0 0 auto; 元素保持自身原始大小不变

flex:auto; 等效于flex:1 1 auto; 元素尺寸可以弹性增大,也可以弹性变小,具有十足的弹性,项目会根据自身大小和剩余空间进行伸缩

注:flex:1和flex:auto区别:

  • flex-basis属性定义了项目在分配多余空间之前,占据的主轴空间(main size)
  • flex:1相当于flex: 1 1 0%,表示项目的基准大小为0%,不考虑项目本身的大小,只根据剩余空间进行伸缩
  • flex:auto相当于flex: 1 1 auto,表示项目的基准大小为auto,即项目本身的大小,同时也会根据剩余空间进行伸缩
  • 如果容器有足够的空间,flex:1和flex:auto都会平分剩余空间,但是flex:auto会保持项目本身的最小宽度,而flex:1不会
  • 如果容器没有足够的空间,flex:1会优先压缩内容,使得所有项目都能等分空间,而flex:auto会优先保持内容的完整性,挤压其他项目的空间

在线测试地址:JS Bin - Collaborative JavaScript Debugging

技巧 6:浏览器开发者工具辅助使用

对于新手刚刚学习使用flex布局,经常容易忘记一些属性,其实可以通过浏览器开发者工具辅助来学习flex布局,vs code也有对应的插件可以辅助

期望

上述只是个人在开发中发现的一些Flex布局小技巧,如果你有好的技巧欢迎也分享出来,共同学习进步。期待你的留言👀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851582.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#学习笔记(一) Array学习笔记

之前一直学习各种基础知识,光学习,没有总结,趁着有时间,总结总结C#有关知识 Array类是最基础的数组类,官方文档截图如下:Array是一个抽象类,不能实例化,只能使用里面的方法,属性。 Array 类不是 System.Collections 命名空间的一部分。 但是,它仍被视为集合,因为它基…

VMware ESXi 7.0U3r macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 7.0U3r macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 7.0U3r macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 7.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Fujitsu (富士通)、Hitachi…

Ubuntu 20.04虚拟机无法上网,无法访问主机

查版本 Ubuntu基于Debian发行版和GNOME桌面环境 Xubuntu(发音为ZOO-bun-too)是一个Ubuntu Linux的官方派生版,它基于桌面环境Xfce,主要运行基于GTK+的程序,面向旧式电脑的用户和寻求更快捷的桌面环境的用户。它与Ubuntu不完全相同,但使用Ubuntu的高质量软件源。 /etc/net…

帮助用户与 AI 实时练习口语,Speak 为何能估值 10 亿美元?丨Voice Agent 学习笔记

👋活动招募:如果你正在关注 Voice Agent 的开发和创业,欢迎线上参与本周日(15 日)的 Voice Agent 开发者分享会。AI 语言学习公司 Speak 近日宣布完成 7800 万美元 C 轮融资,由 Accel 领投,OpenAI 创业基金、Khosla Ventures、Y Combinator 等顶级投资机构参投。此轮融…

12C++循环结构-for循环(2)——教学

1、循环变量为字符型; 2、打擂台-for语句的另一种形式; 3、break语句; 4、数位分离一、循环变量为字符型 试编一程序,按字典顺序输出26个字母。 流程图:思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母。 循环可以是递增型循环,也可以是递减型循环。二、打…

沈阳在线教育系统官网

针对教育和软件行业的关注,在不断发展的市场环境下,我们探讨一种新兴的趋势,即在线教育领域如何更高效、更个性化地提供优质的教育服务,尤其是利用知识付费在线教育系统的创新解决方案。图源 凸知@www.tuzhi.ltd在当前社会背景下,随着信息技术的突飞猛进,以及人们对于优质…

【PHP样本】反序列化ctf题

题目: <?phphighlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_…

雷池的9443的管理端怎么保护?

为什么要保护 9443端口是雷池管理端端口,如果直接对外开放访问,有恶意攻击时管理员无法感知,为了更安全,把9443也用雷池保护起来 操作步骤 添加雷池的站点 如图:修改新的外部访问端口为19443 安全组删除9443的端口开放 增加19443端口开放测试效果用原来的9443访问,发现已…

rust学习十四、编译和发布单元包Crate

本文简要介绍如何编译和发布单元包(crate)。 很可惜的是,找了一会,没有发现可以发布到除了Crates.io之外的地方。 可能是我没有找到,也可能仅仅是因为我本人仅是初学者。希望国内的大学和其它机构能够创建那么一个国内的库,避免哪天封禁后,无处可去。 本文对应相关书籍的第…

Https身份鉴权(小迪网络安全笔记~

引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等技术。附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 5.2 Https&身份鉴权引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等…

转载:【AI系统】Ascend C 编程范式

AI 的发展日新月异,AI 系统相关软件的更新迭代也是应接不暇,作为一篇讲授理论的文章,我们将尽可能地讨论编程范式背后的原理和思考,而少体现代码实现,以期让读者理解 Ascend C 为何这样设计,进而随时轻松理解最新的 Ascend C 算子的编写思路。 本文将针对 Ascend C 的编程…