هل سبق لك أن تساءلت عن كيفية تتبع العناصر التي لها positions: sticky أصبحت positions: sticky ثابتة؟ إريك بيلدمان لديه مشاركة مذهلة حول هذا الموضوع ، اذهب واقرأها الآن.
لقد وجدت بعض الصعوبات أثناء استخدامه في مشروعي. ها هم:
- انه يكسر التغليف. يتعلق حدث sticky-changeبعنصر الرأس ، ولكن يجب عليك إدخال حراس إلى أصل الرأس (وجعلهposition: relative).
- أنه ينطوي على الكثير من العوامل التي ينبغي أن تكون متسقة واتصالهم ليس واضحًا دائمًا. على سبيل المثال ، لا يمكنك ضبط --default-paddingأكبر من40px، وهو ارتفاع الحارس العلوي.
- لا يمكنك تتبع كتلة في منتصف مقال.
دعونا نحاول تحسينه!
تعكس كل هذه المشكلات المشكلة نفسها: حل إريك هو تتبع الموقف الأصلي لزجة ، وليس كتلة لزجة نفسها. دعونا تحسين هذا مع الحفاظ على الفكرة الأصلية. كيف؟ سنقوم بإضافة حراس لرأس نفسه ومراقبة تقاطعهم مع الحاوية.

إليك كيفية القيام بذلك:
- تحتاج إلى حارس واحد لكل جانب مثبت تريد مراقبته.
- تعيين الخاصية topsentineltopتساوي رأس الصفحة ولكن مع علامة عكس ناقص 1. على سبيل المثال إذا كان رأسكtop: 10px، ثم قم بتعيين رأس sentinel على-11px. يمكنك استخدام شيء مثلtop: calc(-1px + -1 * var( -- header-sticky-top))أو فقط تعيين-1pxإذا كان لديك رأس رأس يساوي الصفر.
- إضافة حراس أخرى إذا لزم الأمر.
- راقب تقاطع الحراس مع الحاوية.
- يمكنك أن تقول أن الرأس عالق إذا كان سجل تقاطع الحارس هو isIntersecting = true،intersectionRatio = 0، وintersectionRect.top = rootBounds.top
- نفس الجوانب الأخرى ، فقط شاهد الجزء السفلي أو اليسار أو اليمين بدلاً من الأعلى.
- لا تنس أن تضيف visibility: hiddenpointer-events: nonevisibility: hiddenpointer-events: noneإلى الحراس.
تحقق من التجريبي والمصادر هنا