Containing block
Often times certain properties depend on a node beyond the
one it is applied to. An example of this is percentage lengths like width: 50%
which
will set the width of a node to 50% of some other length. That other length is determined
by the size of the containing block. A containing block is not a Yoga-specific
concept and exists in the web,
but since Yoga only implements a subset of web browser capabilities the behavior of
containing blocks is much more streamlined and it is helpful to frame it differently.
Identifying the containing block of a node
- If the position type of a node is static or relative then the containing block is always the content box of the parent. This is because in Yoga every node is a flex container and therefore establishes a formatting context which would form a containing block on the web. The content box is formed by the node without margin, padding, or borders.
- If the position type of a node is absolute then the containing block will be
the padding box (the content box plus padding) of any of:
- The nearest non-static ancestor.
- The nearest ancestor which is configured to always form a containing block. This
is helpful for supporting things outside of Yoga which would form a containing block
on the web, such as filters
or transforms. This
is done by calling the corresponding API for the language you are working in.
- C/C++
- Java
- JavaScript
YGNodeSetAlwaysFormsContainingBlock(node, true /*alwaysFormsContainingBlock*/);
node.setAlwaysFormsContainingBlock(true /*alwaysFormsContainingBlock*/);
node.setAlwaysFormsContainingBlock(true /*alwaysFormsContainingBlock*/);
- The root if none of the above apply. Note that this is different from the web which has the notion of the initial containing block that depends on the size of the viewport.
- If the node in question is the root then there is no containing block, but it will
use the
availableWidth
andavailableHeight
that is passed in to the call toCalculateLayout
.
What the containing block affects
- Any percentage-based lengths will depend on the size of the containing block. Specifically the height, top, and bottom properties will use the height of the containing block. The width, left, right, margin, and padding will use the width of the containing block.
- Any insets (left, right, top, bottom, etc.) applied to absolute nodes will be relative to the corresponding edge of the containing block.
<Layout config={{useWebDefaults: false}}> <Node style={{ width: 200, height: 200, padding: 10 }}> <Node style={{ height: 100, width: 100, position: 'static' }}> <Node style={{ height: 25, width: '50%', bottom: 10, position: 'absolute' }} /> </Node> </Node> </Layout>