Flex 容器增长过多,与其他元素重叠

Posted

技术标签:

【中文标题】Flex 容器增长过多,与其他元素重叠【英文标题】:Flex container grows too much, overlapping other elements 【发布时间】:2012-05-05 04:11:38 【问题描述】:

事情就是这样。我正在使用纯 AS3 对一些 Flex 组件进行一些特殊的自动布局,当我发现一些 SkinnableContainers 变得比它们的内容大时,即使它们有 0 填充并且它们内部的布局是 BasicLayout(即“全手动”布局)。

这是屏幕截图和代码。这个小测试创建了一个应用程序并将布局设置为 Horizo​​ntalLayout。然后,在 Application 容器内,我创建了两个 SkinnableContainer,每个都包含一个带有一些文本的标签。我将 SkinnableContainers 的最大宽度设置为 150 像素,并将其中的标签设置为其父级的 100% 宽度。

截图

Main.mxml

<?xml version="1.0" encoding="utf-8"?>
<local:MainApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*"/>

MainApplication.as

package 
  import flash.events.Event;
  import spark.components.Application;
  import spark.components.SkinnableContainer;
  import spark.components.Label;
  import spark.layouts.HorizontalLayout;
  import spark.layouts.BasicLayout;

  public class MainApplication extends Application 
    public function MainApplication() 
      super();

      var hl : HorizontalLayout = new HorizontalLayout();
      hl.gap = 0;
      hl.paddingTop = 0;
      hl.paddingLeft = 0;
      hl.paddingRight = 0;
      hl.paddingBottom = 0;

      this.layout = hl;

      var leftBlock : SkinnableContainer = myNewContainer(0xFF0000);
      var rightBlock : SkinnableContainer = myNewContainer(0x00FF00);;
      var leftLabel : Label = myNewLabel("oranges blackberries bananas kiwis plums apples");
      var rightLabel : Label = myNewLabel("apricots peaches lemons pineapples");

      leftBlock.addElement(leftLabel);
      rightBlock.addElement(rightLabel);

      this.addElement(leftBlock);
      this.addElement(rightBlock);
    

    private function myNewContainer(backColor : Number) : SkinnableContainer 
      var container : SkinnableContainer = new SkinnableContainer();
      container.layout = new BasicLayout();
      container.maxWidth = 150;
      container.explicitWidth = 150;
      container.opaqueBackground = backColor;
      return container;
    

    private function myNewLabel(text : String) : Label 
      var myLabel : Label = new Label();
      myLabel.text = text;
      myLabel.percentWidth = 100;
      myLabel.setStyle("color", 0xFFFFFF);
      myLabel.setStyle("backgroundColor", 0x000000);
      return myLabel;
    
  

在我看来,SkinnableContainers(红色和绿色背景)并不关心我应用于它们的 maxWidth = 150;,但标签(黑色背景上的白色文本)尊重这一点。我期待只看到标签,没有任何过度延伸的红色或绿色背景。是否涉及一些填充?我错过了什么吗?

【问题讨论】:

【参考方案1】:

简答

使用backgroundColor 样式而不是opaqueBackground 属性。

长答案

如果您将 container.opaqueBackground = backColor 替换为 container.setStyle("backgroundColor", backColor)(就像您对标签所做的那样),红色和绿色区域就在您期望的位置。

请记住,opaqueBackground 是 DisplayObject 类的纯 AS3 属性。它与 Flex 框架(直接)无关。所以你看到的是那些 DisplayObjects 有些重叠,但不是 Flex SkinnableContainers。

更准确地说:SkinnableContainers 是从 DisplayObject 扩展而来的,所以从技术上讲,它们重叠的,但是它们的图形和内容以视觉上的方式对齐(以及除用法之外的任何其他实际方式) opaqueBackground) 他们不是。

【讨论】:

这确实解决了它。另外,谢谢你的解释!现在更有意义了。 另外,感谢您修复屏幕截图...我还在学习。

以上是关于Flex 容器增长过多,与其他元素重叠的主要内容,如果未能解决你的问题,请参考以下文章

我有一个相互重叠的 flex 包装 div 容器。这些可能是不同的高度并包裹多次。如何避免重叠?

在具有 object-fit 的 flex 容器中实现重叠图像

在 IE11 中与显示重叠的行:flex

限制 jQuery 可拖动项与兄弟元素重叠/碰撞

Flex-direction 列使 flex 项目重叠 IE11

重叠图像与另一个图像