flex 布局的基本概念 - 详解

flex 布局的基本概念

  • Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。本文给出了 flexbox 的主要特性,更多的细节将在别的文档中探索。
  • 我们说 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素布局,一行或者一列。作为对比的是另外一个二维布局 CSS Grid Layout,可以同时处理行和列上的布局。

flexbox 的两根轴线

  • 当使用 flex 布局时,首先想到的是两根轴线 — 主轴和交叉轴。主轴由 flex-direction 定义,另一根轴垂直于它。我们使用 flexbox 的所有属性都跟这两根轴线有关,所以有必要在一开始首先理解它。

主轴

  • 主轴由 flex-direction 定义,可以取 4 个值:
  • row
  • row-reverse
  • column
  • column-reverse
  • 如果你选择了 row 或者 row-reverse,你的主轴将沿着 inline 方向延伸。
  • If flex-direction is set to row the main axis runs along the row in the inline direction.
  • 选择 column 或者 column-reverse 时,你的主轴会沿着上下方向延伸 — 也就是 block 排列的方向。
  • If flex-direction is set to column the main axis runs in the block direction.

交叉轴

  • 交叉轴垂直于主轴,所以如果你的flex-direction (主轴) 设成了 row 或者 row-reverse 的话,交叉轴的方向就是沿着列向下的。
  • If flex-direction is set to row then the cross axis runs in the block direction.
  • 如果主轴方向设成了 column 或者 column-reverse,交叉轴就是水平方向。
  • If flex-direction is set to column then the cross axis runs in the inline direction.
  • 理解主轴和交叉轴的概念对于对齐 flexbox 里面的元素是很重要的;flexbox 的特性是沿着主轴或者交叉轴对齐之中的元素。

起始线和终止线

  • 另外一个需要理解的重点是 flexbox 不会对文档的书写模式提供假设。过去,CSS 的书写模式主要被认为是水平的,从左到右的。现代的布局方式涵盖了书写模式的范围,所以我们不再假设一行文字是从文档的左上角开始向右书写,新的行也不是必须出现在另一行的下面。
  • 你可以在接下来的文章中学到更多 flexbox 和书写模式关系的详细说明。下面的描述是来帮助我们理解为什么不用上下左右来描述 flexbox 元素的方向。
  • 如果 flex-directionrow ,并且我是在书写英文,那么主轴的起始线是左边,终止线是右边。
  • Working in English the start edge is on the left.
  • 如果我在书写阿拉伯文,那么主轴的起始线是右边,终止线是左边。
  • The start edge in a RTL language is on the right.
  • 在这两种情况下,交叉轴的起始线是 flex 容器的顶部,终止线是底部,因为两种语言都是水平书写模式。
  • 之后,你会觉得用起始和终止来描述比左右更合适,这会对你理解其他相同模式的布局方法(例如:CSS Grid Layout)起到帮助的作用。

Flex 容器

  • 文档中采用了 flexbox 的区域就叫做 flex 容器。为了创建 flex 容器,我们把一个容器的 display 属性值改为 flex 或者 inline-flex。完成这一步之后,容器中的直系子元素就会变为 flex 元素。所有 CSS 属性都会有一个初始值,所以 flex 容器中的所有 flex 元素都会有下列行为:

    • 元素排列为一行 (flex-direction 属性的初始值是 row)。
    • 元素从主轴的起始线开始。
    • 元素不会在主维度方向拉伸,但是可以缩小。
    • 元素被拉伸来填充交叉轴大小。
    • flex-basis 属性为 auto
    • flex-wrap 属性为 nowrap
  • 这会让你的元素呈线形排列,并且把自己的大小作为主轴上的大小。如果有太多元素超出容器,它们会溢出而不会换行。如果一些元素比其他元素高,那么元素会沿交叉轴被拉伸来填满它的大小。

更改 flex 方向 flex-direction

  • 在 flex 容器中添加 flex-direction 属性可以让我们更改 flex 元素的排列方向。设置 flex-direction: row-reverse 可以让元素沿着行的方向显示,但是起始线和终止线位置会交换。

  • 把 flex 容器的属性 flex-direction 改为 column ,主轴和交叉轴交换,元素沿着列的方向排列显示。改为 column-reverse ,起始线和终止线交换。

  • 下面的例子中,flex-direction 值为 row-reverse。尝试使用其他的值 rowcolumncolumn-reverse,看看内容会发生什么改变。

用 flex-wrap 实现多行 Flex 容器

  • 虽然flexbox是一维模型,但可以使我们的flex项目应用到多行中。在这样做的时候,您应该把每一行看作一个新的flex容器。任何空间分布都将在该行上发生,而不影响该空间分布的其他行。

  • 为了实现多行效果,请为属性flex-wrap添加一个属性值wrap。现在,如果您的项目太大而无法全部显示在一行中,则会换行显示。下面的实时例子包含已给出宽度的项目,对于flex容器,项目的子元素总宽度大于容器最大宽度。由于flex-wrap的值设置为wrap,所以项目的子元素换行显示。若将其设置为nowrap,这也是初始值,它们将会缩小以适应容器,因为它们使用的是允许缩小的初始Flexbox值。如果项目的子元素无法缩小,使用nowrap会导致溢出,或者缩小程度还不够小。

简写属性 flex-flow

  • 你可以将两个属性 flex-directionflex-wrap 组合为简写属性 flex-flow。第一个指定的值为 flex-direction ,第二个指定的值为 flex-wrap.

  • 在下面的例子中,尝试将第一个值修改为 flex-direction 的允许取值之一,即 row, row-reverse, columncolumn-reverse, 并尝试将第二个指定值修改为 wrapnowrap

flex 元素上的属性

  • 为了更好地控制 flex 元素,有三个属性可以作用于它们:

    • flex-grow
    • flex-shrink
    • flex-basis
  • 在这里,我们只会大概介绍一下它们的用法,更详细的细节请参阅其他的文章。

  • 在考虑这几个属性的作用之前,需要先了解一下 可用空间 available space 这个概念。这几个 flex 属性的作用其实就是改变了 flex 容器中的可用空间的行为。同时,可用空间对于 flex 元素的对齐行为也是很重要的。

  • 假设在 1 个 500px 的容器中,我们有 3 个 100px 宽的元素,那么这 3 个元素需要占 300px 的宽,剩下 200px 的可用空间。在默认情况下,flexbox 的行为会把这 200px 的空间留在最后一个元素的后面。

    This flex container has available space after laying out the items.

  • 如果期望这些元素能自动地扩展去填充满剩下的空间,那么我们需要去控制可用空间在这几个元素间如何分配,这就是元素上的那些 flex 属性要做的事。

Flex 元素属性:flex-basis

  • flex-basis 定义了该元素的空间大小the size of that item in terms of the space),flex 容器里除了元素所占的空间以外的富余空间就是可用空间 available space。该属性的默认值是 auto 。此时,浏览器会检测这个元素是否具有确定的尺寸。在上面的例子中,所有元素都设定了宽度(width)为 100px,所以 flex-basis 的值为 100px。
  • 如果没有给元素设定尺寸,flex-basis 的值采用元素内容的尺寸。这就解释了:我们给只要给 Flex 元素的父元素声明 display: flex ,所有子元素就会排成一行,且自动分配小大以充分展示元素的内容。

Flex 元素属性:flex-grow

  • flex-grow 若被赋值为一个正整数,flex 元素会以 flex-basis 为基础,沿主轴方向增长尺寸。这会使该元素延展,并占据此方向轴上的可用空间(available space)。如果有其他元素也被允许延展,那么他们会各自占据可用空间的一部分。
  • 如果我们给上例中的所有元素设定 flex-grow 值为 1,容器中的可用空间会被这些元素平分。它们会延展以填满容器主轴方向上的空间。
  • flex-grow 属性可以按比例分配空间。如果第一个元素 flex-grow 值为 2,其他元素值为 1,则第一个元素将占有 2/4(上例中,即为 200px 中的 100px), 另外两个元素各占有 1/4(各 50px)。

Flex 元素属性: flex-shrink

  • flex-grow属性是处理 flex 元素在主轴上增加空间的问题,相反flex-shrink属性是处理 flex 元素收缩的问题。如果我们的容器中没有足够排列 flex 元素的空间,那么可以把 flex 元素flex-shrink属性设置为正整数来缩小它所占空间到flex-basis以下。与flex-grow属性一样,可以赋予不同的值来控制 flex 元素收缩的程度 —— 给flex-shrink属性赋予更大的数值可以比赋予小数值的同级元素收缩程度更大。
  • 在计算 flex 元素收缩的大小时,它的最小尺寸也会被考虑进去,就是说实际上 flex-shrink 属性可能会和 flex-grow 属性表现的不一致.
  • 备注: 在给 flex-growflex-shrink 赋值时要注意比例。如果我们给所有 flex 元素的 flex 属性赋值为 1 1 200px ,并且希望其中一个元素可以增加到 2 倍,我们可以给该元素的 flex 属性赋值为2 1 200px。当然,你也可以选择赋值为 flex: 10 1 200px 和 flex: 20 1 200px

Flex 属性的简写

  • 你可能很少看到 flex-growflex-shrink,和 flex-basis 属性单独使用,而是混合着写在 flex 简写形式中。 Flex 简写形式允许你把三个数值按这个顺序书写 — flex-growflex-shrinkflex-basis

  • 你可以在下面的实例中尝试把 flex 简写形式中的数值更改为不同数值,但要记得第一个数值是 flex-grow。赋值为正数的话是让元素增加所占空间。第二个数值是flex-shrink — 正数可以让它缩小所占空间,但是只有在 flex 元素总和超出主轴才会生效。最后一个数值是 flex-basis;flex 元素是在这个基准值的基础上缩放的。

  • 大多数情况下可以用预定义的简写形式。在这个教程中你可能经常会看到这种写法,许多情况下你都可以这么使用。下面是几种预定义的值:

    • flex: initial
    • flex: auto
    • flex: none
    • flex:
  • flex: initial 是把 flex 元素重置为 Flexbox 的初始值,它相当于 flex: 0 1 auto。在这里 flex-grow 的值为 0,所以 flex 元素不会超过它们 flex-basis 的尺寸。flex-shrink 的值为 1, 所以可以缩小 flex 元素来防止它们溢出。flex-basis 的值为 auto. Flex 元素尺寸可以是在主维度上设置的,也可以是根据内容自动得到的。

  • flex: auto 等同于 flex: 1 1 auto;和上面的 flex:initial 基本相同,但是这种情况下,flex 元素在需要的时候既可以拉伸也可以收缩。

  • flex: none 可以把 flex 元素设置为不可伸缩。它和设置为 flex: 0 0 auto 是一样的。元素既不能拉伸或者收缩,但是元素会按具有 flex-basis: auto 属性的 flexbox 进行布局。

  • 你在教程中常看到的 flex: 1 或者 flex: 2 等等。它相当于flex: 1 1 0 或者 flex: 2 1 0。元素可以在 flex-basis 为 0 的基础上伸缩。

    尝试在下面的实例中应用这些简写值。

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

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

相关文章

祝妈妈生日快乐的html的代码,祝妈妈生日快乐的朋友圈说说 祝妈妈生日快乐的说说句子...

妈妈是这个世界上伟大而又平凡的人物,给了我们生命,同时承担教育之责,很少会有机会和妈妈说一些暖心的话,所以在妈妈生日这一天,一定要祝妈妈生日快乐,下面八宝网小编就带来祝妈妈生日快乐的朋友圈说说,祝妈妈生日快乐的说说句子。 祝妈妈生日快乐的朋友圈说说 妈妈,今天…

生日祝福html_更新,礼包选择,头像框及太子生日金币活动

幻之试炼2: 全人物解锁教学 ||| 全通关方法总结 |||全隐藏关卡、bug总结 本周攻略: 百忍大战攻略 ||| C忍-忍者新秀止水教学 ||| B忍六尾人柱力羽高教学 ||| 截至10/5日,微信QQ全礼包 >>>本周快报活动更新 忍法帖新忍者—金加银角 1…

23岁生日感言:坚持到成功的那刻为止

子健说 王子健的创业之路 作者 l 王子健 来源 l 子健说(ID:zijianshuo) 转载请联系授权(微信ID:WZJ455) 今天是2019年5月3日,我已经正式步入了23岁。 美美地睡了一个懒觉,舒服地泡…

高晓松50岁生日感言:可感恩的很多,可原谅的很少

点击“技术领导力”关注∆ 每天早上8:30推送 作者 l 文七君 来源 l 粥左罗(ID:fangdushe520) 2019年11月14日,高晓松50岁。 凌晨时分,他发了张敷着面膜的自拍。下午三点,又补发了一篇长文。 高晓松说过&a…

【C++】string类的模拟实现

目录 1.默认成员函数1.1 构造函数1.2 拷贝构造1.2.1 传统写法1.2.2 现代写法 1.3 赋值构造1.3.1 传统写法1.3.2 现代写法 1.4 析构函数 2.其他成员函数2.1 迭代器2.2 容量操作2.2.1 size()2.2.2 capacity()2.2.3 reserve()2.2.4 resize()2.2.5 clear() 2.3 访问操作&#xff08…

一文读懂TSC时钟: (x86_64/arm64)实现介绍和编程使用

Linux(16)之Time Stamp Counter Author:Once Day Date:2023年5月30日 参考文档: 4. Environment Abstraction Layer — Data Plane Development Kit 23.03.0 documentation (dpdk.org)DPDK: lib/eal/include/generic/rte_cycles.h File Reference测量…

反射之使用自定义注解并处理自定义注解

注解:说起注解初学者可能不太明白,annotation是jdk1.5 引入的新特性,中文名叫注解,它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员…

java自定义注解解析及自定义注解

jdk1.5之后提供了注解(Annotation)这一种语法。其主要作用是编译检查(比如override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一般…

自定义注解开发

自定义注解的语法要求: Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface Description {String desc();String author();int age() default 18; } 首先我们要明确这不是一个接口&#x…

自定义注解(上)自定义注解的定义和检查

什么是注解? 注解是接口的一种变型,定义一组属性,让类、方法或属性用标记的方式调用这些属性。不仅是带有一些属性和值,某些注解带有一些特殊的功能。 如单元测试Test,可以让方法不依赖主函数单独运行,右…

自定义注解详解

文章引用 深入理解Java:注解(Annotation)自定义注解入门 自定义注解详细介绍 说在最前 文章忽略特性的一些基本概念 注解的本质是反射 1. 自定义注解 注解其实就是一种标记,可以在程序代码中的关键节点(类、方法、…

查看 HTTP 请求的数据.

文章结构 如果是 GET 请求如果是 POST 请求方法1:DEBUG 窗口(**爽、超级爽、吴迪爽**):方法2:写方法读取流中数据(繁琐,难用): 我们可能会碰到 MVC 拿不到前端的参数&…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发,开发工具采用Microsoft Visual Studio 2010集成开发环境,后台编程语言采用C#编程语言来进行编程开发,数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息,整个…

【软硬件测试】测试经验:软硬件结合测试要点

目录 一、应用行业 二、测试要点 三、硬件测试 (1)测试含义 (2)测试方法 (3)相关链接 四、结合测试 (1)测试含义 (2)测试工具 (3&am…

【ros/ros2】LCN及ros2节点的LCN改写

文章目录 序言1. ros2两种节点类型2. LCN是什么3. LCN状态转换4. LCN状态转换要做的事5. LCN节点功能划分6. ros2节点的LCN改写 序言 背景:ros2节点改写为lifecycle node节点 1. ros2两种节点类型 Node:和ros1中一样的节点基类LifecycleNode&#xff…

桶排序 — 计数排序和基数排序

计数排序 int类型数组,其中存的是员工的年龄。比如说16 - 150。对于这样的数据来讲,数据状况是受限的。此时如果将数组从小到大进行排序,该如果实现? 这个实现很简单,实现一个统计数组范围从 0 ~ 150,遍历原…

816墨盒计算机无法与,816墨盒怎么加墨 816墨盒加墨方法及注意问题【详解】

导语:随着时代的快速发展,人们生活水平的不断提高,打印机在我们日常生活中的应用也变得非常广泛,利用打印机打印文件,还有一些重要的材料,方便了人们的生活,给人们的生活提供了很大的便利&#…

打印机 检测到用过的耗材或者赝品耗材

检测到用过的耗材或者赝品耗材 大家好,今天续着给大家分享下惠普的803/805墨盒加墨应该注意的事项,先预习,加墨就没那么多困惑了~ 加墨后打印白线条、溅墨怎么办? ①先用温水浸泡打印头约30秒(注意不要泡到芯片&…

打印机墨盒问题

因为打印机墨盒属于耗材,容易损坏,从而造成打印机没法打印。对于家用打印机来说,一个打印机也就三四百块钱,然后换一个新墨盒就得花掉一百左右,心里感觉贼不爽,墨盒那么小一个,居然要那么贵&…

墨盒 连供漏墨恒压问题

你提出了一个连供压力平衡原理的问题。 连供形状各式各样,但基本原理都是相同的。 以红色为例: 如上图。打印机静止时,墨水室的墨水重力,等于墨水室上方因为空气变稀薄后产生的负压。墨水不会流动。实现了压力的静平衡。 打印机工…