详解Sticky Footer 绝对底部的两种套路

下面是详解Sticky Footer 绝对底部的两种套路的完整攻略。

下面是详解Sticky Footer 绝对底部的两种套路的完整攻略。

一、Sticky Footer的概念

在网页设计中,Sticky Footer指的是网页底部一直贴在视口底部,并且在网页内容过短时也不会出现在视口中的一种解决方案。此外,Sticky Footer还需要保证在网页内容过长时,能够让滚动条正常滚动,即不会被遮挡。

二、套路一:用flex实现

这种套路的主要思路是:

  • 用flex将网页中的容器撑满整个视口;
  • 将网页中的主要内容放在一个flex-grow的容器中,并撑满整个视口;
  • 将网页底部的内容放在一个高度为0的容器中,最后通过margin-top将其推到视口底部。

实现代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Sticky Footer Flex实现</title>
    <style type="text/css">
        body {
            height: 100%;
            display: flex;
            flex-direction: column;
        }
        .main {
            flex-grow: 1;
            background-color: #ccc;
        }
        .footer {
            height: 0;
            margin-top: auto;
            background-color: #333;
            color: #fff;
            text-align: center;
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="main">
        <!-- 网页中的主要内容 -->
    </div>
    <div class="footer">
        <!-- 网页底部的内容 -->
    </div>
</body>
</html>

该代码中,使用了display: flex来将网页全部撑满整个视口;使用了flex-grow: 1来将主要内容的容器撑满整个视口;使用了margin-top: auto来将尾部内容推到视口底部。

三、套路二:用grid实现

这种套路的主要思路是:

  • 用grid将网页分为两行:第一行放置主要内容,第二行放置网页底部;
  • 将第二行的高度设置为0,并使用 grid-row: 2来定位到视口底部。

实现代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Sticky Footer Grid实现</title>
    <style type="text/css">
        body {
            height: 100%;
            display: grid;
            grid-template-rows: auto 0;
            grid-template-areas:
                "main"
                "footer";
        }
        .main {
            grid-area: main;
            background-color: #ccc;
            height: 100%;
        }
        .footer {
            grid-area: footer;
            background-color: #333;
            color: #fff;
            text-align: center;
            width: 100%;
            height: 0;
            grid-row: 2;
        }
    </style>
</head>
<body>
    <div class="main">
        <!-- 网页中的主要内容 -->
    </div>
    <div class="footer">
        <!-- 网页底部的内容 -->
    </div>
</body>
</html>

该代码中,使用了display: grid和grid-template-rows将网页分为两行;使用grid-area将主要内容和底部容器定位到相应的位置;使用grid-row: 2将底部容器定位到视口底部。

四、示例说明

下面,我将通过两个示例来说明如何使用以上的两种套路:

示例一

网页中的主要内容包括一个固定高度的头部和一个主体区域,主体区域中的内容比较少,底部需要放置一个版权信息区域,版权信息需要保证在视口底部。

该示例可以使用flex套路来实现。具体实现代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Sticky Footer示例一</title>
    <style type="text/css">
        body {
            height: 100%;
            display: flex;
            flex-direction: column;
        }
        .header {
            height: 100px;
            background-color: #ccc;
        }
        .main {
            flex-grow: 1;
            background-color: #ddd;
            display: flex;
            flex-direction: column;
        }
        .footer {
            height: 60px;
            margin-top: auto;
            background-color: #333;
            color: #fff;
            text-align: center;
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="header"></div>
    <div class="main">
        <!-- 主体内容 -->
    </div>
    <div class="footer">版权信息</div>
</body>
</html>

其中,网页被分为了三个部分:头部、主体和底部。主体部分使用了flex实现。

示例二

网页中的主要内容包括一个固定高度的头部和一个较长的主体区域,主体区域中有一个按钮,当按钮被点击时,会在主体区域中动态添加一些内容。底部需要放置一个版权信息区域,版权信息需要保证在视口底部。

该示例可以使用grid套路来实现。具体实现代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Sticky Footer示例二</title>
    <style type="text/css">
        body {
            height: 100%;
            display: grid;
            grid-template-rows: 100px auto 0;
            grid-template-areas:
                "header"
                "main"
                "footer";
        }
        .header {
            grid-area: header;
            background-color: #ccc;
        }
        .main {
            grid-area: main;
            background-color: #ddd;
            position: relative;
        }
        .button {
            position: absolute;
            top: 10px;
            left: 10px;
            padding: 10px;
            background-color: #333;
            color: #fff;
            cursor: pointer;
            z-index: 2;
        }
        .content {
            position: relative;
            z-index: 1;
        }
        .footer {
            grid-area: footer;
            background-color: #333;
            color: #fff;
            text-align: center;
            width: 100%;
            height: 0;
            grid-row: 3;
        }
    </style>
</head>
<body>
    <div class="header"></div>
    <div class="main">
        <div class="button">添加内容</div>
        <div class="content">
            <!-- 主体内容 -->
        </div>
    </div>
    <div class="footer">版权信息</div>
    <script>
        //按钮点击事件,添加内容
        document.querySelector('.button').addEventListener('click', function() {
            let content = document.createElement('div');
            content.innerHTML = '这是新添加的内容';
            document.querySelector('.content').appendChild(content);
        });
    </script>
</body>
</html>

其中,网页被分为了三个部分:头部、主体和底部。主体部分使用了grid实现,并且在其中动态添加了新的内容。

本文标题为:详解Sticky Footer 绝对底部的两种套路

基础教程推荐