阮一峰的flex教程,阮一峰flex布局

http://www.itjxue.com  2023-01-15 23:11  来源:未知  点击次数: 

如何让div垂直居中(23种方法总结)

开篇序言:之前在华南理工大学计算机研究所面试,被一个老师抓着这个问题问了一下午 当时回答的很窘迫,大概只说出七八种 后面发现也有小伙伴遇到过这个面试题 所以今日来份总结

绝对定位在这个例子中会设置top:50%来抓取空间高度的50%,接着在将居中元素的margin-top设定为负一半的高度,这样就能让元素居中了,这种方式比较常见

又一个绝对定位的垂直居中的方案,这个方式比较特别一点,当元素设置为绝对定位后,假设它是抓不到整体可运用的空间范围,所以margin:auto会失效,但当你设置了top:0;bottom:0;时,绝对定位元素就抓到了可运用的空间了,这时你的margin:auto就生效了(神奇吧),如果你的绝对定位元素需要水平居中于父层,那你同样可以设定left:0;right:0;来让绝对定位元素取得空间可运用范围,再让marign-left与margin-right设定为auto即可居中。但此方式的缺点是你的定位元素必须有固定的宽高(百分比也算)才能正常居中。

我们用绝对定位时的top与right设置元素的上方跟左方各自设为50%,再利用translate(-50%,-50%)位移居中元素自身宽与高的50%就能达成居中的目的(疑惑点:再手机端ios中这个不太管用[微信公众号平台])

设定父层display:flex以及设定次轴(cross axis)属性align-items:center ,这个方式的优点是此层不需要设定高度即可自动居中

Flex有多种方式可以让你把数据居中,适用Flex-grow的延展特性来达成,这个例子中Amos适用了flex-direction:column直式排法,搭配:before伪元素适用flex-grow伸展值能够取得剩下所有空间的特性,把它设定成一半的剩余空间就能做到把内容数据准确的推到垂直中间位置,算是个传统技法的延伸方式。

继续用Flex来居中,由于Flex元素对空间解读的特殊性,我们只要在父层元素设定display:flex,接着在需要垂直居中的元素上设定margin:auto,即可自动居中

对flex次轴cross axis 的个别对齐方式只要对单一子层元素设定align-self:center就能达成垂直居中的目的

它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。

align-items属性设置单元格内容的垂直位置(上中下)。align-items不仅是Flex可用,连CSS Grid也拥有此属性可使用,但在Flex中align-items是针对次轴cross axis作对齐,而在CSS Grid中则是针对Y轴做对齐。

CSS Grid的align-content跟Flex的align-content有点差异,CSS Grid对于空间的解释会跟Flex有一些些的落差,所以导致align-content在Flex中仅能针对多行元素起作用,但在Grid中就没这个问题,所以我们可以很开心的使用align-content来对子元素做垂直居中

基本上就是对grid Y轴的个别对齐方式,只要对单一子层元素设置为align-self:center就能达成垂直居中

place-items这属性不知道有多少人用过,此属性是align-items与justify-items的缩写,简单的说就是水平与垂直的对齐方式,想当然的,设定center就能居中

place-content这属性有多少人用过,此属性是align-content与justify-content的缩写,简单的说就是水平与垂直的对齐方式,想当然的,设置center就能居中

继续用Grid来居中,由于Grid元素对空间解读的特殊性,我们只要在父层元素设定display:grid,接着在需要垂直居中的元素上设置margin:auto即可自动居中。

display属性将div设置成表格的单元格,这样就能利用支持存储单元格对齐的vertical-align属性来将信息垂直居中(此方法是在然也教育公司学到的参考了后端人员的写法)

常见于单行文字的应用,像是按钮这一类对象,或者是下拉框、导航此类元素最常见到的方式了。此方式的原理是在于将单行文字的行高设定后,文字会位于行高的垂直中间位置,利用此原理就能轻松达成垂直居中的需求

多行文本居中

:before 伪类元素搭配 inline-block 属性的写法应该是很传统的垂直居中的技巧了,此方式的好处在于子元素居中可以不需要特别设定高度,我们将利用:before伪类元素设定为100%高的inline-block,再搭配上将需要居中的子元素同样设置成inline-block性质后,就能使用vertical-align:middle来达到垂直居中的目的了,此方式在以往其实是个非常棒的垂直居中解决方案,唯独需要特别处理掉inline-block元素之间的4-5px空间这个小缺陷,但也很实用了。

在正常的状况下,align-content 仅能对次轴多行flex item做居中,但是当我今天子层元素不确定有多少个时,且有时可能会有单个的情况出现时,此技巧就能用到了(当然你也能有其他解法),既然是多行子元素才能用,那我们就为单个子组件多加两个兄弟吧,使用:before以及:after 来让子元素增加到多个,这样就能使用flex的align-content属性来居中

Cale是计算机英文单词calculator的缩写,这个由微软提出的css 方法,从此我们再也不用在那边绞尽脑汁的数学计算了,或是想办法用js来动态计算,我们可以很轻松的利用calc()这个方法,来将百分比及时且动态的计算出实际要的是什么高度,真可谓是划时代的一个方法啊,但这个方法需要注意的是大量使用的话,网页性能会是比较差的,所以请谨慎使用。

这个技巧是利用了top:50%的招式,让你的元素上方能产生固定百分比的距离,接着让要居中的元素本身使用tanslateY的百分比来达成垂直居中的需求,translate是一个很棒的属性,由于translate的百分比单位是利用元素自身的尺寸作为100%,这样让我们要利用元素自身宽高做事变得方便很多。

这个方式应该是比较少见到的有人使用的了,这个想法是被老友Paul所激发的,write-mode这个css属性的功能基本上跟垂直居中是八竿子打不着,它的用途是改变文字书写的方向从横变竖,且支持度从很早期的IE5就有支持了,但当时Amos很少使用,一来是网页多是横书较多,另外当时除了IE浏览器意外,其他浏览器的支持度都不是很好,也就很少使用了。

使用write-mode将一整个文字容器变成直书,接着将此容器利用text-align:center来达到垂直居中的目的,白话一点的解说就是,你把原本横排的文字变成竖排,所以原本横排用到的水平对齐方式,就变成了控制直排的中间了,原理就是这么简单。但要特别注意的是浏览器对此语法的支持度来说,需要拆开写法才行,不然某些浏览器的语法不同,可能会让你的网页在某些浏览器上看起来无效,这会是最需要注意到的

文末结尾: 暂时只能想到这么多了 其实也就几大类,margin grid布局 弹性布局flex,文本布局line-height和一些优点生僻calc,Write-mode,这23点只不过是把这些拆分成的,欢迎其他小伙伴补充以及期待在技术交流平台上看到其他更好的补充

文章参考资料有:前端开发公众号

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 阮一峰技术博客

5.flex布局中对容器设置的属性有哪些

Flex布局中对容器一共有6个属性,作用如下:

flex-direction????????????主轴方向

flex-wrap??????????????????轴线排不下,如何换行

flex-flow????????????????????是flex-direction属性和flex-wrap属性的简写形式

justify-content??????????项目在主轴上的对齐方式

align-items????????????????项目在交叉轴上的对齐方式

align-content???????????定义多根轴线的对齐方式

搜一下“Flex?布局教程:语法篇”可以找到阮一峰的一个博客,讲得挺详细。

CSS布局 + Flex布局

我们只会用到一点点儿CSS布局的属性,虽然少,但既然要用到,就得把它们总结在这里,搞明白。

在了解CSS布局的相关属性之前,我们先了解一下 盒子模型——CSS会把每个组件都看作是一个盒子,每个盒子从内往外有三个部分:

组件的宽度和高度决定了它在屏幕上显示的尺寸,一个组件的宽度和高度就是它 外边框所包围矩形 的宽度和高度,iOS里也是这样的。

我们可以通过 width 和 height 属性给一个组件设置固定的宽度,不过需要注意 这两个属性只能接收数值,不能带单位,这是因为RN要自己去适配安卓和iOS的单位。

在RN里,我们想让一个组件自适应宽高,要分两步。 首先我们要让该组件撑满它的父视图,即如果我们想自适应宽度,就得先让子视图的宽度撑满它父视图的宽度,如果我们想自适应高度,就得先让子视图撑满它父视图的高度,如果我们宽度和高度都想自适应,就得先让子视图把它父视图的宽度和高度都撑满。然后才能像我们iOS里使用Masonry那样,通过给组件添加上边距、左边距、下边距、右边距等约束来实现宽度和高度的自适应。

这里再对第一步做个解释, item的 flex: 1 属性可以让item在主轴上撑满它的容器,容器的 alignItems: 'stretch' 属性 + item在侧轴上不设置空间可以让item在侧轴上撑满它的容器。 好像有点不明白是吧,我们再通过一个例子来说得明了点,RN里不是默认主轴为竖向、侧轴为横向嘛,我们就采取这个默认状态来举例子。 在RN里,默认主轴为竖向、侧轴为横向的状态下,如果我们想让某个组件自适应高度,就得首先在它自身上设置 flex: 1 属性,来让它的高度撑满它的父视图;如果我们想让某个组件自适应宽度,就得首先在它父视图身上设置 alignItems: 'stretch' 属性(当然默认就是这个值),这还不够,你还得确保不给这个组件设置 width 属性或者 width 属性的值设为 auto ;如果我们想让一个组件自适应宽高,则两者都得做。 当然,如果我们设置了主轴为横向、侧轴为竖向,其实也是一样的道理,自己捋一下就知道怎么做了。如果还是看不懂的话,没有关系,下面我们会详细谈到这几个属性,等你学了这几个属性,反过头来看这里就明白了。

Flex是Flexible Box的缩写,可译为灵活的、有弹性的盒子。那Flex布局就是Flexible Box布局的缩写,就译为弹性盒子布局,用来对一个盒子进行灵活的布局。

在了解Flex布局之前,我们得先了解一下Flex布局里的两对儿 重要的 概念。

采用Flex布局的组件,被称为Flex容器(flex container),简称容器(container)。

这个组件上的子组件,被称为Flex项目(flex item),简称item(项目)。

我们可以把容器和item看做是父视图和子视图的关系, 因此下文中的容器、父组件、父视图将是一样的概念,item、组件、子视图将是一样的概念,组件和视图将是一样的概念。

每个容器都有两根轴,一个是 主轴, 一个是 侧轴 。

容器里众多的 item自动沿主轴进行排列。

一个item在主轴方向上所占据的空间称为 main size ,一个item在侧轴方向上所占据的空间称为 cross size 。

RN里主轴的默认方向为竖向,侧轴为横向。 浏览器里主轴的默认方向为横向,侧轴为竖向,下面我们讲Flex布局的属性时会采用浏览器的状态,学会后对应到RN里,换个主轴方向就可以了。

用在容器上的属性,最常用的有 5个 , 而且这些属性还都不是从来设置容器自己的布局,而是用来设置容器里item的布局。

flex-direction 属性用来设置主轴的方向,即容器里item自动排列的方向。 在浏览器里,主轴的方向默认为横向,所以 flex-direction 属性的默认值为 row 。

它有4种取值。

justify-content 属性用来设置item在主轴上的对齐方式。

它有5种取值。

align-items 属性用来设置item在侧轴上的对齐方式。

它有5种取值。

默认情况下,一个容器只有一条主轴,所有的item都会沿着这条主轴自动排列下去,但是如果item太多了,一个屏幕长度的主轴根本串儿不下这么多item,那后面的item就会溢出屏幕,而界面还不是 ScrollView ,不能滚动,怎么办呢?

flex-wrap 属性用来设置换行,即当容器主轴上显示不下那么多的item时,我们可以让item换行来显示,并且一旦设置了换行,那么这个容器就不再是一条主轴了,而是会有多条平行的主轴。

它有3种取值。

align-content 属性用来设置多条主轴的对齐方式, 如果项目只有一根轴线,该属性不起作用, 即 align-content 属性要基于 flex-wrap 属性设置了换行才有使用的意义。

它有6种取值。

用在item上的属性,最常用的有 2个 , 这些属性都是用来设置item自己的布局。

在第1小节容器的属性,我们已经通过 align-items 属性统一设置了容器里item在侧轴上的对齐方式,但如果其中某个item不想遵循这个对齐方式怎么办呢?我们会常见到这种场景,10个里有8个item是一样的对齐方式,就有1、2个item特立独行,那我们就得用item自己的 align-self 属性来单独给它们设置对齐方式了。

align-self 属性用来设置单个item在侧轴上的对齐方式, 注意是给特立独行的单个item设置哦,而且是侧轴,它会覆盖它容器的 align-items 属性,当然如果不设置这个属性,默认值就为 auto ,即item会默认使用容器的 align-items 属性给它设置的对齐方式。

它有6种取值,除了 auto ,其他都与 align-items 属性完全一致。怎么说呢,item的 align-self 属性似乎是用来造反的,反抗它容器的 align-items 属性。

flex 属性接收一个整数值, flex 属性描述起来太麻烦了,可以自行去搜索加深理解,我这里只列举出它的用途及注意事项。

(1) flex 属性有三个用途

(2)使用 flex 属性需注意

iOS里怎么使用Masonry布局的,RN里就怎么使用 Flex布局+CSS布局 来做布局就行了,它们布局的思路是一样的, 一个组件也同样至少需要四个约束。

当然,它们之间有一个极其细小的差别,那就是:上面提到的“RN里组件自适应宽高分两步”,而iOS里Masonry才不管你什么撑满不撑满呢。

当然,它们之间有一个极其巨大的差别,那就是:iOS里是没有主轴和侧轴之分的,你可以在一个父视图上横向、竖向同时放控件,并同时完成横向和竖向的布局。但RN里有主轴和侧轴之分,我们添加的组件只会沿着主轴排列,不可能同时出现横向和竖向排列,并且布局的时候也只能是沿着主轴布局,不可能同时完成两个方向的布局。

下面我们就通过几个小练习,来对比一下Masonry布局和Flex布局+CSS布局的思路,加深对RN里怎么布局组件的理解。

Masonry:

Flex布局+CSS布局:

Masonry:

Flex布局+CSS布局:

Masonry:

Flex布局+CSS布局:

Masonry:

Flex布局+CSS布局:

参考博客:

阮一峰的《Flex布局:语法篇》

阮一峰的《Flex布局:实例篇》

【归纳】flex布局

说到flex布局,在我之前的影响中,只知道这是一种较传统布局较方便的布局,这种布局对我来说是全新的。在flex布局出现之前,我们使用的传统布局主要有以下几种:

这些传统的布局方式虽然可以满足我们的很多需求,但是也并不方便,比如实现垂直居中。而现在我们就要开始接触flex布局这种新的布局方式了。flex也可称为“弹性布局”,flex布局有以下几个特点:

接下来就将对flex布局的几个重要知识点进行归纳。

采用flex布局的元素,称为flex容器(flex container)。它的所有子元素自动成为容器成员,称为flex项目(flex item)。

如上图所示,该flex容器在纵横有两根轴,其中横向的称为主轴(main axis),纵向的称为侧轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。子元素默认是沿主轴排列的。子元素在主轴方向的宽度叫做main size,在侧轴方向的高度叫做cross size。

flex container(flex容器)有如下六个属性:

该属性主要有以下值:

该属性主要有以下值:

默认值为row nowrap,可以以如下方法设定该属性:

该属性主要有以下值:

该属性主要有以下值:

该属性主要有以下值:

flex item(子元素)有如下六个属性:

该属性默认值为0。

如果所有子元素的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个子元素的flex-grow属性为2,其他子元素都为1,则前者占据的剩余空间将比其他项多一倍。

该属性默认值为1。

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

flex-basis属性定义了在分配多余空间之前,子元素占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即子元素的本来宽度。

默认值为0 1 auto。可以以如下方式设定该属性:

数值越小,排列越靠前,默认为0。

即不使用父元素决定的对齐方式,自身设定一个对齐方式。可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

flex 布局可以简便、完整、响应式地实现各种页面布局。下面就简要地记录几个flex布局的技巧

如果内容被修剪,需要浏览器显示滚动条,以便查看剩余内容,可以使用 over-flow:auto;

实现手机上中下布局:

以上就是我此次关于flex学习的一些记录。可以看出,这次学习是围绕着阮一峰的一篇关于flex的博客展开的,他的博客对我此次学习flex布局以及此次的flex博客编写起到了一定的帮助。除此之外,我在这里推荐两个关于flex学习的小游戏,寓教于乐,十分有趣。

博客原地址:

flex:1 表达的含义

flex 布局,我相信大家都非常熟悉, 但是要说到 flex:1 表达的含义,我相信很多同学说不出来。

很多同学入门flex 的时候,应该都是看了 阮一峰的flex 科普文章

想要梳理清晰flex:1的含义,我们先学习下flex 这个css属性表达了哪些含义

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

从这里就可以推导出

相当于

我一开始理解的也是这样。 后面的分析会推翻我这里的结论

flex-basis 也是一个比较难理解的点,我写了 深入理解flex-basis 来梳理这个知识点,不懂得可以查看。这里我们重点解析flex:1。

我写了一个简单的demo 来提供分析:

我们看下浏览器输出的效果:

可以看到,无论内容是多少,我们都实现等分。

我们看下控制台:

发现:

其实相当于:

看另一个例子:

浏览器显示效果:

依然是等分

再来一个类似的例子:

浏览器显示效果:

依然是等分

从以上的分析调试,我们可以初步分析

接下来,看下 flex: 1 1 auto 的效果

浏览器显示效果:

没有等分

写到这里,我们在细细品味下flex-basic的含义

auto 表示项目本身的大小, 如果设置为 auto, 那么这三个盒子就会按照剩余的空间,等比例缩放

如果随便设置一个其他带有长度单位的数字呢, 例如

又因为 c1.width = c2.width = c3.width,所以最终的效果就是 c1, c2, c3 进行了等分缩放。

(责任编辑:IT教学网)

更多