伸缩布局进一步学习

一:前言

  之前学过一篇css3中的自适应布局,但是往div中写内容的时候布局又会重新分配。后来在网上查找,才知道那个是一个草案,没有什么实用性。

现在最新版本的有更大变化,尽管css3在2014年10月28号已经发布,这个应该也是定下来了吧,现在是学习阶段,等到实际应用的时候,小女子必定给大家一个准确的回复。

好了,不罗嗦了~~进入正文

二:Flexbox 规范时间表

  Flexbox 规范的相关工作已经进展了3年。不同的浏览器也实现了不同的实验版本。在2012年9月,Flexbox 语法的第三个主要修订版本进入到候选推荐阶段。这意味着 W3C 认为当前的语法是稳定的,并鼓励浏览器开发商去实现它。

Flexbox 规范时间表:

  • 2009年7月 工作草案 (display: box;)
  • 2011年3月 工作草案 (display: flexbox;)
  • 2011年11月 工作草案 (display: flexbox;)
  • 2012年3月 工作草案 (display: flexbox;)
  • 2012年6月 工作草案 (display: flex;)
  • 2012年9月 候选推荐 (display: flex;)

三:术语说明

flex container(伸缩容器):定义display:flex | inline-flex的元素。

flex items(伸缩元素):伸缩容器的子元素,根据伸缩模式布局。

main axis(主轴):根据伸缩容器定义的伸缩元素的布局方向(flex-direction下边说明)说明,row对应水平方向是主轴,column对应的是垂直方向是主轴。

cross axis(侧轴):跟主轴相反的那条线。例如:主轴是水平,则侧轴是垂直等。

main-start(主轴开始位置):还是举例说明更好一点。例如:此时flex-direction:row;则水平方向是main axis,起始位置就是左边;而flex-direction:row-reverse;的时候

    尽管水平方向还是main axis,但是此时的main-start是对应的水平右边;同理flex-direction:column;跟flex-direction:column-reverse;

main-end(主轴结束位置):顾名思义,就是主轴main-start的另一端。(所以不是用left,right而是start和end,还是很好的,因为反向的时候left,right描述是不准确的)

cross-start  同理main-start

cross-end  同理main-end

main size property(主轴尺寸属性):主轴是水平的时候,对应的就是width属性。同样,当定义flex-basis的时候,此时对应的表现也是width的表现;反过来,当垂直是主轴

    的时候,height属性值就是主轴尺寸,同样此时的flex-basis的值就是height的表现;

cross size property(侧轴尺寸属性):跟main size property相反

四:相关属性语法

这一段我是复制一国外网站的部分内容,不想翻译了,有点英语基础的应该都能够看懂,(话说,英语真的是硬伤,得好好补补),感觉写的很好,也简单干净。

Flex Container
display   flex | inline-flex  

Set display property to activate flexbox layout. Difference between flex and inline-flex is like between block and inline-block.
flex-direction   row | row-reverse | column | column-reverse default: row

Defines how flex items belonging to a common flex container are placed by setting the main axis.
flex-wrap   nowrap | wrap | wrap-reverse default: nowrap

Defines how flex items are wrapped into lines.
flex-flow   <‘flex-direction‘> || <‘flex-wrap‘> default: see individual properties

A shorthand property to define <code>flex-direction</code> and <code>flex-wrap</code>.
justify-content   flex-start | flex-end | center | space-between | space-around default: flex-start

Defines how flex items are laid out along the main axis on the current line.
align-items   flex-start | flex-end | center | baseline | stretch default: stretch

Defines how flex items are aligned along the cross axis.
align-content   flex-start | flex-end | center | space-between | space-around | stretch default: stretch

Defines how a flex container‘s lines are aligned along the cross axis (only for multi-line containers).
Flex Item
flex-grow   <number> default: ‘0’

Defines how much the flex item‘s size will increase in proportion to the other items in the flex container when free space is distributed.
flex-shrink   <number> default: ‘1’

Defines how much the flex item‘s size will decrease in proportion to the other items in the flex container.
flex-basis   <‘width‘> default: auto

Determines the initial main size of a flex item.
flex   none | [ <‘flex-grow‘> <‘flex-shrink‘>? || <‘flex-basis‘> ] default: see individual properties

A shorthand property for flex-grow, flex-shrink, and flex-basis that reflects the ability of a flex item to either stretch of shrink when needed.
order   <number> default: 0

Defines the order in which flex items appear in a flex layout.
align-self   auto | flex-start | flex-end | center | baseline | stretch default: auto

Defines how an individual item is aligned on the cross axis, and overrides the default established by align-items.

五:各个属性值不同表现(回头真得学学张鑫旭或者w3c的网站是怎么弄的,这样贴图片的感觉太不好了,先凑活好了)

第一部分:伸缩容器中定义的属性

flex-direction:row | row-reverse | column | column-reverse(图片从左到右)

       

flex-wrap:nowrap | wrap | wrap-reverse (从左到右,这个是在多行的时候,wrap是说明一行放不下的时候是否换行,reverse是cross axis的反转)

     

justify-content:flex-start | flex-end | center | space-between | space-around(从左至右,space理解为剩余空间,后两个是剩余空间的处理,看是平均分配在伸缩元素间还是两边也有)

            

此属性多行的时候:flex-start | flex-end | center | space-between | space-around(从左至右)

            

所以,此时就不难理解上边对这条属性的解释:Defines how flex items are laid out along the main axis on the current line.(定义伸缩元素在当前行上是怎样沿着主轴布局的)。

align-items:flex-start | flex-end | center | baseline | stretch(从上至下,align是对齐的意思,看伸缩元素侧轴防线是怎样变化实现对齐的)

(这个是放大后截取的部分图片,主要是为了跟baseline做对比)

(这个是放大后截取的部分图片,第二个div的line-height比别的div小,注意其与第一个的不同)

(这个是有flex-item没有定义height(即cross axis size)的时候有用,否则会按照cross axis size显示)

这个属性多行的时候的显示样纸:flex-start | flex-end | center | baseline | stretch(从左至右)

            

align-content:flex-start | flex-end | center | space-between | space-around | stretch(从左至右,定义侧轴上的空着是怎样分配的)

               

第二部分:各个伸缩元素定义的属性

flex-grow  (1,2,3,4对应的值依次是1,3,1,1。该属性就是剩余空间怎样自适应地分配给各个伸缩元素。该实例是将容器宽度减去固定使用的空间【无论是某个子元素使用的固定宽度,当然,此例中没有固定宽度的子元素,还是margin值。】将剩余空间分成 6 份,1,3,4分别是1份,2是3份),此时虽然子元素设置了宽度,但是没有作用。

flex-grow控制flex container有多余空间的时候怎么分配,默认值为0,即所有的flex items都不分配。

flex-shrink则控制flex container空间不足以包含flex items时,flex items怎样缩小所占空间,来防止溢出container。其默认值为1,flex items们根据自身的flex-basis值做相应调整。

html:

<div class="container">
    <div class="item">1</div>
    <div class="item special">2</div>
    <div class="item">3</div>
    <div class="item">4</div>

    <div class="item">5</div>
    <div class="item">6</div>
    <div class="item">7</div>
    <div class="item">8</div>

    <div class="item">9</div>
    <div class="item">0</div>
</div>

css:

*{margin:0;padding:0;}
.container{
    width:150px;
    height:150px;
    background:#999;

    display:inline-flex;
    flex-flow:row nowrap;
    justify-content:flex-start;
    align-items:flex-start;
    align-content:flex-start;
}
.item{
    width:15px;
    height:15px;
    margin:3px;
    background:yellow;
    font:12px/15px "微软雅黑";
    text-align:center;
    color:#333;
    flex-shrink:1;
}
.special{
    line-height:12px;
    flex-shrink:2;
}

(这个是实际放大后截取的部分显示,2是special)

flex container的宽度是150px,而各个伸缩元素宽度是15px,且左右外边距各自为3,加起来也就是15*10+(3+3)*10 = 210px;超过部分flext-wrap设置的是nowrap;这个时候该按照什么样的比例来压缩各个伸缩元素呢?别慌,有flex-shrink呢不是。我们先计算出要腾出的空间是210-150=60px;

前提是我们要先了解上边的一个术语,main size property,此时应该是width,(如果有flex-basis的话,应该是flex-basis,但是此时没有)

游戏规则是:计算每个flex item的main size property值乘以flex-shrink值求积,如此后,再将各个flex item的乘积相加求和。然后求出各自的占比,最后再乘以所有伸缩元素要腾出的空间值,就是各个子元素要腾出的空间。

本例说明:

  要腾出空间是:60px;

  2要腾出的空间是:(  15*2 / (15*1*9+15*2)  ) *60   ≈  10.9

  2以外的伸缩元素要腾出的空间是:(  15 / (15*1*9+15*2)  ) *60   ≈  5.4545

  2最后的显示宽度为:15 - 10.9  = 4px;

  2以外的伸缩元素最后的显示宽度为:15 - 5.4545 = 9px;(有4个是10,至于哪些是,浏览器不同也不一样);

  所以我们看到,最后2的宽度是最小的。所以,flex-shrink跟flex-grow不同的是,值越大,最后尺寸反而是最小的。

flex-basis就像上边说明的一样Determines the initial main size of a flex item(决定了伸缩元素的初始化main size),就像我们刚刚了解过的一样,或者术语中也有介绍,该值不存在的时候,使用的就是width或者height的值(主轴是水平是width,主轴是垂直是height),但是有该值的时候使用的是该值;例如,下边例子中2的flex-basis:30px;但是width:15px;

flex是flex-grow  flex-shrink  flex-basis的缩写

但是除此之外,flex也有几个特殊值默认值

  initial,相当于flex-grow:0;   flex-shrink:1;   flex-basis:auto;()

  none,相当于flex-grow:0;   flex-shirink:0;(即一行放不下的时候不按比例压缩); flex-basis:auto;

  auto,相当于flex-grow:1; flex-shrink:1;   flex-basis:auto;

  flex:none;

     

  flex:auto;

     

  2以外的伸缩元素:flex:1 1 auto;   2:flex:3 2 auto;

     

order(实例中1,3,4的order都是1;2的order是2,值越大越往后)

align-self

align-self跟align-items实际上是一样的,只是align-items是定义在flex container中的,应用在所有的伸缩元素上,但是align-self是针对单个的伸缩元素设置的。

参考网址:http://dundalek.com/css3-flexbox-reference/

      http://www.w3.org/TR/css3-flexbox/#placement

     http://www.w3cschool.cc/cssref/css3-pr-flex.html

     http://www.111cn.net/cssdiv/css/64122.htm

     http://www.w3cplus.com/blog/666.html   (w3cplus上还是有很多博主翻译过来的这方面的文章的,大家可以参考一下)

时间: 2024-10-20 06:30:23

伸缩布局进一步学习的相关文章

CSS3伸缩布局Flex学习笔记

如果需要使用伸缩布局首先得把display:flex;对于兼容还得加前缀display:-webkit-display:flex;等其他浏览器前缀,但我本机Chrome测试已经不需要加前缀了,其实这些还好,关键移动端竟然不支持这个属性,移动端支持的还是老版本的display:-webki-box;不过对于学习来说,也不管它支持不支持了,学了再说吧,更何况Chrome已经把flex的前缀去了,说明flex多少还是有些稳定的. 下面列出了关于CSS与flex一起使用的一些属性 display 显示方

css学习_css3伸缩布局 flex布局

1.flex布局 案例一: 案例二:   保证不至于缩放得太小或太大 案例三:flex的值不一定要写成几份,可以写成固定值 案例四: 竖着3等分(父容器按照高度3等分) !!案例  -----用flex布局写携程网(发现携程网是伸缩布局:根据屏幕自适应) flex:  2  意义是啥 (剩余宽度里占比2等份) flex布局:1.父元素要定义为display:flex   , 2.直接子元素布局为flex: n 3.flex:n 的意思:先用父元素的宽度减去没有设置属性flex的子元素的宽度,把所

第 29 章 CSS3 弹性伸缩布局[下]

学习要点: 1.新版本 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 提供的用来实现未来响应式弹性伸缩布局方案,这里做一个初步的了解. 一.新版本 新版本的 Flexbox 模型是 2012 年 9 月提出的工作草案,这个草案是由 W3C 推出的最新语法.这个版本立志于指定标准,让新式的浏览器全面兼容,在未来浏览器的更新换代中实现了统一. 首先,设置伸缩盒的 display 有如下两个属性值: 属性值 说明 flex 将容器盒模型作为块级弹性伸缩盒显示(新版本) inline-fle

第 29 章 CSS3 弹性伸缩布局[上]

学习要点: 1.布局简介 2.旧版本 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 提供的用来实现未来响应式弹性伸缩布局方案,这里做一个初步的了解. 一.布局简介 CSS3 提供一种崭新的布局方式:Flexbox 布局,即弹性伸缩布局模型(Flexible Box).用来提供一个更加有效的方式实现响应式布局.但是用于这个布局方式还处于 W3C 的草案阶段,并且它还分为旧版本.新版本以及混合过渡版本三种不同的编码方式.在发展中,可能还有各种改动,浏览器的兼容性还存在问题.所以,本节课作

第 29 章 CSS3 弹性伸缩布局[中]

学习要点: 1.混合过度版 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 提供的用来实现未来响应式弹性伸缩布局方案,这里做一个初步的了解. 一.混合过渡版 混合版本的 Flexbox 模型是 2011 年提出的工作草案,主要是针对 IE10 浏览器实现的伸缩布局效果,其功能和旧版本的属性大同小异.我们还是采用上一节课的文件,然后使用混合过渡代码,实现 IE10 的伸缩布局. 首先,设置伸缩盒的 display 有如下两个属性值: 属性值 说明 flexbox 将容器盒模型作为块级弹性

多列布局----伸缩布局-----

多列布局: 设置列数:column-count:4 || 2....... 添加列间隙样式,与边框样式border添加一样   column-rule:dashed 3px red 设置列间隙大小   column-gap :50px 设置列宽:原则:取大有限  如果人为设置自宽度更大,则取更大的值,但是会填充整个屏幕,以为最终的宽度可能也会大于设置的宽度  :::  如果人为设置的宽度更小,使用默认计算的宽度   column-width:200px 设置跨列显示  column-span:a

css3伸缩布局中justify-content详解

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSS3伸缩布局</title> <style> body { margin: 0; padding: 0; font-family: '微软雅黑'; background-color: #F7F7F7; } ul { margin: 0; pa

CSS3弹性伸缩布局(上)——box布局

布局简介 CSS3提供了一种崭新的布局方式:Flexbox布局,即弹性伸缩布局模型(Flexible Box)用来提供一个更加有效的方式实现响应式布局. 由于这种布局还处于W3C的草案阶段,并且它分为旧版本.新版本.混合过渡版本三种不同的编码方式.浏览器的兼容性存在一定的问题 首先,我们来看看旧版本的浏览器兼容情况 PS:这是网上的图,浏览器兼容信息可以通过该网站查询:http://www.caniuse.com 开始之前,我们先创建一段内容,分为三个区域 //HTML代码部分 <div> &

DIV+CSS布局重新学习之css控制ul li实现2级菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-