css进阶之二:flex弹性布局
布局模式是指一个盒子与其兄弟、祖先盒的关系决定其尺寸与位置的算法。css2.1中定义了四种布局模式,分别是块布局、行内布局、表格布局、以及定位布局。css3引入了新的布局模式Flexbox布局,灵活度更高,可以让容器有能力改变子项目的宽高以及排序,以要求的方式填充可用空间,而且其方向有这不可预知性,使用非常灵活。
本文的最佳实践:twibo-vue
基础知识
方向:主轴与交叉轴(侧轴)
useragent沿着伸缩容器的主轴配置伸缩项目,从容器的主轴起点边开始往终点边结束。交叉轴的方向与主轴垂直。常规的布局是基于块和内联流方向,而flex布局是基于flex-flow流的。如下图中flexItem在水平方向排列,这样就说明水平方向是主轴,垂直方向就是交叉轴。
容器:伸缩容器与伸缩项目
通过display属性,显式地给一个元素设置flex或者inline-flex。这个容器就是一个伸缩容器。注意设置为块级和行内元素。若一个元素指定为inline-flex且元素是一个浮动或者绝对定位元素,则display的计算值为flex。
一个伸缩容器内的每个子元素(盒修复元素?)都会成为一个伸缩项目。且用户代理会将任何直接在伸缩容器里的连续文字包起来成为匿名伸缩项目。
属性详解与使用
在查资料的的时候发现一张图很好的展示了flex的各个属性:
图片来源《一劳永逸的搞定 flex 布局》
容器的属性
有六个属性可以作用到容器上
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
flex-direction属性
决定主轴的方向(即项目的排列方向)。
1 |
flex-direction: row | row-reverse | column | column-reverse row(默认值):主轴为水平方向,起点在左端。 |
flex-wrap属性
决定怎么换行,是否换行
1 |
flex-wrap: nowrap | wrap | wrap-reverse; nowrap(默认):不换行。 |
flex-flow
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
1 |
flex-flow: <flex-direction> || <flex-wrap>; |
justify-content属性
justify-content属性定义了项目在主轴上的对齐方式。
1 |
justify-content: flex-start | flex-end | center | space-between | space-around; flex-start(默认值):左对齐 |
align-items属性
align-items属性定义项目在交叉轴上如何对齐。
1 |
align-items: flex-start | flex-end | center | baseline | stretch; flex-start:交叉轴的起点对齐。 |
align-content属性
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
1 |
align-content: flex-start | flex-end | center | space-between | space-around | stretch; flex-start:与交叉轴的起点对齐。 大专栏 css进阶之二:flex弹性布局 |
项目的属性
有6个属性,可以设置在项目上。
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
order属性
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
1 |
order: <integer>; |
flex-grow属性
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
1 |
flex-grow: <number>; /* default 0 */ |
如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
flex-shrink属性
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
1 |
flex-shrink: <number>; /* default 1 */ |
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效。
flex-basis属性
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
1 |
flex-basis: <length> | auto; /* default auto */ |
它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。也就是说这个属性固定了项目在主轴方向上的控制范围,用这个值去计算怎么算剩余空间,但是呢,假如设置固定值了,即使有空余空间的分配,也和该项目没关系了?
flex属性
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
1 |
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] |
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
第一种写法是项目在主轴方向平分容器,第二种写法是项目的大小不会有变化。
有些资料建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
我们最常见的写看到的写法是flex:1,这样的简写其实也是合法的,后面的两个缺省了,就按照默认的值写写法就相当于flex:auto
align-self属性
align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
1 |
align-self: auto | flex-start | flex-end | center | baseline | stretch; |
该属性可能取6个值,除了auto,其他都与align-items属性完全一致。
浏览器兼容性
经过查询结果如下:
兼容性并不好,且Flexbox有新旧版以及混合写法,可以说假如需要兼容旧版本的话可以说非常可怕了。
新版旧版可以用以下方法简单区分:
- display:box,或者box-{*}就是2009年版本
- display:flexbox,或者flex()函数,是2011年版本,也成为混合版本
- display:flex,或者flex-{*}属性,是当前的w3c标准规范的flexbox
flex语法规范的多样性造成在不同的语法版本下的使用方式不同,加上不同的浏览器支持度的不同,在移动端的使用更多,兼容性更好,有兼容需求的同学一定要考虑清楚。
总结与最佳实践
在网页布局进入css时代之前,复杂的排版都是通过table实现的,在单元格里可以方便的使用水平和垂直对齐,table其实对开发者并没有那么友好。这些写法随着web语义化流行,逐渐没落,css的日渐强大。根据css提供常见的布局方式:文档流,浮动布局,定位布局,我们可以完美解决大多的常见的需求。
新的的特性,都是为了解决某些痛点的,flex的出现也不例外。一直以来,如何优雅的实现水平、垂直同时居中是一件头疼的事情。水平垂直居中我们可以通过margin:auto实现,可以使用maigin自身距离一半实现,也可以使用transform偏移x,y轴的方式来实现。这些写法当然都可以,但是缺少语义,可维护性极差,且使用时感觉很笨重。
flex布局通过方向轴和容器的概念很优雅的实现了水平垂直居中。通过控制容器元素的主轴对其方式和交叉轴对齐就可以完美实现,对多个伸缩项目的容器的情况,也可以控制各个项目的排序,比例,位置等情况。可以说事非常推荐了。
上一段时间写过一个基于twitter的UI,微博的内容的demo(twibo-vue)),里面大量使用了flex布局,欢迎start,fork。
css进阶之二:flex弹性布局的更多相关文章
- 记一下flex弹性布局
flex弹性布局也越来越广泛的在我们代码中出现了,更加方便我们的布局.自己用了查,查了用,有些还是记不住,俗话说好脑子不如烂笔头,原来都是写在本子上的,很不幸的一次次的想翻的时候总是找不到,还是写博客 ...
- CSS3动画属性和flex弹性布局各个属性
[CSS3动画的使用] 1.声明一个关键帧(动画): @keynames name{ from{} to{} } 每个阶段的写法: ①可以直接使用from-to的写法 ②可以设置0%-100%的写法, ...
- flex弹性布局心得
概述 最近做项目用flex重构了一下网页中的布局,顺便学习了一下flex弹性布局,感觉超级强大,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: Solved by Flexbo ...
- java基础之Flex弹性布局、JSP错误处理以及Log4J
一.Flex弹性布局 1.产生的比较晚,目前在移动网页开发中可以使用,而且逐渐成为主流. 在桌面网页开发中使用的比较少(主要是桌面浏览器的兼容性问题更加严重) 2.开启方法: 在容器标签上加上 dis ...
- flex弹性布局属性详解!
详细看下flex弹性布局具体属性: flex容器属性详解:flex-direction:row/column:(横排/竖排) 决定元素的排列方向:flex-wrap:nowrap/wrap/wrap- ...
- flex弹性布局,好用
一直不太喜欢自己布局前端页面,都是扒别人的页面 ,最近在练习小程序,页面无处可扒,只有自己布局 发现flex弹性布局真好用,布局起来很简单,实现的效果也很好,赞 以后可以自己写一点前端了,哈哈
- flex弹性布局的基本介绍
最近开始做元素排列比较复杂的项目,同时需要各种型号手机的适配,我发现以前所掌握的盒子模型.display.position.float等已经不能满足我的需求了, 于是开始着重学习flex弹性布局并运用 ...
- css flex弹性布局学习总结
一.简要介绍 flex( flexible box:弹性布局盒模型),是2009年w3c提出的一种可以简洁.快速弹性布局的属性. 主要思想是给予容器控制内部元素高度和宽度的能力.目前已得到以下浏览器支 ...
- CSS的Flex弹性布局概念
1.Flex概念: Flex是Flexible Box的缩写,顾名思义为“弹性布局”,用来为盒装模型提供最大的灵活性. 任何一个容器都可以指定为Flex 布局. 设为flex布局以后,子元素的floa ...
随机推荐
- memset为int型数组初始化问题
头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int ...
- 数字格式化NumberFormat
做财务的同学遇到逗号分隔的数值格式,会用到NumberFormat类格式化数据 BigDecimal bigDecimal = new BigDecimal("1000000000.4110 ...
- 从 0 到 1 到完美,写一个 js 库、node 库、前端组件库
之前讲了很多关于项目工程化.前端架构.前端构建等方面的技术,这次说说怎么写一个完美的第三方库. 1. 选择合适的规范来写代码 js 模块化的发展大致有这样一个过程 iife => commonj ...
- imx6q-plus-Android6.0下uboot添加网卡驱动
1.文件:iTOP-iMX6_android6.0.1/bootable/bootloader/uboot-imx/include/configs/mx6sabre_common.h修改如下:#def ...
- 正则表达式awk学习(三)
awk:格式化文本输出 gawk - pattern scanning and processing language awk:gawk的符号链接 基本用法:gawk [options] 'progr ...
- sql 新增随机数
update RemoteDetection set humidity=round((rand()*3+29),0),TEMPERATURE=round((rand()*3+16),0),atmosp ...
- nutzboot 项目打包排除或指定配置文件(夹)
springboot 是一样的 我这里就是从springboot哪里拿过来的 (nutzboot2.x已测试可以使用) 排除指定文件 在pom 文件 build 标签内添加 resources < ...
- ssh 怎样以root用户登录
#sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行:PermitRootLogin prohibit-password 新建一行 添加:PermitRootLogin ...
- xpath-helper 插件下载
链接:https://pan.baidu.com/s/1YuTGrdwwAKQd2sIcuarBHQ 提取码:qb8p
- python往mysql数据库中写入数据和更新插入数据
本文链接:https://blog.csdn.net/Mr__lqy/article/details/85719603 1. 连接mysql import pymysql db = pymysql.c ...