Angular Material布局-扩展以填充窗口

42

我试图创建一个 Angular Material 布局。我的目标是创建一个填满整个浏览器窗口且不会出现垂直滚动条的页面。在页面顶部有一个工具栏,它占据了整个页面的宽度。在工具栏下方是一个标题区域,它也占据了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可以看到一切都被连接在一起,并且可以直观地看到问题。

任何帮助将不胜感激!

附:我刚在IE 11上测试了这个Plunker,它还有其他显示问题。但那是另一个问题。它应该在Chrome上正常工作。而且,菜单将自动隐藏在小于600像素的窗口中。要显示窗口,请使Plunker显示窗口变宽。


3
我之前已经把这个做好了,但当我尝试编辑这个plunker时,它就没了。以下内容可以让你朝正确的方向开始(我现在没有时间确切地弄清楚我当时到底做了什么):`<div flex style="height: -webkit-calc(100% - 76px)"> <div ng-view flex layout-fill style="height: 100%"></div></div>` - Mordred
谢谢Mordred,这个方法很有效。我在两个元素上都添加了你建议的样式。这使得菜单和客户区域都可以扩展到填满整个窗口。它还增加了标题区域,但是使用flex="10"属性很容易解决。我猜为了兼容所有浏览器,我还需要添加-moz-calc(100% - 76px)和-o-calc(100% - 76px)以及calc(100% - 10px)吗? - Briz
我不知道Opera是否支持它,但你肯定需要其他的。此外,我不确定移动设备上的计算支持情况如何。更多信息请参见:https://developer.mozilla.org/en-US/docs/Web/CSS/calc#Browser_compatibility - Mordred
你是否熟悉viewport CSS单位?将height: 100vhwidth: 100vw应用于一个元素会确保该元素是视口的完整宽度和高度。 添加position: absoluteleft: 0top: 0可以确保它在左上角。 不确定是否解决问题。 - Benjamin Solum
我在这个问题中回答了如何在angular-material中使用layout-fill的实际工作原理:https://dev59.com/Tojca4cB1Zd3GeqPz6qC#38898431去那里看看,也许会有所帮助。 - kavare
3个回答

31

你也可以仅使用 Angular Material 的元素而不添加额外的样式来实现此效果。

基本上,您需要向要垂直填充的元素的所有父级添加 layout。您也不需要使用太多的 layout-fill

这里是演示:http://plnkr.co/edit/E244WNhvMXw9VC7DpAW0?p=preview

我还向侧边栏添加了背景色以演示它也会垂直填充。


3
“基本上,您需要为要垂直填充的所有元素的父级添加布局。您也不需要使用太多的layout-fills。” 这一段话对我让视图正常工作来说非常关键。谢谢。 - Tim Perry
基本上,您需要将布局添加到要垂直填充的元素的所有父级。 - Ron

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

我认为这个答案应该放在一个回答中,以便其他人更容易看到。


5

简单示例:

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

输出:

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接