好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Flex布局相关用法_html/css_WEB-ITnose

前言:

布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中 就不容易实现。

2009年,W3C提出了一种新的方案----Flex布局,可以简便、完整、响应式地实现各种页面布局,2012年得到进一步完善。

2009年版本的语法已经过时(display: box),使用的时候为了兼容需要加上一些前缀

/* 形如: */    display: -webkit-box; /* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */    display: -moz-box; /* Firefox 17- */    display: -webkit-flex; /* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */    display: -moz-flex; /* Firefox 18+ */    display: -ms-flexbox; /* IE 10 */    display: flex; /* Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */ 

所以还是建议使用新版形式

2012年将是往后标准的语法(display: flex),大部分浏览器已经实现了无前缀版本。

?嗦那么多,正式开始

一、Flex 是什么,为什么要用?

就 W3C 官方给到的解释是,这是设计来实现更复杂的版面布局。

那我自己对他的定义是,Flexbox 从本质上就是一个 Box-model 的延伸,我们都知道 Box-model 定义了一个元素的盒模型,然而 Flexbox 更进一步的去规范了这些盒模型之间彼此的相对关系。而不需要去用一些很 cheat 的做法,去 hack 一些本来其实不应该用来做版面布局的属性。

Flex布局主要思想是让容器有能力让其子项目能够改变其宽度、高度(甚至顺序),以最佳方式填充可用空间(主要是为了适应所有类型的显示设备和屏幕大小)。Flex容器会使子项目(伸缩项目)扩展来填满可用空间,或缩小他们以防止溢出容器。

最重要的是,Flexbox布局方向不可预知,他不像常规的布局(块就是从上到下,内联就从左到右)。而那些常规的适合页面布局,但对于支持大型或者杂的应用程序(特别是当他涉及到取向改变、缩放、拉伸和收缩等)就缺乏灵活性。

围绕着三个主要问题,来了解Flex布局

1. 这能做什么?也就是他能解决什么问题?
2. 能用在哪??在哪些地方能用这个方法?
3. 为什么能用?他实现所用到的逻辑是什么?

当然了,这仨问题也直接贯穿在功能实现当中,所以还是来了解使用的方式。

二、Flex的基本概念

因为Flex布局是相对模块而言,而不是一个属性,它涉及很多东西,包括其整个组属性。他们当中一部分是容器(父元素,称为“伸缩容器”container),另一部分是子元素(称为“伸缩项目” flex item)。

常规布局是基于块和内联流方向,而Flex布局是基于flex-flow流。这张图,解释了flex布局的主要思想。

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。

主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。

项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

三、Flex 的使用方法

跟常规布局操作一样,flex也是基于css属性的设置来实现。

如上图所示,主要包括 设置父容器的属性 和 设置子项目的属性(如果又有内嵌的容器那就同理)

(1)父容器的属性

1.display:flex | inline-flex;(适用于父容器)

这个是用来定义伸缩容器,是内联还是块取决于设置的值。这个时候,他的所有子元素将变成flex文档流,称为伸缩项目。

display: other values | flex | inline-flex;     

如果是Webkit内核的浏览器,必须加上-webkit前缀。比如:

display: -webkit-flex; 

但有两点要注意的是,父容器设置flex之后:

CSS的columns在伸缩容器上没有效果。 float、clear和vertical-align在子项目上没有效果。

2.flex-direction(适用于父容器)

flex-direction属性决定主轴的方向(即项目的排列方向)。

flex-direction: row | row-reverse | column | column-reverse     

row(默认值) :在“ltr”排版方式下从左向右排列;在“rtl”排版方式下从右向左排列。 row-reverse: 与row排列方向相反,在“ltr”排版方式下从右向左排列;在“rtl”排版方式下从左向右排列。 column: 类似 于row,不过是从上到下排列 column-reverse: 类似于row-reverse,不过是从下到上排列。

注:

主轴起点与主轴终点方向分别等同于当前书写模式的始与结方向。其中“ltr”所指文本书写方式是“left-to-right”也就是从左向右书写;而“rtl”所指的刚好与“ltr”方式相反,其书写方式是“right-to-left”,也就是从右向左书写 

那不如来个例子:

现在有一个父容器div,其中有5个子项目div.

为了保证效果展示,父容器暂设width: 40%; min-height: 250px; 子项目分别设置不同宽 width: 10%|15%|20%; 高度暂设固定高度30px(但设置高度会时stretch失效)

基本代码为:(后续例子都是基于这个展开,变动的部分为关键的各 flex属性)

    

item1

查看更多关于Flex布局相关用法_html/css_WEB-ITnose的详细内容...

  阅读:37次