• 【css技能提升】完美的 Sticky Footer 布局


    在总结之前所做的项目时,遇到过下面这种情况。

    在主体内容不足够多或者未完全加载出来之前,就会导致出现左边的这种情况,原因是因为没有足够的垂直空间使得页脚推到浏览器窗口最底部。但是,我们期望的效果是页脚应该一直处于页面最底部(如右边):

    因此我们可以使用 Sticky Footer 布局 来完美实现我们所需要的页面布局。

    首先先说一下什么是 “Sticky Footer”

    所谓 “Sticky Footer”,并不是什么新的前端概念和技术,它指的就是一种网页效果:
    如果页面内容不足够长时,页脚固定在浏览器窗口的底部;如果内容足够长时,页脚固定在页面的最底部。
    总而言之,就是页脚一直处于最底,效果大致如图所示:

    当然,实现这种效果的方法有很多种,其中有通过脚本计算的,有通过 CSS 处理的,脚本计算的方案我们不在本文探讨。
    下面我们看看有哪些通过 CSS 可以实现且适用于移动端开发的方案,并分析其中的利弊。

    如何实现

    假设我们页面的 HTML 结构是这样:

    <div class="wrapper">
        <div class="content"><!-- 页面主体内容区域 --></div>
        <div class="footer"><!-- 需要做到 Sticky Footer 效果的页脚 --></div>
    </div>

    实现方案一:absolute

    通过绝对定位处理应该是常见的方案,只要使得页脚一直定位在主容器预留占位位置。

    html, body {
        height: 100%;
    }
    .wrapper {
        position: relative;
        min-height: 100%;
        padding-bottom: 50px;
    }
    .footer {
        position: absolute;
        bottom: 0;
        height: 50px;
    }

    这个方案需指定 html、body 100% 的高度,且 content 的 padding-bottom 需要与 footer 的 height 一致。

    实现方案二:calc 

    通过计算函数 calc 计算(视窗高度 - 页脚高度)赋予内容区最小高度,不需要任何额外样式处理,代码量最少、最简单。

    .content {
        min-height: calc(100vh - 50px);
    }
    .footer {
        height: 50px;
    }

    如果不需考虑 calc() 以及 vh 单位的兼容情况,这是个很理想的实现方案。
    同样的问题是 footer 的高度值需要与 content 其中的计算值一致。

    实现方案三:table

    通过 table 属性使得页面以表格的形态呈现。

    html, body {
        height: 100%;
    }
    .wrapper {
        display: table;
        width: 100%;
        min-height: 100%;
    }
    .content {
        display: table-row;
        height: 100%;
    }

    我们需要注意的是,使用 table 方案存在一个比较常见的样式限制,通常 margin、padding、border 等属性会不符合预期。
    因此不建议使用这个方案。当然,问题也是可以解决的:别把其他样式写在 table 上。

    实现方案四:Flex

    Flex 是非常适合实现这种效果的,使用 Flex 实现不仅不需要任何额外的元素,而且允许页脚的高度是可变的。

    虽然大多数 Flex 布局常用于水平方向布局,但别忘了实际上它也可用于垂直布局,所以你需要做的是将垂直部分包装在一个 Flex 容器中,并选择要扩展的部分,他们将自动占用其容器中的所有可用空间。

    html {
        height: 100%;
    }
    body {
        min-height: 100%;
        display: flex;
        flex-direction: column;
    }
    .content {
        flex: 1;
    }

    需要注意的是想要兼容各种系统设备,需要兼顾 flex 的兼容写法。

    以上4中方案每个实现的方法其实大同小异,同时也都有自己的利弊。所示可以按照实际情况来使用。

     

  • 相关阅读:
    Dubbo与Zookeeper、SpringMVC整合和利用(负载均衡、容错)
    英语每日阅读---2、越来越多人反对人工智能参战
    新东方雅思词汇---6.3、brilli
    智课雅思词汇---二十五、形容词后缀-ate-fic-ose-ulent-olent-ous-ulous-y
    英语每日写作---1、但是,人们在吹口哨时做得更好
    英语每日阅读---1、科学美国人60秒:如果觉得唱歌很难 那就吹口哨吧
    线段覆盖长度
    智课雅思词汇---二十四、形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory
    智课雅思词汇---二十三、动词性后缀-ate-fy-ish-ize
    iscroll.js的简单使用方法(总结)
  • 原文地址:https://www.cnblogs.com/zhouyangla/p/6719233.html
Copyright © 2020-2023  润新知