两种常见的sticky footer布局

image.png

1. position: fixed实现

①顶栏和③底栏都设置position:fixed,分别置于页面的顶部和底部,然后②内容的部分设置marin-top和margin-bottom为①顶栏和③底栏的高度,这样②内容部分就可以滚动页面来浏览

<body>
    <header id="header" class="header">
    </header><!-- /header -->
    <main class="content">
    </main>
    <footer class="fotter">
    </footer>
</body>
        body{
            margin: 0;
            padding: 0;
        }
        .header{
            background-color: gray;
            height: 20px;
            position: fixed;
            width: 100%;
            top: 0;
        }
        .content{
            background-color: blue;
            min-height: 100vh;
            margin: 20 0 20px 0;
        }
        .fotter{
            background-color: red;
            height: 20px;
            position: fixed;
            bottom: 0;
            width: 100%;
        }

注意要给定位后的footerheader一个宽度,此时header和footer都是固定宽度。

定位对元素宽度的影响

包含块

首先我们先回顾一下包含块(定位上下文)的基本概念:

1.初始包含块(根元素的包含块)由用户代理确定。
2.浮动元素包含块定义为最近的块级祖先元素。
3.相对定位或静态定位元素包含块由最近的块级框、表单元格、或行内块框祖先元素(任何类型)内容边界构成。
4.绝对定位元素包含块设置为最近的定位不是static的祖先元素(任何类型)的边框界定(对块级父元素)或内容边界界定(对行内父元素)。

宽度与偏移

一般的,元素的大小和位置取决于其包含块。定位就是元素各外边距边界相对于其包含块相应边(内边界与边框相邻边)进行偏移,影响的是元素的所有一切(外边距、边框、内边距、内容)都会移动。故对于一个定位元素有如下等式(后边的计算均基于该式):

left+margin-left+border-left-width+padding-left+width+padding-right+border-right-width+margin-right+right=包含块的width   

据此,在未定义元素的宽度width和高度height时,其值大小都会受到定位影响。对于定位元素来说,是否需要设置其宽度高度应根据情况确定。考虑以下几种情况其宽度高度各是多少的确定规则:

1.如果将偏移属性top,left,bottom,right都进行了确定,而未设置外边距,内边距和边框的时候,是否显式设置宽度高度,其值都是由偏移属性确定的;反之若设置了外边距或内边距(auto也算),边框时,高度宽度就是其显式设置值,未显式设宽高的仍由偏移属性确定。

2.对于非替换元素水平轴行为:

1)如果left,width,right都为auto,且没有设置内外边距,边框,则经过计算元素左边位于其静态位置(从左往右读),width“恰当收放”,根据上述等式right为余下的水平距离;
2)当等式中所有值为固定值时,若元素“过度受限”则right会根据上式重置;
3)当上述等式中只有一个属性值为auto时,元素“过度受限”时就会重置这一属性值以满足等式;
4)垂直轴规则类似,但要注意只有top可以取静态位置,bottom做不到。

3.对于替换元素(注意这里没有“恰当收放”的概念,因为替换元素有固有宽高):

1)先看其width(height)是否显式声明,显式声明则为该值,否则由元素内容实际大小(宽高)决定;
2)再看left,top若为auto则替换为静态位置;
3)再看如果left和bottom值如果还为auto,则令margin的auto都置0,若未被置0就设置为左右相等,上下相等;
4)在此之后如果只剩下一个auto值,则同非替换元素类似,根据等式重置该auto值。
5)当元素“过度受限”时,与非替换元素处理一样,用户代理会忽略right(从左向右读)和bottom。

以上就是对一个绝对定位元素实际显示的宽度高度的影响因素情况分析,当你发现界面显示的效果与你预想的不一致时,可以考虑从上述角度分析一下看是否需要重新确定元素的宽度高度值,或以上其它属性的值。

2. flex布局

①顶栏和③底栏都设置position:fixed,分别置于页面的顶部和底部,然后②内容的部分设置marin-top和margin-bottom为①顶栏和③底栏的高度,这样②内容部分就可以滚动页面来浏览

<body>
    <div class="bigDiv">
        <div class="header">
            header
        </div>

        <div class="content">
            <div class="main_content">
            </div>
        </div>
        <div class="footer">
            footer
        </div>
    </div>
</body>
        body{
            margin: 0;
            padding: 0;
        }
        .bigDiv{
            height:100vh;
            display:flex;
            flex-direction: column;
            justify-content:center;
            text-align: center;

        }
        .header,.content,.footer{
            text-align: center;
            font-size: 30px;
            font-family: arial;

        }
        .header{
            flex: 0 0 auto;
            background-color: gray;
        }
        .content{
            flex: 1 1 auto;
            background-color: red;
            display:flex;
            min-height: inherit;
            overflow-y: scroll;
        }
        .footer{
            flex: 0 0 auto;
            background-color: gray; 
        }

footer高度任意+js

<body>
    <header>header</header>
    <main>main content</main>
    <footer>footer</footer>
</body>
html,body{margin:0;padding: 0;}
header{background-color: #ffe4c4;}
main{background-color: #bdb76b;}
footer{background-color: #ffc0cb;}
/* 动态为footer添加类fixed-bottom */
.fixed-bottom {position: fixed;bottom: 0;width:100%;}
$(function(){
    function footerPosition(){
        $("footer").removeClass("fixed-bottom");
        var contentHeight = document.body.scrollHeight,//网页正文全文高度
            winHeight = window.innerHeight;//可视窗口高度,不包括浏览器顶部工具栏
        if(!(contentHeight > winHeight)){
            //当网页正文高度小于可视窗口高度时,为footer添加类fixed-bottom
            $("footer").addClass("fixed-bottom");
        } else {
            $("footer").removeClass("fixed-bottom");
        }
    }
    footerPosition();
    $(window).resize(footerPosition);
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容