Угловая компоновка материала - развернуть, чтобы заполнить окно

Я пытаюсь создать макет материала Angular. Моя цель - создать страницу, которая заполняет все окно браузера, не создавая вертикальной полосы прокрутки. Вверху страницы находится панель инструментов, занимающая 100% ширины страницы. Под панелью инструментов находится область заголовка, которая также занимает 100% ширины. Под областью заголовка я хотел бы, чтобы слева было навигационное меню, а справа - клиентская область. Моя цель - сделать так, чтобы и навигационное меню, и клиентская область заполняли по вертикали все окно браузера.

Чтобы дать вам наглядное представление о том, что я пытаюсь достичь: введите здесь описание изображения

Я экспериментировал с строкой и столбцом макета вместе с атрибутами flex и layout-fill. Все остальные сообщения, которые я нашел, указывают на то, что это должно быть возможно при правильной комбинации, однако решение ускользало от меня. Я создал Plunker, чтобы продемонстрировать свою проблему:

http://plnkr.co/edit/Eva0Cf6KKa0z6I9YsR8t?p=info

Вот мой index.html:

<!DOCTYPE html>
<html class="no-js">

<head>
  <meta charset="utf-8">
  <title>adasd</title>
  <meta name="viewport" content="width=device-width">
  <link rel="stylesheet" href="//rawgit.com/angular/bower-material/master/angular-material.css">
  <link rel="stylesheet" href="nav.css">
  <link rel="stylesheet" href="style.css">
</head>
<body ng-app="plunker" ng-controller="MainCtrl">
  <md-toolbar layout="row" class="md-hue-3">
      <div flex="15" layout layout-align="center center" >
        <span>Logo</span>
      </div>
      <div flex="85" layout layout-align="center center" >
        <span>Toolbar Header</span>
      </div>
  </md-toolbar>

  <div flex >
    <div ng-view flex layout-fill></div>
  </div>
  <!-- Angular Material Dependencies -->
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-route.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-animate.min.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.6/angular-aria.min.js"></script>

  <!-- Angular Material Javascript now available via Google CDN; version 0.6 used here -->
  <script src="//rawgit.com/angular/bower-material/master/angular-material.min.js"></script>

  <script src="app.js"></script>
</body>

</html>

И main.html (отображается в ng-view):

<div layout="column" flex layout-fill>
  <div layout="row" flex layout-fill>
      <md-whiteframe flex="100" layout layout-align="center center" style="margin-bottom: 16px;height: 60px;">
          <div flex="100"><span id="site-name">Some sort of a title goes here...</span></div>
      </md-whiteframe>
  </div>
  <div layout="row" flex layout-fill>
      <md-sidenav layout-fill class="md-sidenav-left " id="siteMenu" md-component-id=" left" md-is-locked-open="$mdMedia('gt-sm')">
          <md-content layout-fill role="navigation">
              <ul class="docs-menu">
                <li ng-repeat="section in sections" class="parent-list-item">
                      <h2 class="menu-heading" ng-if="section.type === 'heading'" id="heading_{{ section.name | nospace }}">
                          {{section.name}}
                      </h2>
                      <menu-link section="section" ng-if="section.type === 'link'"></menu-link>
                </li>

                  <li ng-repeat="section in menu.sections" class="parent-list-item" ng-class="{'parentActive' : isSectionSelected(section)}">
                      <h2 class="menu-heading" ng-if="section.type === 'heading'" id="heading_{{ section.name | nospace }}">
                          {{section.name}}
                      </h2>
                      <menu-link section="section" ng-if="section.type === 'link'"></menu-link>

                      <menu-toggle section="section" ng-if="section.type === 'toggle'"></menu-toggle>

                      <ul ng-if="section.children" class="menu-nested-list">
                          <li ng-repeat="child in section.children" ng-class="{'childActive' : isSectionSelected(child)}">
                              <menu-toggle section="child"></menu-toggle>
                          </li>
                      </ul>
                  </li>
              </ul>
          </md-content>
      </md-sidenav>

      <md-content layout="row" class="content-wrapper md-padding" flex layout-fill id="content">
        <div flex layout-fill>
          <h2>Home Content</h2>

          <ul>
            <li>Page Content goes here...</li>
            <li>and here...</li>
            <li>and here...</li>
          </ul>
        </div>
      </md-content>
  </div>
</div>

Конечно, посмотрите на Plunker, чтобы увидеть, что все соединено вместе, и визуально увидеть проблему.

Любая помощь будет принята с благодарностью!

PS. Я только что протестировал этот Plunker в IE 11, и у него есть другие проблемы с отображением. Но это уже другой вопрос, в другой день. Он должен корректно работать в Chrome. Кроме того, меню будет автоматически скрываться в окнах шириной менее 600 пикселей. Чтобы отобразить окно, сделайте окно отображения Plunker шире.


person Briz    schedule 15.04.2015    source источник
comment
У меня это работало, а затем, когда я попытался отредактировать плункер, я его потерял. Это должно помочь вам двигаться в правильном направлении (у меня просто нет времени точно понять, что я сделал прямо сейчас): <div flex style="height: -webkit-calc(100% - 76px)"> <div ng-view flex layout-fill style="height: 100%"></div> </div>   -  person Mordred    schedule 15.04.2015
comment
Спасибо, Мордред, это сработало. Я добавил стиль, который вы предложили, для обоих элементов. Это привело к тому, что и меню, и клиентская область расширились, чтобы заполнить все окно. Также увеличилась область заголовка, но это легко исправить с помощью атрибута flex = 10. Я предполагаю, что для совместимости со всеми браузерами мне нужно будет также добавить -moz-calc (100% - 76px) и -o-calc (100% - 76px) и calc (100% - 10px)?   -  person Briz    schedule 16.04.2015
comment
Не знаю, поддерживает ли это опера, но другие вам точно понадобятся. Кроме того, я не уверен, какая поддержка calc есть на мобильных устройствах. Подробнее см. Здесь: developer.mozilla.org/en-US/ docs / Web / CSS /   -  person Mordred    schedule 16.04.2015
comment
Знакомы ли вы с модулями CSS области просмотра? height: 100vh и width: 100vw, примененные к элементу, гарантируют, что этот элемент имеет полную ширину и высоту области просмотра. Добавление position: absolute и left: 0, top: 0 гарантирует, что он находится в верхнем левом углу. Не уверен, решит ли это проблему или нет.   -  person Benjamin Solum    schedule 14.07.2015
comment
Я ответил на этот вопрос, чтобы сформулировать, как layout-fill на самом деле работает в angular-material: stackoverflow.com/questions/29002473/ Посмотрите там, и это может помочь.   -  person kavare    schedule 11.08.2016


Ответы (3)


Вы также можете сделать это без добавления дополнительных стилей, просто используя элементы Angular Material.

В основном вам нужно добавить layout ко всем родительским элементам, которые вы хотите заполнить по вертикали. Вам также не нужно использовать так много layout-fill.

Вот демонстрация: http://plnkr.co/edit/E244WNhvMXw9VC7DpAW0?p=preview

Я также добавил цвет фона на боковую панель, чтобы продемонстрировать, что она также заполняется по вертикали.

person Jesús Carrera    schedule 28.08.2015
comment
Абзац В основном вам нужно добавить макет ко всем родительским элементам, которые вы хотите заполнить по вертикали. Вам также не нужно использовать так много заливок макета. был ключом к тому, чтобы моя точка зрения работала. Спасибо. - person Tim Perry; 18.09.2015
comment
В основном вам нужно добавить макет ко всем родительским элементам, которые вы хотите заполнить вертикально. - Это к делу. - person Ron; 27.12.2016

<div flex style="height: -webkit-calc(100% - 76px)">
    <div ng-view flex layout-fill style="height: 100%">
    </div>
</div>

Просто подумал, что этот ответ должен быть включен в ответ, чтобы другим было проще.

person Christine268    schedule 02.06.2015

Простой пример:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">
</head>
<body ng-app="MyApp" layout="column" ng-cloak>
    <div flex layout="row" layout-align="center center" style="background: plum;">
        <div>page filled and content centered</div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>
    <script>
        angular.module("MyApp", ["ngMaterial"]);
    </script>
</body>
</html>

Вывод:

введите описание изображения здесь

person Justin Pavatte    schedule 12.06.2017