【问题标题】:Styling dom elements generated by ngfor样式化 ngfor 生成的 dom 元素
【发布时间】:2019-04-14 08:30:18
【问题描述】:

背景:所以我从后端获取了一些数据,这些数据作为数组存储在我的 Angular 前端。现在我试图在模板上显示这些元素(它们是产品)中的每一个。我基本上想要实现的是用户可以浏览的页面上的产品。

问题: 问题是 ngfor 只是在模板的垂直线上一个接一个地绘制元素。我想要的是能够应用一般样式设置(也许在托管 ngfor 的父元素上?),因此元素从页面的左上角到右上角的一行,根据视口从 1 到 X 个元素宽度,然后在以下行上继续,直到原始数组中没有剩余。 PS。我曾尝试在父元素中使用 css 网格和 flexbox,但它们只是被模板忽略了。

如果有人能指出我可以达到预期结果的方向,我将不胜感激。

我的模板代码如下:

<div id="backGroundImage">
  <div id="salesPageContainer">
    <div id="saleItemsContainer" >
      <div *ngFor="let saleItem of saleItems" id="itemContainer" >
        <p id="itemName">{{ saleItem.itemName }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
        <img [src]="imageUrl + saleItem.imageID" alt="" id="itemImage" />
      </div>
    </div>
  </div>
</div>

【问题讨论】:

  • 没有关于 *ngFor 生成的样式元素的特殊规则。只需在元素上放置一个类并在css中设置该类的样式。顺便说一句,现在您正在生成具有相同 id 属性的 X 元素,这不是好的 HTML。

标签: angular dom styling ngfor


【解决方案1】:

在此处查看示例实现 WORKING STACKBLITZ

如果您的应用中有 bootstrap,请添加 class="d-flex flex-wrap" like below

<div id="backGroundImage">
  <div id="salesPageContainer">
    <div id="saleItemsContainer" class="d-flex flex-wrap">
      <div *ngFor="let saleItem of saleItems" id="itemContainer" >
        <p id="itemName">{{ saleItem.itemName }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
        <img [src]="imageUrl + saleItem.imageID" alt="" id="itemImage" />
      </div>
    </div>
  </div>
</div>

plain css 中应用 css display: flex; flex-wrap: wrap;id="saleItemsContainer"

<div id="backGroundImage">
  <div id="salesPageContainer">
    <div id="saleItemsContainer">
      <div *ngFor="let saleItem of saleItems" id="itemContainer" >
        <p id="itemName">{{ saleItem.itemName }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
        <img [src]="imageUrl + saleItem.imageID" alt="" id="itemImage" />
      </div>
    </div>
  </div>
</div>

使用 CSS 网格

<div id="backGroundImage">
  <div id="salesPageContainer">
    <div id="saleItemsContainer">
      <div *ngFor="let saleItem of saleItems" id="itemContainer" >
        <p id="itemName">{{ saleItem.itemName }}</p>
        <p id="itemPrice">{{ saleItem.itemPrice }}</p>
        <img [src]="imageUrl + saleItem.imageID" alt="" id="itemImage" />
      </div>
    </div>
  </div>
</div>

添加css到saleItemsContainer

#saleItemsContainer {
  display: grid;
  grid-column-gap: 0.5rem;
  grid-row-gap: 0.4rem;
  grid-template-columns: auto auto auto;
}

【讨论】:

  • 非常感谢您的回复。这是非常有帮助的。我想知道是否有办法让 CSS 网格也能正常工作。例如,假设我将 display: grid; 添加到 id="saleItemsContainer"。我应该在 id="itemContainer" 中添加什么,以便将通用样式应用于模板上绘制的数组的所有元素?
  • @BlitzMee 检查我用 Css 网格示例更新的 stackblitz,如果你觉得它有用,请接受答案并点赞
  • 这非常有效。非常感谢。我已经接受了答案。我无法投票,因为我对我的问题投了几个反对票,而且我的代表不再足够高。
  • 我现在有 16 个代表接受答案。应得的赞成:)
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多