Это мой первый проект, связанный с эффектами параллакса. Я пытался реализовать библиотеки параллакса, но они не работают должным образом на Mac Safari, прокрутка не гладкая. Поэтому я попытался реализовать пользовательский код, который я нашел в Google, и он работает лучше, чем библиотеки, но прокрутка по-прежнему не гладкая. Основной эффект прокрутки на Mac Safari.
Примечание: - Сайт выполнен на PHP, одностраничный сайт с параллаксом и анимацией (wow.js) при прокрутке страницы. На сайте большой контент, все изображения в тегах "section". Таким образом, на странице есть почти 10 различных тегов «section», содержащих ок. 10 изображений в теге "section". Размер страницы более 45 МБ (при воспроизведении 2 видео размером 22 МБ).
Пробное решение: - До этого все изображения были в формате PNG, затем я преобразовал их в формат JPG и также сжал их. Все изображения имеют более высокое разрешение, некоторые из них даже 2500 * 1800. Четыре разных изображения параллакса на разных «сечениях», одно изображение параллакса на одном «сечении».
Текущий скрипт Parallax, который я использую: -
var scrolled = $(window).scrollTop()
$('.parallax').each(function(index) {
var imageSrc = $(this).data('image-src')
var imageHeight = $(this).data('height')
$(this).css('background-image','url(' + imageSrc + ')')
$(this).css('height', imageHeight)
var initY = $(this).offset().top
var height = $(this).height()
var diff = scrolled - initY
var ratio = Math.round((diff / height) * 100)
$(this).css('background-position','center ' + parseInt(-(ratio * 1.5)) + 'px')
})
$(window).scroll(function() {
var scrolled = $(window).scrollTop();
$('.parallax').each(function(index, element) {
var initY = $(this).offset().top;
var height = $(this).height();
var endY = initY + $(this).height();
var visible = isInViewport(this);
if(visible) {
var diff = scrolled - initY;
var ratio = Math.round((diff / height) * 100);
$(this).css('background-position','center ' + parseInt(-(ratio * 1.5)) + 'px');
}
});
});
function isInViewport(node) {
var rect = node.getBoundingClientRect();
return (
(rect.height > 0 || rect.width > 0) &&
rect.bottom >= 0 &&
rect.right >= 0 &&
rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.left <= (window.innerWidth || document.documentElement.clientWidth)
);
}
Любой, пожалуйста, помогите!