From 4b2b0956faf4dc19bcd721548b9ae688822d950f Mon Sep 17 00:00:00 2001 From: Maccesch Date: Thu, 10 Aug 2023 21:36:12 +0100 Subject: [PATCH] fixed intersection observer reporting non-intersection erroneously --- src/use_element_visibility.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/use_element_visibility.rs b/src/use_element_visibility.rs index d71d8d0..26202cb 100644 --- a/src/use_element_visibility.rs +++ b/src/use_element_visibility.rs @@ -40,7 +40,6 @@ use std::marker::PhantomData; /// * [`use_intersection_observer`] pub fn use_element_visibility(target: El) -> Signal where - El: Clone, El: Into>, T: Into + Clone + 'static, { @@ -63,9 +62,20 @@ where let (is_visible, set_visible) = create_signal(false); use_intersection_observer_with_options( - (target).into(), + target.into(), move |entries, _| { - set_visible.set(entries[0].is_intersecting()); + // In some circumstances Chrome passes a first (or only) entry which has a zero bounding client rect + // and returns `is_intersecting` erroneously as `false`. + if let Some(entry) = entries + .into_iter() + .filter(|entry| { + let rect = entry.bounding_client_rect(); + rect.width() > 0.0 || rect.height() > 0.0 + }) + .next() + { + set_visible.set(entry.is_intersecting()); + } }, UseIntersectionObserverOptions::default().root(options.viewport), );