<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>314946</bug_id>
          
          <creation_ts>2026-05-16 05:19:49 -0700</creation_ts>
          <short_desc>IntersectionObserver is broken at zooms outside 100%</short_desc>
          <delta_ts>2026-05-19 23:23:23 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>Safari 26</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alex">alexander</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>kiet.ho</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2211411</commentid>
    <comment_count>0</comment_count>
    <who name="Alex">alexander</who>
    <bug_when>2026-05-16 05:19:49 -0700</bug_when>
    <thetext>Steps to reproduce:

1. Have a container with children that are 100% in both height and width, i.e. match parents size EXACTLTY.
2. Add CSS scroll snap so that each child is not just the same size as parent, but also is match EXACTLY into frame regardless of scroll position.
3. Have IntersectionObserver at 1.0 threshold to monitor the current active slide.
4. Change zoom to something other than 100%.

Actual results:
IntersectionObserver stops triggering properly, you can see it in this super minimalistic carousel demo:
https://codepen.io/waterplea/pen/XJjzrQW

At, say 90% or 110% it stops working when swiping to the right, only to the left.

Expected results:
IntersectionObserver is triggered whenever a frame is snapped into place fully.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2211749</commentid>
    <comment_count>1</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2026-05-18 09:33:54 -0700</bug_when>
    <thetext>Alex, what OS/Safari version are you testing on?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2211762</commentid>
    <comment_count>2</comment_count>
    <who name="Alex">alexander</who>
    <bug_when>2026-05-18 10:24:16 -0700</bug_when>
    <thetext>macOS 26.4.1
Safari Version 26.4 (21624.1.16.11.4)

This actually happens for all browsers and OSes, it seems, I have filed an issue for FF and for Chrome it is already there for a few years. Not sure about Safari, but in Chrome those 90%/110% zoom causes elements to have subpixel sizes which causes IntersectionObserver to stop firing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2212263</commentid>
    <comment_count>3</comment_count>
    <who name="Kiet Ho">kiet.ho</who>
    <bug_when>2026-05-19 17:10:59 -0700</bug_when>
    <thetext>Alex, thank you for the bug report. When you say zoom, is this zooming by Cmd+/- or pinch zoom?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2212338</commentid>
    <comment_count>4</comment_count>
    <who name="Alex">alexander</who>
    <bug_when>2026-05-19 23:23:23 -0700</bug_when>
    <thetext>By Cmd+/-, yes.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>