From 744965800f225f7ddc8ec1f6907caecce1f496a1 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Wed, 9 Nov 2016 11:45:18 -0800 Subject: [PATCH] Absolute positioned items should apear inside padding but outside border Reviewed By: gkassabli Differential Revision: D4153332 fbshipit-source-id: 251e29e02018a433f60349b78c03feb121512797 --- React/CSSLayout/CSSLayout.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/React/CSSLayout/CSSLayout.c b/React/CSSLayout/CSSLayout.c index 7b5c3b4a79c..e8e4d21cd7c 100644 --- a/React/CSSLayout/CSSLayout.c +++ b/React/CSSLayout/CSSLayout.c @@ -1115,12 +1115,14 @@ static void absoluteLayoutChild(const CSSNodeRef node, if (isTrailingPosDefined(child, mainAxis) && !isLeadingPosDefined(child, mainAxis)) { child->layout.position[leading[mainAxis]] = node->layout.measuredDimensions[dim[mainAxis]] - child->layout.measuredDimensions[dim[mainAxis]] - + getTrailingBorder(node, mainAxis) - getTrailingPosition(child, mainAxis); } if (isTrailingPosDefined(child, crossAxis) && !isLeadingPosDefined(child, crossAxis)) { child->layout.position[leading[crossAxis]] = node->layout.measuredDimensions[dim[crossAxis]] - child->layout.measuredDimensions[dim[crossAxis]] - + getTrailingBorder(node, crossAxis) - getTrailingPosition(child, crossAxis); } } @@ -1830,16 +1832,14 @@ static void layoutNodeImpl(const CSSNodeRef node, getLeadingMargin(child, mainAxis); } } else { - if (performLayout) { - // If the child is position absolute (without top/left) or relative, - // we put it at the current accumulated offset. - child->layout.position[pos[mainAxis]] += mainDim; - } - // Now that we placed the element, we need to update the variables. // We need to do that only for relative elements. Absolute elements // do not take part in that phase. if (child->style.positionType == CSSPositionTypeRelative) { + if (performLayout) { + child->layout.position[pos[mainAxis]] += mainDim; + } + if (canSkipFlex) { // If we skipped the flex step, then we can't rely on the // measuredDims because @@ -1857,6 +1857,8 @@ static void layoutNodeImpl(const CSSNodeRef node, // can only be one element in that cross dimension. crossDim = fmaxf(crossDim, getDimWithMargin(child, crossAxis)); } + } else if (performLayout) { + child->layout.position[pos[mainAxis]] += getLeadingBorder(node, mainAxis) + leadingMainDim; } } } @@ -1901,7 +1903,7 @@ static void layoutNodeImpl(const CSSNodeRef node, getLeadingMargin(child, crossAxis); } else { child->layout.position[pos[crossAxis]] = - leadingPaddingAndBorderCross + getLeadingMargin(child, crossAxis); + getLeadingBorder(node, crossAxis) + getLeadingMargin(child, crossAxis); } } else { float leadingCrossDim = leadingPaddingAndBorderCross;