Задать вопрос
@Mewinal

Как сделать чтоб условия не перезаписывались?

function shiftBackground(changes) {
        changes.forEach(el =>{
    
            const boxs = el[0];
            const pathImg = el[1];
            const pathImg_defalt = el[2];
            const _box = el[3];
    
            const back = document.getElementById('back');
            let scrollPosition = window.scrollY;
            let shift = 0;
        
            const _box_style = window.getComputedStyle(document.getElementById(_box), null);
            const _box_margins = parseFloat(_box_style.marginTop) + parseFloat(_box_style.marginBottom);
            const _box_hight = document.getElementById(_box).offsetHeight + _box_margins;
            
            boxs.forEach(box => {
                const style = window.getComputedStyle(document.getElementById(box), null);
                const margins = parseFloat(style.marginTop) + parseFloat(style.marginBottom);
                const hight = document.getElementById(box).offsetHeight;
                shift += hight + margins;
            });
            
            if(scrollPosition < shift){
                back.style.backgroundImage = `url(${pathImg_defalt})`;
            }
            if(scrollPosition >= shift && scrollPosition < shift + _box_hight){
                back.style.backgroundImage = `url(${pathImg})`;
            }
        })
    }
    window.addEventListener('scroll', () => {
        shiftBackground([[['header', 'main'], '/img/back/back_2.jpg', '/img/back/back.avif', 'about'],
                        [['header', 'main', 'scills_box', 'about'], '/img/back/back.jpg', '/img/back/back.avif', 'contacts']]);
    });
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
У вас же только один фон должен примениться по итогу, а вы в каждой итерации цикла там ещё и дефолтную картинку можете вставлять.
Ваш код (с минимальными измененями) должен выглядеть примерно так:
function shiftBackground(changes) {
    let img = '/img/back/back.avif';

    let scrollPosition = window.scrollY;

    changes.forEach(([boxs, pathImg, _box]) => {
        let shift = 0;

        const _box_style = window.getComputedStyle(document.getElementById(_box), null);
        const _box_margins = parseFloat(_box_style.marginTop) + parseFloat(_box_style.marginBottom);
        const _box_height = document.getElementById(_box).offsetHeight + _box_margins;

        boxs.forEach(box => {
            const style = window.getComputedStyle(document.getElementById(box), null);
            const margins = parseFloat(style.marginTop) + parseFloat(style.marginBottom);
            const height = document.getElementById(box).offsetHeight;
            shift += height + margins;
        });

        if (scrollPosition >= shift && scrollPosition < shift + _box_height) {
            img = pathImg;
        }
    })

    const back = document.getElementById('back');
    back.style.backgroundImage = `url(${img})`;
}

window.addEventListener('scroll', () => {
    shiftBackground(
        [
            [['header', 'main'], '/img/back/back_2.jpg', 'about'],
            [['header', 'main', 'scills_box', 'about'], '/img/back/back.jpg', 'contacts'],
        ]
    );
});


P.S. Но вообще, скорее всего, это можно переписать на использование Intersection Observer. И код проще будет и производительность выше. Ну и не придётся руками перечислять предыдущие блоки. Но не очень вообще понятна требуемая логика: почему, во втором случае появился какой-то scills_box между main и about...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы