QIntersection — это компонент Quasar, предназначенный
для отслеживания видимости элемента на экране. Он реализует обёртку над
API Intersection Observer, предоставляя удобный способ
реагировать на появление или исчезновение элементов из видимой области
браузера. Основная задача QIntersection — определить, когда
элемент пересекает границы видимой области, и уведомить об этом через
событие @visibility.
<template>
<q-intersection @visibility="handleVisibility">
<div class="tracked-element">
Контент для отслеживания
</div>
</q-intersection>
</template>
<script>
export default {
methods: {
handleVisibility(isVisible) {
console.log('Элемент видим:', isVisible)
}
}
}
</script>
В данном примере метод handleVisibility получает один
аргумент — булево значение true, если элемент видим, и
false, если вышел из зоны видимости.
once Булево значение. Если
true, событие @visibility сработает один раз
при первом появлении элемента на экране и больше не будет отслеживать
изменения.
margin Определяет отступы для
области наблюдения в формате CSS, например:
'0px 0px -50px 0px'. Отрицательные значения позволяют
срабатывать раньше, чем элемент полностью войдёт в видимую
область.
throttle Время в миллисекундах для
ограничения частоты срабатывания события. Полезно при динамических
интерфейсах с частой прокруткой.
debounce Позволяет задавать
задержку перед срабатыванием события. Используется для сглаживания
частых изменений видимости.
horizontal Булево значение. Если
true, наблюдение ведётся по горизонтальной оси, а не
вертикальной.
@visibility — основной event,
который возвращает объект
{ isVisible, intersectionRatio }:
isVisible — логическое значение видимости
элемента.intersectionRatio — дробное число от 0 до 1,
показывающее процент видимой области элемента.Пример с использованием intersectionRatio для
анимации:
<template>
<q-intersection @visibility="animateElement">
<div class="fade-box" :style="{ opacity: opacity }">
Анимируемый контент
</div>
</q-intersection>
</template>
<script>
export default {
data() {
return {
opacity: 0
}
},
methods: {
animateElement({ intersectionRatio }) {
this.opacity = intersectionRatio
}
}
}
</script>
QIntersection, можно загружать изображения только когда они
становятся видимыми, снижая нагрузку на страницу:<q-intersection @visibility="loadImage">
<img v-if="imageLoaded" :src="imageUrl" />
</q-intersection>
<script>
export default {
data() {
return {
imageLoaded: false,
imageUrl: 'https://example.com/photo.jpg'
}
},
methods: {
loadImage(isVisible) {
if (isVisible) this.imageLoaded = true
}
}
}
</script>
<q-intersection @visibility="trackView">
<div class="ad-banner">Рекламный блок</div>
</q-intersection>
<script>
export default {
methods: {
trackView(isVisible) {
if (isVisible) {
console.log('Блок виден пользователю')
// отправка события в аналитику
}
}
}
}
</script>
Свойство margin позволяет управлять порогом
срабатывания. Примеры:
'0px' — элемент считается видимым, когда пересекает
любую точку viewport.'0px 0px -100px 0px' — элемент срабатывает, когда
нижняя часть ещё на 100px выше нижней границы экрана.'50px' — элемент считается видимым только после того,
как 50px его области войдут в видимую зону.throttle или debounce для
элементов в длинных списках, чтобы избежать чрезмерных вызовов и падения
производительности.horizontal: true.once: true, если событие должно сработать единожды.QIntersection обеспечивает лёгкий и гибкий способ
интеграции наблюдения за видимостью элементов в Quasar-приложениях,
позволяя реализовывать ленивую загрузку, анимации и сбор аналитики без
прямого использования низкоуровневого Intersection Observer API.