มีคำตอบมากกว่า 30 ข้อสำหรับคำถามนี้และไม่มีใครใช้วิธีแก้ปัญหา JS ที่เรียบง่ายและน่าอัศจรรย์ที่ฉันใช้อยู่ ไม่จำเป็นต้องโหลด jQuery เพียงเพื่อแก้ปัญหานี้เนื่องจากมีหลาย ๆ ตัวที่กำลังผลักดัน
เพื่อที่จะบอกว่าองค์ประกอบอยู่ในวิวพอร์ตเราต้องกำหนดตำแหน่งองค์ประกอบภายในร่างกาย เราไม่จำเป็นต้องทำแบบนี้ซ้ำ ๆ ตามที่ฉันเคยคิด element.getBoundingClientRect()
แต่เราสามารถใช้
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
ค่านี้คือความแตกต่าง Y ระหว่างส่วนบนของวัตถุและส่วนบนของร่างกาย
เราต้องบอกว่าองค์ประกอบนั้นอยู่ในมุมมองหรือไม่ การใช้งานส่วนใหญ่ถามว่าองค์ประกอบทั้งหมดอยู่ในวิวพอร์ตหรือไม่ดังนั้นนี่คือสิ่งที่เราจะครอบคลุม
ก่อนอื่นตำแหน่งบนสุดของหน้าต่างคือ: window.scrollY
.
เราสามารถรับตำแหน่งด้านล่างของหน้าต่างโดยการเพิ่มความสูงของหน้าต่างไปที่ตำแหน่งบนสุด:
var window_bottom_position = window.scrollY + window.innerHeight;
ให้สร้างฟังก์ชั่นที่เรียบง่ายเพื่อรับตำแหน่งสูงสุดขององค์ประกอบ:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
ฟังก์ชั่นนี้จะคืนค่าตำแหน่งบนสุดขององค์ประกอบภายในหน้าต่างหรือจะส่งคืน0
ถ้าคุณผ่านสิ่งอื่นนอกเหนือจากองค์ประกอบที่มี.getBoundingClientRect()
เมธอด วิธีนี้มีมานานแล้วดังนั้นคุณไม่ควรกังวลว่าเบราว์เซอร์ของคุณจะไม่รองรับ
ตอนนี้ตำแหน่งสูงสุดขององค์ประกอบของเราคือ:
var element_top_position = getElementWindowTop(element);
และตำแหน่งด้านล่างขององค์ประกอบคือ:
var element_bottom_position = element_top_position + element.clientHeight;
ตอนนี้เราสามารถตรวจสอบว่าองค์ประกอบอยู่ในวิวพอร์ตหรือไม่โดยตรวจสอบว่าตำแหน่งด้านล่างขององค์ประกอบนั้นต่ำกว่าตำแหน่งสูงสุดของวิวพอร์ตหรือไม่และตรวจสอบว่าตำแหน่งบนสุดขององค์ประกอบนั้นสูงกว่าตำแหน่งด้านล่างของวิวพอร์ตหรือไม่:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
จากตรงนั้นคุณสามารถใช้ตรรกะเพื่อเพิ่มหรือลบin-view
คลาสในองค์ประกอบของคุณซึ่งคุณสามารถจัดการกับเอฟเฟกต์การเปลี่ยนแปลงใน CSS ของคุณในภายหลัง
ฉันประหลาดใจอย่างยิ่งที่ฉันไม่พบโซลูชันนี้ที่อื่น แต่ฉันเชื่อว่านี่เป็นโซลูชันที่สะอาดและมีประสิทธิภาพมากที่สุดและไม่ต้องการให้คุณโหลด jQuery!