Page 224 - css揭秘
P. 224

更灵活的解决方案

                        Flexbox 对于此类问题同样是完美的选择。只需寥寥几行 CSS 代码就可
                    以完美达成十分灵活的布局效果,而且完全不需要复杂的计算或是添加多余
                    的 HTML 元素等。首先,我们需要对 <body> 元素设置 display:  flex,因
                    为它是这三个主要区块的父元素,当父元素获得这个属性之后,就可以对其
                    子元素触发“伸缩盒布局模型”。我们还需要把 flex-flow 设置为 column,
                    否则子元素会被水平排放在一行上(参见图 7-26):

                        body {
                            display: flex;
                            flex-flow: column;
                        }

                        此时,页面看起来与没有启用 Flexbox 的情况似乎是一样的,因为所有
                    元素都占据了整个视口的宽度,而它们的高度也都是由其自身的内容来决定
                    的。也就是说,我们还没有真正发挥 Flexbox 的威力。                                        图 7-26
                                                                                         只应用 flex 而没有应用其他属
                        为了完全释放它的魔力,我们首先要把 <body> 的 min-height 属性指                        性时,会让所有子元素水平排列
                    定为 100vh,这样它就至少会占据整个视口的高度。不过,现在整个页面的
                    布局仍然跟图 7-24 无异,原因在于,虽然我们已经为整个 body 元素指定了
                    最小高度,但各个子元素的高度仍然是以各自的内容为准的(按照 CSS 规
                    范的说法,它们的高度仍然由内部因素来决定)。
                        此时我们所期望的是,页头和页脚的高度由其内部因素来决定,而内容                                   小提示
                    区块的高度应该可以自动伸展并占满所有的可用空间。我们只要给 <main>                                     这个 flex 属性实际上 是
                    这个容器的 flex 属性指定一个大于 0 的值(比如 1 即可),就可以实现这个                             flex-grow、flex-shrink 和
                    效果了:                                                                 flex-basis 的简写语法。任何
                                                                                         元素只要设置了一个大于 0 的
                                                                                         flex 值,就将获得可伸缩的特
                        body {
                            display: flex;                                               性;flex 的值负责控制多个可伸
                            flex-flow: column;                                           缩元素之间的尺寸分配比例。举
                            min-height: 100vh;                                           例来说,在我们眼前的这个例子
                        }                                                                中,如果 <main> 是 flex: 2 而

                        main { flex: 1; }                                                <footer> 是 flex:  1,那么内容
                                                                                         区块的高度将是页脚高度的两倍。
                                                                                         如果把它们的值从 2 和 1 改为 4
                        这样就可以了!我们只需要四行简单的代码,就完美实现了紧贴底部的
                                                                                         和 2,结果也是一样的,因为真
                    页脚(与图 7-25 中的效果一致)。Flexbox 是不是相当霸气?                                  正起作用的是它们的数值比例。

                     试一试 play.csssecrets.io/sticky-footer


                          向 Philip Walton(http://philipwalton.com)脱帽致敬,感谢他提出这
                      个技巧(http://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer)。



                                                                                            致 敬



                                                                                         41 紧贴底部的页脚           193







          ඀ࠡ  JOEC
   219   220   221   222   223   224   225   226   227   228   229