如何用角材料实现经典的“粘性页脚”?

Posted

技术标签:

【中文标题】如何用角材料实现经典的“粘性页脚”?【英文标题】:How to implement the classic "sticky footer" with angular-material? 【发布时间】:2015-01-21 07:18:39 【问题描述】:

我知道Angular Material 的实现正在进行中,但今天早上我花了一些时间来熟悉它。但是,我真的很难让演示中显示的概念在独立站点中工作。

似乎当<md-toolbar><md-content> 之类的指令用于具有固定高度的容器中时,它们的效果很好。我正在努力解决如何将它们放入 <body 标记中并能够拥有粘性页脚布局 like in this example。

我尝试了许多变体,但这里有一个示例在从 DOM 中删除内容时不起作用。当内容在那里时,它会超出视口,然后像您期望的那样放置页脚。在最新版本的 Chrome 和 Firefox 中,此示例在删除内容时将页脚保留在底部,但在 IE 中这根本不起作用。在 IE 中,无论是否显示主要内容,页脚都浮动在页眉下方。

演示: http://codepen.io/sstorie/pen/xbGgqb

<body ng-app="materialApp" layou-fill layout='column'>
    <div ng-controller="AppCtrl" layout='column' flex>
      <md-toolbar class='md-medium-tall'>
        <div class="md-toolbar-tools">
          <span>Fixed to Top</span>
          <span flex></span>
          <md-button class="md-raised" ng-click="toggleContent(!displayContent)">toggle content</md-button>
        </div>
      </md-toolbar>
      <main class='md-padding' layout="row" flex>
        <div flex>
        <md-card ng-if="displayContent" ng-repeat = "card in cards">
          $index
          card.title
          card.text
        </md-card>
        </div>
               <div flex>
        <md-card ng-if="displayContent" ng-repeat = "card in cards">
          $index
          card.title
          card.text
        </md-card>
        </div>
      </main>
      <md-toolbar class="md-medium-tall">
        <div layout="row" layout-align="center center" flex>
          <span>FOOTER</span>
        </div>
      </md-toolbar>
    </div>
  </body>

javascript

angular.module('materialApp', ['ngMaterial'])

.controller('AppCtrl', function($scope) 
    $scope.cards = [
    text: 'Bla bla bla bla bla bla bla ',
     title: 'Bla' ,
    ...repeat 10 times...
  ];

    $scope.displayContent = true;

    $scope.toggleContent = function(showContent)  $scope.displayContent = showContent; ;
);

CSS:

body 
    min-height: 100%;
    height: auto !important;
    height: 100%;

我绝对不是 CSS 专家,但感觉使用 angular-material 中的布局选项应该很容易做到这一点,所以我希望我真的错过了一些明显的东西。

【问题讨论】:

除了使用底纸之外,您找到解决方案了吗? 不,还没有一个可靠的工作。 只是想跟进我之前的评论,以防有人看到这个。接受的答案确实有效,虽然我希望我不需要在 CSS 中包含确切的像素高度,但它提供了我正在寻找的内容。 【参考方案1】:

我没有发现任何答案都能在浏览器中可靠地工作而没有任何缺陷。

正如SO answer 中指出的那样,这是可行的:

<md-toolbar></md-toolbar>
<md-content flex layout="column">
    <div layout="column" flex>
        <main flex="none"></main>
        <div flex></div>
        <footer flex="none"></footer>
    </div>
<md-content>

这是一个codepen 的例子。

【讨论】:

希望我能投票更多!就像您说的那样,许多其他解决方案在一个或另一个浏览器中都有微妙的问题。我在 IE 中遇到的问题非常令人沮丧:codepen.io/ariscol/pen/rwwXWO【参考方案2】:

不需要底片或类似的东西。 利用 flexbox 行为,一切顺利:

    在主包装器上使用layout="column"layout-fill 属性(可以是body 标记)。 创建您的部分:headermainfooter。 在您的main 上使用flex 属性。

查看我的示例,基于@kuhnroyal pen。

Code | Full Page

【讨论】:

太糟糕了,这不再适用于 Angular Material 版本 1.0.0-rc4。 适用于 1.0.3 - 虽然我不需要“主包装器”上的“布局填充” 它停止在 angular-material@1.1.1 上工作。 works v0.8.3 | broken v1.1.1 我找到了这个***.com/questions/34720648/… 并将它合并到这个codepen...Working v1.1.1【参考方案3】:

您可以通过一个小变通方法来解决这个问题。

main 元素上使用 min-height: calc(100vh - 176px),(md 工具栏为 176px = 2*88px) 从根 div 中删除 layout='column' 从正文中删除layout-fill layout='column'

我用 CDN 版本 0.8.3 替换了材料 css/js,因为我的 IE10 会因 Codepen 中的 CSS/JS 数量而崩溃。

我在 Chrome、Firefox 和 IE10 上对此进行了测试 - 似乎可行。

http://codepen.io/anon/pen/azgdOZ

【讨论】:

【参考方案4】:

所以我只是在尝试角度材料,但我为此所做的是

<div layout="column" layout-fill>
   <md-toolbar class="md-default-theme">
   <!-- your stuff -->
   </md-toolbar>
   <md-content layout-fill role="main">
      <!-- your main areas -->
   </md-content>
   <md-bottom-sheet>
      <div>I am a sticky footer</div>
   </md-bottom-sheet>
</div>

我还没有进行足够的实验来确定这是否可以按照我想要的方式进行,但到目前为止看起来很有希望。请注意,如果您的内容不受限制,它可能会不断地将底页向下推。如果您在 md-content 上使用了 overflow-y: auto 它可能会起作用(我的应用程序构建的还不够多,无法测试)

【讨论】:

md-bottom-sheet 的意图是根据应用程序的状态提供上下文操作吗?

以上是关于如何用角材料实现经典的“粘性页脚”?的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 4 - 粘性页脚 - 动态页脚高度

如何使用粘性页脚将引导 3 容器设置为浏览器高度的 100%?

C语言经典项目实战——三子棋

C语言经典项目实战——三子棋

具有固定页眉的真正粘性页脚?

如何用EFCore Lazy Loading实现Entity Split