royalsite logo

21 اسفند 1403

IntersectionObserver tutorial banner

آموزش صفر تا صد IntersectionObserver

IntersectionObserver یک ابزار کاربردی در جاوااسکریپت است که به شما کمک می‌کند تشخیص دهید یک عنصر در حال حاضر در صفحه‌ی مرورگر دیده می‌شود یا خیر.

استفاده از IntersectionObserver در طراحی سایت نه‌تنها باعث بهینه تر شدن عملکرد صفحات می‌شود، بلکه تجربه کاربری را به سطح بالاتری ارتقا می‌دهد.

پیش‌نیاز ها

آشنایی با HTML , CSS

آشنایی مقدماتی با جاوااسکریپت

قابلیت های IntersectionObserver

این ابزار به ما این امکان را می‌دهد که تشخیص دهیم یک عنصر در صفحه :

  • وارد دید کاربر شده است
  • از دید کاربر خارج شده است
  • یا چه میزان از آن توسط کاربر مشاهده می‌شود

این ابزار برای بهینه سازی عملکرد وب‌سایت ها و پیاده سازی ویژگی هایی مانند بارگذاری یا انیمیشن های مبتنی بر (Lazy Loading) بسیار مفید است.

تشخیص مشاهده عنصر

const observer = new IntersectionObserver((entries,observer)=>{
entries.forEach((entry)=>{
if (entry.isIntersecting){
console.log("عنصر در دید کاربر قرار گرفت !")
}else{
console.log("عنصر از دید کاربر خارج شد !")
}
})
});
const target = document.querySelector(".target-element")
observer.observe(target)

توضیحات observer

ابتدا یک آبجکت از کلاس IntersectionObserver ساختیم و آن‌را در متغیر observer ذخیره کردیم.

تابع Callback

entries:

یک آرایه از آبجکت ها که هرکدام نمایانگر یک عنصر تحت نظر است.

observer:

به خود ردیاب (IntersectionObserver) اشاره دارد تا ویژگی ها متد های آن‌را صدا بزنید

...
observer.unobserver(entry.target)
//متوقف کردن ردیابی پس از یکبار مشاهده

حلقه‌ی entries

روی تمام تغییرات حلقه می‌زند، هر آبجکت در این آرایه اطلاعاتی درباره وضعیت یک عنصر ارائه می‌دهد. در این قسمت بررسی می‌کنیم که آیا عنصر درحال حاضر قابل رویت است یا خیر.

تغییر تنظیمات IntersectionObserver

const options = {
root:null,
rootMargin:"10px 20px 10px 20px",
threshold: 0.5
}

توضیحات تنظیمات

root : محدوده دید کاربر (null محدوده پیش‌فرض است).

rootMargin : حاشیه ای اطراف محدوده ردیابی تعریف می‌کند.

threshold : مشخص میکند چه درصدی از عنصر باید دیده شود تا کد اعمال شود.

اعمال تنظیمات روی IntersectionObserver

const options = {
root:null,
rootMargin:"10px 20px 10px 20px",
threshold: 0.5
}
const observer = new IntersectionObserver((entries,observer)=>{
entries.forEach((entry)=>{
if (entry.isIntersecting){
console.log("عنصر در دید کاربر قرار گرفت !")
}else{
console.log("عنصر از دید کاربر خارج شد !")
}
})
},options);
const target = document.querySelector(".target-element")
observer.observe(target)

ایجاد انیمیشن با IntersectionObserver

انیمیشن چرخیدن سه بعدی کارت ها به دور خودشان پس از مشاهده

کد های HTML

<div class="offset-y"></div>
<div class="card-container">
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
</div>

کد های CSS

.offset-y{
height: 1200px;
}
.card-container{
display: grid;
grid-template-columns: repeat(4,1fr);
gap: 16px;
text-align: center;
perspective: 1000px;
}
.card{
height: 340px;
width: 100%;
transition: 5s;
transform-style: preserve-3d;
}
.card:nth-child(odd){
background: rgb(226, 144, 50);
}
.card:nth-child(even){
background: rgb(51, 187, 62);
}

کد های JS

const animations = (elementList)=>{
elementList.forEach((element)=>{
element.style.transform = "rotateY(360deg)";
})
}
const cards = document.querySelectorAll('.card')
const cardContainer = document.querySelector(".card-container");
const options = {threshold:0.4}
const observer = new IntersectionObserver((entries,observer)=>{
entries.forEach(item=>{
if (item.isIntersecting){
animations(cards);
}
})
},options)
observer.observe(cardContainer);

نتیجه گیری

شما در این آموزش با مفاهیم IntersectionObserver آشنا شدید. اینک می‌توانید با بهره‌گیری از دانش برنامه‌نویسی خود، این مفاهیم را بسط داده و به طور عملی پیاده‌سازی کنید. با استفاده از این مهارت‌ها، قادر خواهید بود پروژه‌های پیچیده‌تر و کاربردی‌تری را توسعه داده و به دنیای برنامه‌نویسی قدمی محکم‌تر بردارید.

اگر در هر بخشی از این آموزش به نکته‌ای برخورد کردید که برایتان نامفهوم یا نیازمند توضیح بیشتر است، خواهشمندیم که با ارسال تیکت به ما، پیشنهاد یا سوالتان را مطرح کنید.

royalsite admin

نوشته شده توسط متین قاسمی مدیر آکادمی رویال سایت

Senior Frontend Developer

Senior Backend Developer

SEO Webmaster

Data Analyst

با بیش از سه سال تجربه طراحی سایت

instagram icon
telegram icon
sorush messenger icon
igap messenger icon
Linkedin platform