一篇文章带你彻底了解flex布局

哈喽,大家好呀,我是前端理想哥,今天我们来聊聊 flex 布局。

好,主角登场。

CSS 弹性盒子模型( Flexible Box 或者 Flexbox )

先来看看它的定义:弹性布局是指通过调整其内元素的宽高,从而在任何显示设备上实现对可用显示空间最佳填充的能力。弹性容器扩展其内元素来填充可用空间,或将其收缩来避免溢出。

简单来说,弹性盒子模型,是为了你的网页可以在不同分辨率设备上自适应展示而生的一种布局方式。

弹性盒子布局主要适用于应用程序的组件及小规模的布局,而(新兴的)栅格布局则针对大规模的布局。这二者都是 CSS 工作组为在不同用户代理、不同书写模式和其他灵活性要求下的网页应用程序有更好的互操作性而做出的更广泛的努力的一部分。

现在,我们来看如何定义一个弹性盒子:

<div id="main"><div style="background-color:coral;">A</div><div style="background-color:lightblue;">B</div><div style="background-color:khaki;">C</div><div style="background-color:pink;">D</div><div style="background-color:lightgrey;">E</div><div style="background-color:lightgreen;">F</div>
</div>

如果要将上面的 HTML 布局改为弹性盒子布局,该怎么办?

很简单!!

只需要设置如下:

#main{display: flex
}

或者

#main{display: inline-flex
}

区别在于,flex 会使弹性容器成为块级元素,而 inline-flex 会使弹性容器成为单个不可分的行内级元素。

说到这里,有人会问了,弹性容器是什么东东??? 大家先来看一张图: flexbox.png 对比这张图和上面的 html 代码,大家可以看到:

弹性容器(Flex container):指的就是包含着弹性项目的父元素,即上面的 #main 弹性项目(Flex item):弹性容器的每个子元素都称为弹性项目,弹性容器直接包含的文本将被包覆成匿名弹性单元。即上面的 #main div

大家再仔细观察上面的那张图,图上有个主轴和侧轴,这里又涉及到一个知识点:轴(Axis)

每个弹性框布局都包含两个轴。弹性项目沿其依次排列的那根轴称为主轴(main axis)。垂直于主轴的那根轴称为侧轴(cross axis)

接下来我结合上面的 HTML 代码为大家讲解下怎么确定主轴和主轴上内容的显示:

使用弹性容器的 flex-derection 可以确立主轴,这个属性一共有 6 个值,接下来,我为大家一一展示:

#main{display: flex;width: 200px;flex-direction:row;   //默认值,水平展示
}

屏幕快照 2017-12-27 下午5.23.11.png

#main{display: flex;width: 200px;flex-direction:row-reverse;   //与row相同,但是以相反的顺序
}

屏幕快照 2017-12-27 下午5.24.54.png

#main{display: flex;width: 200px;flex-direction:column;   // 弹性项目将垂直展示
}

屏幕快照 2017-12-27 下午5.26.50.png

#main{display: flex;width: 200px;flex-direction:column-reverse;   // 与 column 相同,但是以相反的顺序。
}

屏幕快照 2017-12-27 下午5.28.47.png

还有两个属性,简单介绍下,就不用举例了: initial:设置该属性为它的默认值 inherit:从父元素继承该属性

确定了主轴之后,那么在主轴上弹性项目怎么分布??

我们来看一个新的属性: justify-content: 定义了在当前行上,弹性项目沿主轴如何排布。

#main {display: flex;width: 400px;flex-direction: row;justify-content: flex-start;  //默认值,项目位于容器的开头
}

屏幕快照 2017-12-27 下午5.37.16.png

#main{display: flex;width: 400px;flex-direction: row;justify-content: flex-end;  // 项目位于容器的结尾
}

屏幕快照 2017-12-27 下午5.39.02.png

#main{display: flex;width: 400px;flex-direction: row;justify-content: center;  // 项目位于容器的中间
}

屏幕快照 2017-12-27 下午5.40.26.png

#main{display: flex;width: 400px;flex-direction: row;justify-content: space-between;  // 项目位于各行之间留有空白的容器内
}

屏幕快照 2017-12-27 下午5.41.35.png

#main{display: flex;width: 400px;flex-direction: row;justify-content: space-around;  // 项目位于各行之前、之间、之后都留有空白的容器内。
}

屏幕快照 2017-12-27 下午5.43.47.png

还有两个属性,简单介绍下,就不用举例了: initial:设置该属性为它的默认值 inherit:从父元素继承该属性

确定了弹性项目在主轴上是怎么排布的,接下来,再介绍下在侧轴上是怎么排布的:

#main{display: flex;height: 200px;align-items: stretch;  // 默认值,项目被拉伸以适应容器
}

[图片上传中...(屏幕快照 2017-12-27 下午5.50.11.png-f482c0-1514368241951-0)]

#main{display: flex;height: 200px;align-items: center;  // 项目位于容器的中心
}

屏幕快照 2017-12-27 下午5.52.46.png

#main{display: flex;height: 200px;align-items: flex-start;  // 项目位于容器的开头
}

屏幕快照 2017-12-27 下午5.55.34.png

#main{display: flex;height: 200px;align-items: flex-end;  // 项目位于容器的结尾
}

屏幕快照 2017-12-27 下午5.54.09.png

#main{display: flex;height: 200px;align-items: baseline;  // 项目位于容器的基线上
}

还有两个属性,简单介绍下,就不用举例了: initial:设置该属性为它的默认值 inherit:从父元素继承该属性

如果我只想改变单个弹性项目的对齐方式,该怎么办?

别怕,align-self 属性来也!

align-self:定义了单个弹性项目在侧轴上应当如何对齐,这个定义会覆盖由 align-items 所确立的默认值。

还是用这个 HTML 来展示:

<div id="main"><div class="a" style="background-color:coral;">A</div><div class="b" style="background-color:lightblue;">B</div><div class="c" style="background-color:khaki;">C</div><div class="d" style="background-color:pink;">D</div><div class="e" style="background-color:lightgrey;">E</div><div class="f" style="background-color:lightgreen;">F</div>
</div>#main{display: flex;height: 200px;align-items: center;background: red;
}#main div{width: 40px;
}#main .d{align-self: auto;  //默认值。元素继承了它的父容器的 align-items 属性。如果没有父容器则为 "stretch"}#main .d{align-self: stretch;  //元素被拉伸以适应容器
}

屏幕快照 2017-12-27 下午6.13.00.png

#main .d{align-self: center;  //元素位于容器的中心
}

屏幕快照 2017-12-27 下午6.16.04.png

#main .d{align-self: flex-start;  //元素位于容器的开头
}

[图片上传中...(屏幕快照 2017-12-27 下午6.16.54.png-16a15-1514369874621-0)]

#main .d{align-self: flex-end;
}

//元素位于容器的结尾屏幕快照 2017-12-27 下午6.16.54.png

#main .d{align-self: baseline;  //元素位于容器的基线上
}

还有两个属性,简单介绍下,就不用举例了: initial:设置该属性为它的默认值 inherit:从父元素继承该属性

说完了弹性项目的排布,接下来,我们回看最上面那张图,再来说说,怎么确定主轴/侧轴的方向

我们先来看一个属性: flex-wrap:规定 flex 容器是单行或者多行,同时横轴的方向决定了新行堆叠的方向。

#main{width: 200px;height: 200px;border: 1px solid #c3c3c3;display:flex;background: red;flex-wrap: nowrap;  // 默认值,规定灵活的项目不拆行或不拆列
}

屏幕快照 2017-12-27 下午6.40.48.png

#main{width: 200px;height: 200px;border: 1px solid #c3c3c3;display:flex;background: red;flex-wrap: wrap;  // 默认值,规定灵活的项目在必要时拆行或拆列
}

屏幕快照 2017-12-27 下午6.43.02.png

#main{width: 200px;height: 200px;border: 1px solid #c3c3c3;display:flex;background: red;flex-wrap: wrap-reverse;  // 规定灵活的项目在必要的时候拆行或拆列,但是以相反的顺序。
}

屏幕快照 2017-12-27 下午6.44.14.png

还有两个属性,简单介绍下,就不用举例了: initial:设置该属性为它的默认值 inherit:从父元素继承该属性

order: 属性将元素与序号关联起来,以此决定哪些元素先出现

<div id="main"><div class="a" style="background-color:coral;">A</div><div class="b" style="background-color:lightblue;">B</div><div class="c" style="background-color:khaki;">C</div><div class="d" style="background-color:pink;">D</div><div class="e" style="background-color:lightgrey;">E</div><div class="f" style="background-color:lightgreen;">F</div>
</div>.a{order: 6;-webkit-order: 6;
}
.b{order: 5;-webkit-order: 5;
}
.c{order: 4;-webkit-order: 4;
}
.d{order: 3;-webkit-order: 3;
}
.e{order: 2;-webkit-order: 2;
}
.f{order: 1;-webkit-order: 1;
}

屏幕快照 2017-12-27 下午6.50.18.png flex-flow:是 flex-direction 和 flex-wrap 属性的简写,决定弹性项目如何排布。

对于行(Line)中来说,根据 flex-wrap 属性,弹性项目可以排布在单个行或多个行中。此属性控制侧轴的方向和新行排列的方向

我们确定了弹性容器的主轴与侧轴,弹性项目的宽和高,怎么来确定对应的主轴尺寸和侧轴尺寸???

(1) 可以使用 min-height 和 min-width 来确定,这两个的初始值都是 0

(2) flex 属性是 flex-grow、flex-shrink 和 flex-basis 的简写,描述弹性项目的整体伸缩性。

接下来,我们逐一看看这三个新的属性

flex-grow: 用于设置或检索弹性盒的扩展比率

#main{width: 500px;height: 200px;border: 1px solid #c3c3c3;display:flex;background: red;
}#main div{width: 40px;
}.a{flex-grow: 2;
}
.b{flex-grow: 3;
}
.c{flex-grow: 1;
}
.d{flex-grow: 3;
}
.e{flex-grow: 2;
}
.f{flex-grow: 1;
}

屏幕快照 2017-12-27 下午7.22.01.png

flex-shrink: 指定了 flex 元素的收缩规则,flex 元素仅在默认宽度之和大于容器时才会发生收缩,其收缩的大小是依据 flex-shrink 的值

<p>div 总宽度为 500px, flex-basic 为 120px。</p>
<p>A, B, C 设置 flex-shrink:1。 D , E 设置为 flex-shrink:2</p>
<p>D , E 宽度与 A, B, C 不同</p>
<div id="content"><div class="box" style="background-color:red;">A</div><div class="box" style="background-color:lightblue;">B</div><div class="box" style="background-color:yellow;">C</div><div class="box1" style="background-color:brown;">D</div><div class="box1" style="background-color:lightgreen;">E</div>
</div>

屏幕快照 2017-12-27 下午7.31.55.png flex-shrink 的默认值为 1,如果没有显示定义该属性,将会自动按照默认值 1 在所有因子相加之后计算比率来进行空间收缩。 本例中 A、B、C 显式定义了 flex-shrink 为 1,D、E 定义了 flex-shrink 为 2,所以计算出来总共将剩余空间分成了 7 份,其中 A、B、C 占 1 份,D、E 占 2 份,即 1:1:1:2:2 我们可以看到父容器定义为 500px,子项被定义为 120px,子项相加之后即为 600 px,超出父容器 100px。那么超出的 100px 需要被 A、B、C、D、E 消化 通过收缩因子,所以加权综合可得 1001+100_1+100_1+100_2+100_2=700px

于是我们可以计算 A、B、C、D、E 将被移除的溢出量是多少: A 被移除溢出量:(100_1/700)_100,即约等于 14px B 被移除溢出量:(100_1/700)_100,即约等于 14px C 被移除溢出量:(100_1/700)_100,即约等于 14px D 被移除溢出量:(100_2/700)_100,即约等于 28px E 被移除溢出量:(100_2/700)_100,即约等于 28px 最后 A、B、C、D、E 的实际宽度分别为:120-14=106px, 120-14=106px, 120-14=106px, 120-28=92px,120-28=92px,此外,这个宽度是包含边框的。__

flex-basis:用于设置或检索弹性盒伸缩基准值。

接下来,说几个弹性盒子的相关属性: 由于弹性盒子使用了不同的布局算法,某些属性用在弹性容器上没有意义:

  • 多栏布局模块的 column-* 属性对弹性项目无效
  • float 与 clear 对弹性项目无效。使用 float 将使元素的 display 属性记为 block
  • vertical-align 对弹性项目的对齐方式无效。

最后,我们来看换一个例子:

<!DOCTYPE html>
<html lang="en"><head><style>.flex{/* 基本样式 */width: 350px;height: 200px;border: 1px solid #555;font: 14px Arial;/*  建立弹性框 */display: -webkit-flex;-webkit-flex-direction: row;display: flex;flex-direction: row;}.flex > div{-webkit-flex: 1 1 auto;flex: 1 1 auto;width: 30px; /* 让过渡表现良好。(从/到"width:auto"的过渡至少在 Gecko 和 Webkit 上是有 bug 的。更多信息参见 http://bugzil.la/731886 ) */-webkit-transition: width 0.7s ease-out;transition: width 0.7s ease-out;}/* colors */.flex > div:nth-child(1){ background : #009246; }.flex > div:nth-child(2){ background : #F1F2F1; }.flex > div:nth-child(3){ background : #CE2B37; }.flex > div:hover{width: 200px;}</style></head><body><p>Flexbox nuovo</p><div class="flex"><div>uno</div><div>due</div><div>tre</div></div></body>
</html>

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

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

相关文章

【02】mapbox js api加载arcgis切片服务

需求&#xff1a; 第三方的mapbox js api加载arcgis切片服务&#xff0c;同时叠加在mapbox自带底图上 效果图&#xff1a; 形如这种地址去加载&#xff1a; http://zjq2022.gis.com:8080/demo/loadmapbox.html arcgis切片服务参考链接思路&#xff1a;【01】mapbox js api加…

基于gd32f103移植freemodbus master 主栈

1.移植freemodbus master需要先移植RT-Thread操作系统 GD32F103C8T6移植 RTT Nano 教程-CSDN博客 2.移植freemodbus master协议栈 在移植了RTT以后,我们需要移植就只有串口相关的函数 移植freemodbus master协议栈具体步骤 下载移植freemodbus master协议栈 源码添加协议栈…

2024 1.13~1.19 周报

一、本周计划 确定论文题目&#xff0c;重新思考能加的点子&#xff0c;重点在网络架构部分。主要了解了注意力模块如SE、CBAM、CA&#xff0c;在模型中插入注意力模块。读论文。 二、完成情况 2.1 论文题目 基于注意力的Unet盐体全波形反演 想法来源&#xff1a;使用的是二维…

全新AI助手结合GPT4、Dalle3和Midjourney图文创作

MidTool AI助手&#xff08;迷图网(MidTool)-免费ChatGPT中文版和Midjourney的AI绘画聊天软件&#xff09;是一个集成了多种人工智能技术的平台&#xff0c;旨在为用户提供全面的智能服务体验。它融合了GPT-4、DALLE 3和Midjourney等先进的AI工具&#xff0c;每个工具都有其独特…

【LeetCode热题100】【子串】滑动窗口最大值

题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], …

【方法】如何合并多个PDF文件?

多个PDF文件&#xff0c;想合并成一个文件&#xff0c;要怎么操作呢&#xff1f; 如果PDF文件的数量少&#xff0c;并且页数也不多&#xff0c;可以试试将内容复制黏贴到Word文档&#xff0c;再转为PDF格式&#xff1b;如果文件数量多&#xff0c;页数也多&#xff0c;就不太合…

原型设计 Axure RP 9

Axure RP 9是一款专业的原型设计和协作工具&#xff0c;让用户快速创建高保真度的交互原型&#xff0c;模拟真实的用户界面和交互体验。该软件界面布局合理&#xff0c;易于使用&#xff0c;提供丰富的交互功能和效果&#xff0c;如动态面板、变量、条件逻辑、动画等。同时支持…

室内机器人区域覆盖算法仿真测试平台设计与实现(预告)

前一篇&#xff1a; 户外机器人区域覆盖算法仿真测试平台设计与实现&#xff08;预告&#xff09; 基本完全是人工智能生成的内容。 之前此课题只是课程中的一个项目案例。 ROS1云课→32愉快大扫除 但是可以感觉到过于宽泛&#xff0c;没有任何具体实践&#xff0c;比如使用…

MCM备赛笔记——熵权法

Key Concept 熵权法是一种基于信息熵概念的权重确定方法&#xff0c;用于多指标决策分析中。信息熵是度量信息量的不确定性或混乱程度的指标&#xff0c;在熵权法中&#xff0c;它用来反映某个指标在评价过程中的分散程度&#xff0c;进而确定该指标的权重。指标的分散程度越高…

【办公自动化】python实现图片上传到阿里云OSS

阿里云OSS简介 阿里云对象存储服务(Object Storage Service,简称OSS)是一种高可靠、高可用、安全稳定的云存储服务。它提供了海量、安全、低成本、高可靠的存储服务&#xff0c;适用于各种类型的文件存储需求。 阿里云OSS使用方法 注册阿里云账号并登录&#xff1b; 创建OSS…

【办公类-21-01】20240117育婴员操作题word合并1.0

背景需求&#xff1a; 最近学校组织老师们学习“育婴员”高级&#xff0c;每周学习2题操作&#xff0c;所以我是把每个学习内容单独做在一个word文件里 上周8套保健操作学完了&#xff0c;需要整理&#xff0c;并将8份Word文件合并 第一步&#xff1a;doc装docx 合并时程序报…

leedcode刷题day2

题目&#xff1a; 根据这道题我的思路是用python首先将第一个值赋给a&#xff0c;然后将下一个值赋值给b在这里写一个循环计算下一个值是否等于a&#xff0c;不等于就进入数组当等于a的时候输出数组长度&#xff0c;然后比较数组长度输出最长长度对应的元素不过显然这很慢。 然…

在Linux中安装和配置Node.js与Express.js创建HTTP服务器

在Linux环境中&#xff0c;安装和配置Node.js与Express.js来创建一个HTTP服务器需要一系列的步骤。下面是一个详细的指南&#xff0c;帮助你在Linux上设置这个环境。 步骤1&#xff1a;安装Node.js 首先&#xff0c;你需要确保你的Linux系统已经安装了Node.js。你可以通过以下…

探索设计模式的魅力:“感受单例模式的力量与神秘” - 掌握编程的王牌技巧

在软件开发的赛场上&#xff0c;单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员&#xff0c;它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱&#xff0c;从历史渊源到现代应用&#xff0c;从基础实现到高级技巧&#xf…

怎么做好小红书投放复盘,品牌运营总结

小红书作为主流的传播平台&#xff0c;聚焦了众多品牌的关注。但是对于小红书达人投放而言&#xff0c;是否完成投放就意味着任务结束了呢?其实并非如此&#xff0c;达人投放复盘也非常重要。今天我们就带大家了解一下怎么做好小红书投放复盘&#xff0c;品牌运营总结&#xf…

element中Table表格控件单选、多选功能进一步优化

目录 一、代码实现1、 父组件2、子组件&#xff08;弹框&#xff09; 二、效果图 一、代码实现 1、 父组件 <template><div><!-- 用户选择嵌套弹框 --><el-dialog :close-on-click-modal"false" :close-on-press-escape"false" tit…

零基础学Python(1)— 一文带你了解什么是Python(包括Python解释器安装步骤等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。从今天开始&#xff0c;我们就一起进入Python的世界&#xff01;&#x1f389;为了让大家能够牢固地掌握Python语言&#xff0c;本系列文章就循序渐进&#xff0c;从最基础的知识开始讲起&#xff0c;教大家如何去使用Pyth…

Spring-BeanPostProcessor PostConstruct init InitializingBean 执行顺序

执行顺序探究 新建一个对象用于测试 Component public class Student implements InitializingBean {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}pu…

代码之外:工程师的成长进阶秘籍

程序员只懂技术能行吗&#xff1f; 为什么说技术人员“说”和“写”总得擅长一个&#xff1f; 你以为的“关注结果”是真的结果吗&#xff1f; 从一线工程师跃升团队管理者一共分几步&#xff1f; 在不断变化的职场…

Linux粘滞位的理解,什么是粘滞位?

文章目录 前言如何理解&#xff1f;粘滞位的操作最后总结一下 前言 粘滞位&#xff08;Stickybit&#xff09;&#xff0c;或粘着位&#xff0c;是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位&#xff0c;如此以来&#xff0c;只有目录内文件的所有者或者root…