Angular2 组件标签破坏了 flexbox 布局

Posted

技术标签:

【中文标题】Angular2 组件标签破坏了 flexbox 布局【英文标题】:Angular2 component tags break flexbox layout 【发布时间】:2017-01-16 19:46:18 【问题描述】:

我正在为纯 html5 和 CSS3 的客户端构建 Web 应用程序的前端,并使用 flexbox 进行布局。我完成了第一页并将其发送给客户。他在 Angular2 组件标签中包裹了一些代码,布局就被破坏了。

这是一个问题的例子:

原版面:https://jsfiddle.net/starbreaker/jrqbhsuq/

HTML:

<div class="wrapper">

  <div class="child first">
    <h1>Some content</h1>
  </div>

  <div class="child second">
    <h1>Some more content</h1>
    <p>Help me if you can, I'm feeling down
       And I do appreciate you being 'round
       Help me get my feet back on the ground
       Won't you please, please help me
    </p>
    <p>When I was younger so much younger than today
       I never needed anybody's help in any way
       (But) But now these days are gone (These days are gone), I'm not so self assured
       (I know I've found) Now I find I've changed my mind and opened up the doors
      </p>
  </div>

</div>

CSS:

.wrapper 
  display: flex;


.child 
  background-color: yellow;
  padding: 0 1em;
  flex: 1;


.first 
  display: flex;
  align-items: center;
  background-color: #F6CEF5;


.second 
  background-color: #CEF6CE;

他将第一个和第二个子 div 包装在 Angular2 组件标签中并得到了这个: https://jsfiddle.net/starbreaker/1c15q243/

我明白发生了什么——这些新添加的 Angular2 标签变成了弹性项目,而不是原来的标签,破坏了一切。客户说“浏览器会忽略这些角度标签”,但这里显然不是这种情况。

他还说“我无法完全控制插入哪些额外标签。因此设计/css 必须能够处理额外的非 html 元素(浏览器通常会忽略)。”

我尝试将内联样式应用到这些新的 Angular 标签(基本上是从 div 中添加样式到它们)并解决了问题,但这显然不是一个很好的解决方案并且不可扩展。

我发现这里描述的类似问题:Using flexbox with angular 2 components

不幸的是,我对 Angular 的经验为零,并且不知道如何实施这个问题的解决方案。

那么,是否有可能仅在 CSS/HTML 中以某种方式解决此问题?

后期编辑:

我在很多地方都使用了具有不同 css 属性的 flexbox,并且事先不知道将插入什么 Angular 标签以及在哪里插入,所以在 CSS 中重新设置它们似乎不是一个好的解决方案...

【问题讨论】:

问题是添加这些额外的标签会阻止你的 .child 元素成为弹性项目,因为角度标签现在是弹性项目。您的子元素现在是孙子元素。您可以做的是使用 css 选择器将新的角度标签也转换为 flex 容器。类似.wrapper &gt; *,但我不是这方面的专家。 demo,可能有更好的解决方案。 @RicardoRuiz,感谢您的建议!这是一个好主意并且适用于这种特殊情况,但如果有很多这样的标签被插入到不同的地方,不仅在“.wrapper”下而且并不总是作为弹性项目,那么你的解决方案将无济于事...... 【参考方案1】:

您的组件必须是 flex 父组件,因此您可以在组件装饰器中使用 styles/stylesUrl 属性,或者只需在 css 中为您的组件设置样式

// component decorator styles property
:host 
  display: flex;


// external css
your-component-selector 
  display: flex;

https://jsfiddle.net/1c15q243/2/

【讨论】:

感谢您的回答!我看到我可以像任何其他标签一样在 CSS 中设置这些 Angular 标签的样式,但是我在许多具有不同 css 属性的地方使用 flexbox,并且事先不知道将插入哪些 Angular 标签以及在哪里插入,所以在 CSS 中重新设置它们的样式并不'似乎不是一个好的解决方案......

以上是关于Angular2 组件标签破坏了 flexbox 布局的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 flexbox 布局在 Safari 中被破坏了?

Angular2:如何在组件内部显示组件标签的内部 HTML?

在 Safari 中破坏大小图像的 Flexbox

Flexbox:Autoprefixer 添加了一个破坏 Safari 的 css 属性

Flexbox 渲染被最新的 Chrome 破坏

1Angular2 Component 组件