码迷,mamicode.com
首页 > 其他好文 > 详细

伸缩布局进一步学习

时间:2014-11-20 20:07:49      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   ar   color   os   使用   

一:前言

  之前学过一篇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(图片从左到右)

bubuko.com,布布扣   bubuko.com,布布扣  bubuko.com,布布扣  bubuko.com,布布扣

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

bubuko.com,布布扣   bubuko.com,布布扣  bubuko.com,布布扣

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

bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣

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

bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣

所以,此时就不难理解上边对这条属性的解释: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是对齐的意思,看伸缩元素侧轴防线是怎样变化实现对齐的)

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

bubuko.com,布布扣

bubuko.com,布布扣

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

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

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

bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣

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

bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣

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

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

bubuko.com,布布扣

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; }

bubuko.com,布布扣(这个是实际放大后截取的部分显示,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;

bubuko.com,布布扣

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;

  bubuko.com,布布扣   bubuko.com,布布扣

  flex:auto;

  bubuko.com,布布扣   bubuko.com,布布扣 

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

  bubuko.com,布布扣   bubuko.com,布布扣

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

bubuko.com,布布扣 

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上还是有很多博主翻译过来的这方面的文章的,大家可以参考一下)

伸缩布局进一步学习

标签:des   style   blog   http   io   ar   color   os   使用   

原文地址:http://www.cnblogs.com/bjchenxn/p/4111261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!