当前位置: 首页 > Web前端 > CSS

样式篇-Flex弹框布局(推荐收藏)

时间:2023-03-30 17:30:06 CSS

一、简介传统的CSS布局基本就是div+css布局,依赖于盒模型,通过position、float、display等实现,但是对于一些特殊布局,不太容易实现,比如垂直居中布局。2009年,W3C提出了一种新的解决方案——Flex布局,可以以简单、完整、响应式的方式实现各种页面布局。目前大多数浏览器都支持Flex属性。一直在用Flex,但是只知道一些属性怎么用,有些属性我都不知道怎么用,比如:order,flex-grow等。写这篇文章的目的是主要是做一个总结和整理,加深印象。2、什么是Flex布局Flex是FlexibleBox的缩写,意思是“弹性布局”。CSSflexibleboxlayout是CSS的模块之一,定义了一种针对用户界面设计优化的CSS盒子模型。在弹性布局模型中,弹性容器的子元素可以任意方向排列,也可以“弹性扩展”它的尺寸,要么增大尺寸填充未使用的空间,要么缩小尺寸防止父元素溢出。子元素的水平对齐和垂直对齐可以很容易地操作。可以通过嵌套框(垂直框内的水平框,或水平框内的垂直框)以二维方式构建布局。——MDN3.基本概念3.1.容器采用弹性布局的元素称为弹性容器,简称“容器”。它的所有子元素都自动成为容器成员,称为弹性项(flexitem),简称“项”,也称为弹性元素。3.2.两轴Flex的两个轴分别是主轴和横轴,可以简单理解为水平方向和垂直方向。默认情况下,主轴对应水平方向,横轴对应垂直方向,但这种对应关系是可以修改的(通过flex-direction属性)。在很多情况下,我们确实需要修改它。如何修改它会在下面讨论到达。3.3.在开始行和结束行之前,我们一般默认文档是从左往右写的,但是Flex没有左右的概念。默认情况下,flex-direction属性的值为row,表示主轴是水平的。起跑线(即起点)在左边。flex-direction属性还有其他的属性值,这里就不一一列举了,后面会详细介绍。4.CSS属性4.1。使用Flex布局将元素指定为Flex容器非常简单。.box{display:flex;}内联元素也可以指定为弹性容器。.box{display:inline-flex;}基于Webkit的浏览器。.box{显示:-webkit-flex;/*Safari*/display:flex;}注意设置flex布局后,子元素的float、clear、vertical-align属性将失效。4.2.容器的属性容器可以设置以下6个属性:flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content首先初始化我们的页面/*HTML*/一个

两个
三个
/*CSS*/.container{width:800px;高度:400px;边距:100px自动;border:1pxdashed#00f;}.item{border:1pxsolid#000;text-align:center;}此时我们的页面就像这个flex-direction属性flex-direction属性允许我们改变flex元素的排列方向(也就是主轴的方向),它有四个值。.box{弹性方向:行|行反转|栏目|列反转;/*row(默认):主轴是水平的,起点在左端。*//*row-reverse:主轴为水平方向,起点在右端。*//*column:主轴垂直,起点在上。*//*column-reverse:主轴垂直,起点在下方。*/}注意,当主轴为水平时,对应的横轴为垂直,反之亦然。嗯。..来看看效果吧,先把容器设置为flex容器。container{...display:flex;}然后设置flex-direction属性。效果就不一一展示了,太占篇幅了,放一张对比效果图。这很清楚。有些人可能已经注意到,项目在交叉轴的方向上被拉伸了。这是因为还有一个属性,就是align-items。它的作用是控制容器内物品的交叉。关于轴上的排列,后面会介绍,这里不再赘述。flex-wrap属性默认情况下,项目排列在一条线上(也称为“轴”)。flex-wrap属性定义了轴线不适合时如何换行。.box{flex-wrap:nowrap|包装|换行;/*nowrap(default):nonewline*//*wrap:newline,firstlineinfront*//*wrap-reverse:newline,firstlineIntheback*/}还是要写,先改上面的flex-direction属性为默认,或者删除,现在的效果是这样的然后,我们给容器中的item设置宽度,让内容的宽度超过容器的宽度Width.item{width:300px;/*每个item的宽度都是300px,一共是900px*/...}可以看到每个item的宽度都设置为300px,已经超过了容器宽度800px,但是item没有换行,但是压缩在一行中,让我们看看flex-wrap的功能,或者展示一下对比图。对比一下就很清楚了,nowrap其实就是默认的属性值,没有换行,在容器中压缩显示,wrap和wrap-reverse都是换行,只是不同行的显示顺序不一样。flex-flow属性可以将flex-direction和flex-wrap这两个属性组合成简写属性flex-flow。第一个指定flex-direction的值,第二个指定flex-wrap的值。默认值是:rownowrapjustify-content属性justify-content属性定义项目在主轴上的对齐方式。证明内容:flex-start;/*默认,左对齐*/justify-content:flex-end;/*右对齐*/justify-content:center;/*居中*/justify-content:space-between;/*两端对齐,item之间的间距相等(第一个元素在开头,最后一个元素在结尾)*/justify-content:space-around;/*均匀排列每个元素,并在每个元素周围分配相同的空间*/justify-content:space-evenly;/*均匀排列每个元素,每个元素之间的间距是相等的*/看一下对比图space-around和space-evenly要分清楚,两者都是均匀分布的,区别在于元素之间的距离是否容器和元素的两端是相等的。align-items属性align-items属性定义项目如何在交叉轴上对齐。上面说的flex-direction属性的最后一部分就是这个属性。现在就一起来看看吧。对齐项目:弹性启动;/*元素与横轴的起点对齐*/align-items:flex-end;/*元素对齐到横轴的末端*/align-items:center;/*元素在横轴上居中对齐。*/对齐项目:基线;/*项目第一行文本的基线对齐方式*/align-items:stretch;/*默认情况下,如果item没有设置高度或者设置为auto,它会占据整个容器的高度。*/可以看到当属性值为stretch时,效果和一开始是一样的,因为这是默认的属性值。align-content属性align-content属性定义了多个轴在交叉轴上的对齐方式。这是轴的对齐方式,而不是项目。对齐内容:flex-start;/*与横轴的起点对齐*/align-content:flex-end;/*对齐横轴的末端*/align-content:center;/*在交叉轴的中心对齐*/align-content:space-between;/*对齐横轴的两端,轴之间的间隔均匀分布*/align-content:space-around;/*每条轴两边的间隔相等*/align-content:space-evenly;/*均匀分布,两端与各轴的距离相等*/align-content:stretch;/*默认情况下,轴占据整个横轴*/这里有一点需要注意,当内容高度(或宽度)不固定时,align-content默认的属性值为stretch,也就是长度填充横轴。这时候设置align-items就可以看到效果了。但如果将align-content设置为其他属性,则align-items设置的属性可能“无效”。其实并不是无效的,因为设置了除stretch之外的align-content属性后,每个主轴的content高度(或宽度)都会被压缩。当然,如果此时再设置align-items,是看不到任何效果的。最后再看一下对比图4.3,项目的属性。该项目可以设置以下属性:orderflex-growflex-shrinkflex-basisflexalign-selforder属性order属性定义了项目(元素)的顺序。值越小,排名越高,默认为0。或者先修改页面代码/*HTML*/onetwothree/*CSS*/.container{width:800px;高度:400px;边距:100px自动;边框:1px虚线#00f;显示:弹性;:flex-start;}.item{宽度:200px;边距:20px0;边框:1px实心#000;text-align:center;}现在的效果是加上这样的CSS代码this.item1{order:3}.item2{order:2}.item3{order:1}可以看到排序顺序变了,越小的订单价值越高,排名越高,也可以为负数。flex-grow属性flex-grow属性定义了item的放大比例,默认为0,即如果有剩余空间,则不放大。先还原代码,单独添加代码/*setallitemsto1*/.item{flex-grow:1;}/*onlysetitem1*/.item1{flex-grow:1;}/*onlySet*/.item1{flex-grow:1;}.item2{flex-grow:1;}item1和item2再看对比可以发现如果只有一个元素设置了flex-grow的属性会更大大于0,那么这个Elements占用了剩余的空间。如果给多个元素设置同一个flwx-grow属性,那么这些元素会平分剩余的空间。还有一种情况我没有列举。为不同的元素设置不同大小的flex-grow属性。这时候会根据flex-grow的大小分配不同大小的空间。上面我说的是,当容器有剩余空间时,如果项目里装满了容器,那么设置flex-grow的名字是没有作用的。flex-shrink属性flex-shrink属性指定了flex元素的收缩规则。flex元素只有在默认宽度之和大于容器时才会收缩,收缩的大小取决于flex-shrink的值,默认为1。.container{宽度:400px;/*容器宽度小于项目宽度之和*/}.item1{flex-shrink:2;}你可以看到第一个元素比其他两个元素压缩了两倍。这是因为flex-shrink的默认值是1,我们对第一个元素设置为2。flex-basis属性flex-basis属性指定了flex元素在主轴方向上的初始大小。如果不使用box-sizing来改变盒子模型,那么这个属性决定了flex元素的内容框(content-box)的大小。当我们设置为auto时,就是使用item原来的宽度。flex属性flex属性是flex-grow、flex-shrink和flex-basis的简写,默认值为01auto。最后两个属性是可选的。有几种写法:Single-valuesyntax没有单位的值会被当作flex-grow的属性值。有效的宽度值(例如:10px)将被视为flex-basis属性的值。关键字none、auto或initial。双值语法的第一个值必须是一个无单位的数字,它将被用作的值。第二个值必须是以下之一:一个无单位的数字:它将作为的值。有效的宽度值(例如:10px)将被视为flex-basis属性的值。三值语法的第一个值必须是一个无单位的数字,它将作为的值。第二个值必须是一个无单位的数字,它将被用作的值。第三个值必须是有效的宽度值,它将被视为的值。弹性:自动;/*等同于flex:11auto*/flex:none;/*等同于flex:00auto*/align-self属性align-self属性可以设置单个item与其他item不同的对齐方式,可以重写align-items属性,默认值为auto,即表示继承父元素的align-items属性。align-self的属性值和align-items一样,只是多了一个auto。上图中,align-items:flex-start;为容器设置,然后单独为第一个元素设置align-self:flex-end;您可以看到该元素的排列方式与其他元素不同。好了,概念和语法就这些了,我也参考了很多资料。如有补充或错误请指正,万分感谢!!!觉得有用的话可以点赞+收藏哦!参考资料:MDN-CSSFlexibleBoxLayout阮一峰-FlexLayout教程:语法