flex-shrink算法学习

flex-shrink是flex体系中比较难理解的一个属性,今天来看一下。

文档

http://www.css88.com/book/css/properties/flex/flex-shrink.htm

flex-shrink只在元素需要瘦身的前提下才生效,否则等于白写。

题1,常规算法

求a、b、c、d四元素的宽度。


解:

b和d元素没有声明flex-shrink,所以默认为flex-shrink: 1

目前子元素总宽度是1000px,父容器是800px,有200px需要消化掉。

表面上,从flex-shrink的值来看,a占1份,b占1份,c占2份,d占1份,一共5份。

这里说一种错误理解:如果你以为,一份是200px/5=40px,所以各个元素减肥掉1份40px,或者减肥掉2份40px就可以了,那就错了。

应该怎么算?怎么理解flex-shrink的值?

首先明确flex-shrink的值的含义,最通俗的解释是,flex-shrink就是减肥的强度,而不是斤数。也就是说,别的元素一天要跑1小时,C元素要跑2个小时,别的元素一天要做100个俯卧撑,C元素要做200个俯卧撑。但绝对不是说,别的元素要减40斤,C必须减80斤。道理很简单,减肥也要考虑原本的体重,对不对?有的元素是成年人,减40斤不是问题,而C只是一个小孩子,如果让C减80斤,很可能减成了负值了。

所以记住一句话,flex-shrink就是减肥的强度,而不是斤数。

正确算法应该是:

求减肥总权重:50 * 1 + 300 * 1 + 50 * 2 + 600 * 1 = 1050,因为C要贡献2份强度,所以乘以2。

A应该瘦身:200 * (50 / 1050) = 9.523px,瘦身之后是50 - 9.523 = 40.476px

B应该瘦身:200 * (300 / 1050) = 57.143px,瘦身之后是300 - 57.143 = 242.857px

C应该瘦身:200 * (50 * 2 / 1050) = 19.048px,瘦身之后是50 - 19.048 = 30.952px

D应该瘦身:200 * (600 / 1050) = 114.285px,瘦身之后是600 - 114.285 = 485.714px

题2,当某元素width为百分比值

如果某个元素的宽度为百分比,会是怎样?


怎么算?其实很简单,先把宽度百分比乘以父元素宽度,算出px值,之后的计算跟题1一致。为了验证,我还是计算一遍吧。

解:

A元素的width是400px。

然后我们计算需要减肥多少:

400 + 300 + 50 + 100 - 800 = 50px

减肥总权重为:

400 * 1 + 300 * 1 + 50 * 2 + 100 * 1 = 900

A应该瘦身:50 * (400 / 900) = 22.22px,瘦身之后是400 - 22.22 = 377.77px

B应该瘦身:50 * (300 / 900) = 16.66px,瘦身之后是300 - 16.66 = 283.33px

C应该瘦身:50 * (50 * 2 / 900) = 5.55px,瘦身之后是50 - 5.55 = 44.44px

D应该瘦身:50 * (100 / 900) = 5.55px,瘦身之后是100 - 5.55 = 94.44px

题3,当某元素flex-shrink为0

某元素flex-shrink为0意味着它不参与减肥,所以整个减肥算法都要排除掉该元素,也就是说把该元素视为不变形的刚体就行了。

验算从略,你可以试试给题2的b元素添加flex-shrink: 0

题4,当flex-shrink值为小数

flex-shrink值为小数跟为整数是一样的道理,算法完全一样。

给题2的b元素设上flex-shrink: 0.5测试一下,只计算b元素。

解:

需要减肥的量还是50px。

总权重是:400 * 1 + 300 * 0.5 + 50 * 2 + 100 * 1 = 750

b需要减肥50 * (300 * 0.5 / 750) = 10px,减肥之后是300 - 10 = 290px。

实测一下,正确。

题5,全部元素不设flex-shrink

全部不设flex-shrink,则视为全部元素的flex-shrink为1,这样的话,计算方式最简单,全部元素都等比压缩。

你可能感兴趣的:(flex-shrink算法学习)