diff --git a/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-viewCulling-itest.js b/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-viewCulling-itest.js
index 43be9bac9899..3c33c659e72d 100644
--- a/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-viewCulling-itest.js
+++ b/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-viewCulling-itest.js
@@ -2534,3 +2534,25 @@ describe('opt out mechanism - Unstable_uncullableView & Unstable_uncullableTrace
);
});
});
+
+describe('culling inside ScrollView with overflow visible', () => {
+ it('shows view outside of bounds', () => {
+ const root = Fantom.createRoot({viewportWidth: 100, viewportHeight: 100});
+
+ Fantom.runTask(() => {
+ root.render(
+
+
+ ,
+ );
+ });
+
+ // Child is not culled because overflow:visible.
+ expect(root.takeMountingManagerLogs()).toContain(
+ 'Create {type: "View", nativeID: "child"}',
+ );
+ });
+});
diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp
index b90414be6dda..b061451ac0fd 100644
--- a/packages/react-native/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp
+++ b/packages/react-native/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp
@@ -23,12 +23,17 @@ CullingContext CullingContext::adjustCullingContextIfNeeded(
if (ReactNativeFeatureFlags::enableViewCulling()) {
if (auto scrollViewShadowNode =
dynamic_cast(pair.shadowNode)) {
- cullingContext.frame.origin =
- -scrollViewShadowNode->getContentOriginOffset(
- /* includeTransform */ true);
- cullingContext.frame.size =
- scrollViewShadowNode->getLayoutMetrics().frame.size;
- cullingContext.transform = Transform::Identity();
+ if (scrollViewShadowNode->getConcreteProps().yogaStyle.overflow() !=
+ yoga::Overflow::Visible) {
+ cullingContext.frame.origin =
+ -scrollViewShadowNode->getContentOriginOffset(
+ /* includeTransform */ true);
+ cullingContext.frame.size =
+ scrollViewShadowNode->getLayoutMetrics().frame.size;
+ cullingContext.transform = Transform::Identity();
+ } else {
+ cullingContext = {};
+ }
} else if (pair.shadowView.traits.check(
ShadowNodeTraits::Trait::RootNodeKind)) {
cullingContext = {};