2014-11-23 2 views
29

Я признаю, что реализация Angular Material является незавершенной, но я потратил некоторое время этим утром, пытаясь ознакомиться с ней. Тем не менее, я действительно стараюсь, чтобы концепции, показанные в демонстрационных записях, работали на отдельном сайте.Как реализовать классический «липкий нижний колонтитул» с угловым материалом?

Кажется, что, когда директивы типа <md-toolbar> и <md-content> используются в контейнерах с фиксированными высотами, то они отлично работают. Я борюсь с тем, как бросить их в тег <body и иметь возможность иметь липкую компоновку нижнего колонтитула like in this example.

Я пробовал много вариантов, но вот один пример, который не работает, когда содержимое удаляется из DOM. Когда контент там, он растет за пределами области просмотра, а нижний колонтитул помещается впоследствии, как и следовало ожидать. В последних версиях Chrome и Firefox этот пример поддерживает нижний колонтитул внизу, когда содержимое удаляется, но в IE это просто не работает вообще. В IE нижний колонтитул плавает чуть ниже заголовка независимо от того, отображается ли основное содержимое или нет.

DEMO: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 гуру, но он чувствует, как это должно быть легко сделать с вариантами макета в угловом материале, поэтому я h Мне действительно не хватает чего-то очевидного здесь.

+0

Вы нашли решение, используя нижний лист? –

+0

Нет, еще никто не работает надежно. –

+0

Просто хотел следить за моим предыдущим комментарием на случай, если кто-то просто взглянет на это. Принятый ответ действительно работает, и, хотя мне жаль, что мне не нужно включать точные высоты пикселей в CSS, он обеспечивает то, что я искал. –

ответ

21

Вы можете заставить это работать с небольшим обходным решением.

  • использование min-height: calc(100vh - 176px) на вашем main элементе (176px = 2 * размером 88 для MD-панелей инструментов)
  • удалить layout='column' из корня DIV
  • удалить layout-fill layout='column' из тела

Я заменил материал css/js на версию CDN 0.8.3, так как мой IE10 сработает с этим количеством CSS/JS в кодеде.

Я тестировал это на Chrome, Firefox и IE10 - кажется, работает.

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

7

Так что я просто experiementing с угловым-материала, но то, что я сделал для этого был

<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> 

Я не экспериментировал достаточно, чтобы знать наверняка, делает ли это все они, как я хочу, но пока выглядит многообещающий. Обратите внимание, что если контент не ограничен, он, вероятно, будет постоянно толкать нижний лист вниз. если вы использовали overflow-y: auto на md-содержимом, он мог бы работать (у меня не достаточно моего приложения, которое еще было создано для тестирования)

+1

Является ли намерение md-bottom-sheet использовать контекстные действия на основе состояния приложения? –

24

Там нет необходимости в нижнем листе или что-то вроде этого. Усильте поведение Flexbox и вы хорошо идти:

  1. Использования layout="column" и layout-fill атрибутов на главной обертке (могут быть ваш body тега).
  2. Создайте ваши разделы: header, main и footer.
  3. Используйте атрибут flex на вашем main.

Проверьте мой пример, на основе ручки @kuhnroyal.

Code | Full Page

+1

Однако это не работает в IE. –

+0

Упрощенный .. Спасибо, сэр .. Работал именно так, как я хотел. –

+2

Bummer, это больше не работает с Angular Material версии 1.0.0-rc4. –

5

Я не нашел ни одного ответа, который надежно работает в браузерах без одного изъяна или другого.

Как указано в этом 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 для примера.

+0

Жаль, что я мог бы возвысить больше! Как вы сказали, многие другие решения имеют тонкие проблемы в одном браузере. Проблема, с которой я столкнулась в IE, была настолько расстраивающей: https://codepen.io/ariscol/pen/rwwXWO – ctb