Angular Material:布局填充未填充父 <div>

Posted

技术标签:

【中文标题】Angular Material:布局填充未填充父 <div>【英文标题】:Angular Material: layout-fill not filling parent <div> 【发布时间】:2015-05-14 04:17:00 【问题描述】:
<!-- Container Div -->
<div layout-fill>
    <!-- Image Div -->
    <div layout="column" layout-align="center center" class="coverImage" layout-fill>
        <md-content class="md-padding">
            Sample Text Here
        </md-content>
        <md-button class="md-raised md-primary">Sign Up</md-button>
    </div>
</div>

我有上面的 html 部分,我正在尝试使用 Angular Material 的 flexbox 支持来创建一个页面,该页面的背景图像是整个页面。覆盖在此图像上的是一些文本和一个位于图像中心的按钮。

如果我检查 chrome 中最外层的 div,它的大小是(如预期的那样)全屏。由于某种原因,图像 div 不这样做。它只占用足够的空间来包含文本和按钮。任何有关为什么会发生这种情况的见解将不胜感激。我知道这可以使用各种 css 技巧以几种不同的方式完成,但我想了解我缺少关于 flex 工作原理的内容。

更新 链接到JSFiddle

【问题讨论】:

为此做一个小提琴。 我认为我设置正确....link 这是你的新小提琴:jsfiddle.net/1tap45pp/9 如果您喜欢目前有 6 个赞的答案。你可能想接受它。通过这样做,你是在奖励他的努力。以下是方法和原因:***.com/help/someone-answers 【参考方案1】:

我想根本问题来自于在同一个父容器中同时使用 layout-alignlayout-fill

解决方案

简而言之,有两种方法可以解决这个问题:

    使用align-items: stretch;在父容器上添加自定义css规则

    仅使用layout-fill(父容器上没有layout-align


原因

每当使用layout-* 指令时,angular-material 都会向元素添加一个类,并在那里应用与 flex 布局相关的样式。例如:

<div class="parent" layout="row" layout-align="space-between center" layout-fill> 
  <div class="child child-1" flex>
  <div class="child child-2" flex="none">
</div>

将编译为:

<div class="parent layout-fill layout-align-space-between-center layout-row" layout="row" layout-align="space-between center" layout-fill> 
  <div class="child child-1 flex" flex>
  <div class="child child-2 flex-none" flex="none">
</div>

生成的 css 将是:

.layout 
    box-sizing: border-box;
    display: -webkit-box;
    display: -webkit-flex;
    display: -moz-box;
    display: -ms-flexbox;
    display: flex;


.layout-row 
    flex-direction: row;


.layout-align-space-between-center 
    align-items: center;
    align-content: center;
    max-width: 100%;
    justify-content: space-between;


.layout-fill 
    margin: 0;
    width: 100%;
    min-height: 100%;
    height: 100%;

正如您在此处看到的,layout-fill 根本不会更改 flex 相关规则中的任何内容。

我们对拉伸的 flex 项目的期望应该利用 align-items: stretch,正如 CSS-tricks 在 A Complete Guide to Flexbox 中提到的那样。但这根本不是角度材料实现的情况。这是有道理的,因为align-item 规则已经在layout-align-* 中用作定位项目的一种方式。

示例

查看此codepen example 以了解其工作原理。

【讨论】:

谢谢@kavare .... angular material 网站上没有关于 layout-fill 、 layout-wrap 做什么的解释......或者它如何转换为代码..所以这很有帮助【参考方案2】:
<div layout-fill>
<img src="" class="bg" ></img>
<div layout="column" layout-align="center center">
    <md-content class="md-padding">
        Sample Text Here
    </md-content>
    <md-button class="md-raised md-primary">Sign Up</md-button>
</div>
</div>

并将其添加到您的 CSS

  img.bg 
  /* Set rules to fill background */
  min-height: 100%;
  min-width: 1024px;

  /* Set up proportionate scaling */
  width: 100%;
  height: auto;

  /* Set up positioning */
  position: fixed;
  top: 0;
  left: 0;

【讨论】:

感谢您的回复。就像我说的,我知道有很多替代方法可以写这个,如果我只是想让所有东西都正确渲染的话。我主要关心的是为什么图像 div 上的布局填充没有填充父 div。换句话说,我希望了解为什么它不能按原样工作,而不仅仅是解决问题。 我出去了,抱歉回复晚了。在 yr 情况下,您需要在 css 中的 yr layout-fill 类中添加“position:absolute”。【参考方案3】:

有点晚了? 您需要将“布局”属性添加到布局填充所在的 div。

【讨论】:

以上是关于Angular Material:布局填充未填充父 <div>的主要内容,如果未能解决你的问题,请参考以下文章

填充数组并使其可使用 Angular Material 过滤

使用工具栏强制 Angular Material sidenav 容器填充高度

在编辑模式下,Material-ui/DatePicker 中未填充日期

Angular 4 - 如何使垫卡填充整个父组件区域

我应该将 Bootstrap 与 Angular Material 一起用于辅助类吗?

如何仅向 Angular ngMaterial 中的布局容器添加填充或边距?