Bu soruya 30'dan fazla cevap var ve hiçbiri kullandığım inanılmaz basit, saf JS çözümünü kullanmıyor. Diğerleri ittiği gibi, sadece bunu çözmek için jQuery yüklemeye gerek yoktur.
Elemanın görünüm portu içinde olup olmadığını söylemek için önce elemanların gövde içindeki pozisyonunu belirlemeliyiz. Bir zamanlar düşündüğüm gibi bunu tekrar tekrar yapmamız gerekmiyor. Bunun yerine kullanabiliriz element.getBoundingClientRect()
.
pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
Bu değer, nesnenin üstü ile gövdenin üstü arasındaki Y farkıdır.
Ardından, öğenin görünümde olup olmadığını söylemeliyiz. Çoğu uygulama, tam öğenin görünüm alanında olup olmadığını sorar, bu yüzden bu konuya değineceğiz.
Her şeyden önce, pencerenin üst konumudur: window.scrollY
.
Pencerenin yüksekliğini en üst konumuna ekleyerek pencerenin alt konumunu elde edebiliriz:
var window_bottom_position = window.scrollY + window.innerHeight;
Öğenin en üst konumunu elde etmek için basit bir işlev oluşturalım:
function getElementWindowTop(elem){
return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}
Bu işlev, öğenin pencere içindeki en üst konumunu döndürür veya 0
öğeyi.getBoundingClientRect()
yöntemle . Bu yöntem uzun zamandır var, bu yüzden tarayıcınızın desteklememesi konusunda endişelenmenize gerek yok.
Şimdi, elementimizin en üst pozisyonu:
var element_top_position = getElementWindowTop(element);
Ve veya elemanın alt konumu:
var element_bottom_position = element_top_position + element.clientHeight;
Şimdi, öğenin alt konumunun görünüm alanının üst konumundan daha düşük olup olmadığını ve öğenin üst konumunun görünüm alanının alt konumundan daha yüksek olup olmadığını kontrol ederek öğenin görünüm alanında olup olmadığını belirleyebiliriz:
if(element_bottom_position >= window.scrollY
&& element_top_position <= window_bottom_position){
//element is in view
else
//element is not in view
Oradan, öğenize bir in-view
sınıf eklemek veya kaldırmak için mantığı gerçekleştirebilir ve daha sonra CSS'nizdeki geçiş efektleriyle daha sonra işleyebilirsiniz.
Bu çözümü başka hiçbir yerde bulamadığım için kesinlikle şaşırdım, ancak bunun en temiz ve en etkili çözüm olduğuna inanıyorum ve jQuery yüklemenizi gerektirmiyor!