Параллакс-слой
useParallaxLayer(target, options) — готовый примитив «слой со своей скоростью скролла»: переводит viewportProgress элемента в CSS-смещение, учитывая prefers-reduced-motion.
function useParallaxLayer(
target: MaybeRefOrGetter<HTMLElement | null | undefined>,
options: UseParallaxLayerOptions,
): UseParallaxLayerReturnВ отличие от трёх остальных composables, этот — не прямая обёртка над движком ядра: он построен на выходе useElementViewport(), со своей логикой преобразования поверх.
Опции
speed
number · по умолчанию: — (обязательный параметр)
Относительная скорость: 1 двигается вместе со скроллом, >1 — быстрее, <1 — медленнее, отрицательное значение разворачивает направление.
axis
'x' | 'y' · по умолчанию: 'y'
clamp
boolean · по умолчанию: false
Ограничить смещение на краях прогресса 0/1 вместо экстраполяции за них.
easing
Easing ((t: number) => number) · по умолчанию: —
Применяется к viewportProgress перед преобразованием в смещение в пикселях — см. Утилиты — там готовые пресеты.
range
number · по умолчанию: 100
Амплитуда смещения в пикселях при speed: 1.
Возвращаемое значение
style
ComputedRef<{ transform: string }>
Всегда { transform: 'none' }, когда prefersReducedMotion() вернул true. Иначе: amplitude = range * speed, (опционально сглаженный) прогресс преобразуется из [0, 1] в [amplitude, -amplitude] (с учётом clamp), и результат становится translateY(...) или translateX(...) в зависимости от axis.
progress
Ref<number>
Сглаженный viewportProgress (равен самому viewportProgress, если easing не задан) — значение прямо перед тем, как оно превращается в смещение в пикселях, на случай если оно нужно напрямую.
Пример:
<script setup lang="ts">
import { ref } from 'vue'
import { useParallaxLayer } from '@macrulez/inview-vue'
import { easings } from '@macrulez/inview-core'
const layer = ref<HTMLElement | null>(null)
const { style } = useParallaxLayer(layer, {
speed: 0.5,
easing: easings.easeOutCubic,
clamp: true,
})
</script>
<template>
<div ref="layer" :style="style">...</div>
</template>