javascript - 为什么我的函数在工作和 JavaScript 之间交替

标签 javascript html arrays

这是我在这里提出的第一个问题,所以如果我没有遵循正确的指导方针,我提前道歉。

基本上我想做的是在 Javascript 中手动编写侧边导航代码。导航本身工作得很好,可以向左或向右单击,各个部分将在轮播中左右无限滚动。但是,当用户离开该部分后,当我尝试将前面的页面 scrollTop 设置回 0 时,我遇到了问题。

如果我滚动浏览每个部分并在每个部分上向下滚动一点,当我返回第一页并再次循环浏览它们时,它们似乎会交替显示其 scrollTop 是否为实际上设置为0

HTML 正文:

<div class="Arrow" id="arrowLeft"></div>
<div class="Arrow" id="arrowRight"></div>
<section class="Page" id="page1"><div class="PageContent"></div></section>
<section class="Page" id="page2"><div class="PageContent"></div></section>
<section class="Page" id="page3"><div class="PageContent"></div></section>
<section class="Page" id="page4"><div class="PageContent"></div></section>
<section class="Page" id="page5"><div class="PageContent"></div></section>
<section class="Page" id="page6"><div class="PageContent"></div></section>
<section class="Page" id="page7"><div class="PageContent"></div></section>
<section class="Page" id="page8"><div class="PageContent"></div></section>
<script src="JavaScript/scroller.js"></script>

Javascript:

//initialising variables and populating arrays
var currentPage = 0;
var previousPage = 0;
var pages = document.getElementsByClassName("Page");
var sections = [];
for (i=0;i<pages.length;i++) {
    sections.push(pages[i]);
}
var pageOffSets = [0, 100, 200, 300, 400, -300, -200, -100];
var zOffSets = [0,-1,-2,-3,-4,-3,-2,-1];
for (i = 0;i<sections.length;i++) {
    sections[i].style.left = pageOffSets[i] + "vw";
    sections[i].style.zIndex = zOffSets[i];
}


//Navigate function
function slidePage(direction) {
        previousPage = currentPage;
    if (direction=="right") {
        currentPage+=1;
        if (currentPage>7) {
            currentPage = 0;
        }
        var hold = sections.shift();
        sections.push(hold);

         for (i=0;i<sections.length;i++) {
            sections[i].style.left = pageOffSets[i] + "vw";
            sections[i].style.zIndex = zOffSets[i];
        }
    }

    if (direction=="left") {
        currentPage-=1;
        if (currentPage<0) {
            currentPage = 7;
        }
        var hold = sections.pop();
        sections.unshift(hold);

         for (i=0;i<sections.length;i++) {
            sections[i].style.left = pageOffSets[i] + "vw";
            sections[i].style.zIndex = zOffSets[i];
        }
    }

    //!!!
    //This is the part that is supposed to set the scrollTop back to 0
    //!!!
    setTimeout(function(){
        sections[previousPage].scrollTop = 0;
    }, 1000);
}


//Event listeners for when the user clicks
document.getElementById("arrowLeft").addEventListener("click", function(){
    slidePage("left");
});
document.getElementById("arrowRight").addEventListener("click", function(){
    slidePage("right");
});

如果有人能指出我做错了什么,我将不胜感激。

编辑: 如果您需要的话,这是 CSS:

body {
  overflow-x: hidden;
  overflow-y: scroll;
}

section {
  width: 100vw;
  height: 100vh;
  position: fixed;
  -webkit-transition-duration: 0.4s;
          transition-duration: 0.4s;
  overflow: scroll;
}

.Arrow {
  position: absolute;
  z-index: 1;
  width: 50px;
  height: 50px;
  background-color: black;
  top: 48%;
}

.Arrow:hover {
  cursor: pointer;
}

#arrowRight {
  right: 0;
}

#page1 {
  background-color: #c81996;
}

#page2 {
  background-color: #64324b;
}

#page3 {
  background-color: #1996c8;
}

#page4 {
  background-color: #324b64;
}

#page5 {
  background-color: #96c819;
}

#page6 {
  background-color: #4b6432;
}

#page7 {
  background-color: #f0fa1e;
}

#page8 {
  background-color: #fa1ef0;
}

.PageContent {
  height: 8000px;
  width: 90vw;
  margin: 5vw;
  background-image: -webkit-gradient(linear, left top, left bottom, from(red), to(yellow));
  background-image: linear-gradient(red, yellow);
  position: absolute;
}

最佳答案

有两个问题:

  1. 您正在轮换 sections函数内的数组,因此 previousPage一旦您的匿名函数被触发,索引就不再正确。

  2. previousPage设置scrollTop时引用的变量超时后可以在超时结束之前更改。

最简单的解决方法是旋转 pageOffSetszOffSets数组代替:

if (direction == "right") {

    currentPage++;

    if (currentPage >= sections.length) {
        currentPage = 0;
    }

    // rotate pageOffsets    
    {
        var x = pageOffSets.pop();
        pageOffSets.unshift(x);
    }

    // rotate zOffsets
    {
        var x = zOffSets.pop();
        zOffSets.unshift(x);
    }

     for (i=0;i<sections.length;i++) {
        sections[i].style.left = pageOffSets[i] + "vw";
        sections[i].style.zIndex = zOffSets[i];
    }

} else {

    currentPage--;

    if (currentPage < 0) {
        currentPage = sections.length - 1;
    }

    // rotate pageOffsets    
    {
        var x = pageOffSets.shift();
        pageOffSets.push(x);
    }

    // rotate zOffSets    
    {
        var x = zOffSets.shift();
        zOffSets.push(x);
    }  

     for (i=0;i<sections.length;i++) {
        sections[i].style.left = pageOffSets[i] + "vw";
        sections[i].style.zIndex = zOffSets[i];
    }
}

您需要捕获 previousPage 的副本变量:

// capture a copy of the index so that it doesn't change
var prev = previousPage;

setTimeout(function() {
    sections[prev].scrollTop = 0;
}, 500);

关于javascript - 为什么我的函数在工作和 JavaScript 之间交替,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58692996/

相关文章:

php - in_array 在应该返回 true 时返回 false

C 传递数组的大小

javascript - 与标题进行分组/求和

javascript - JS/JQUERY - 单击每个产品购买按钮时显示模式

javascript - For循环条件问题

javascript - CSS Scale and Transform 导致重叠

Javascript Toggle 类有效但类在下拉列表中的元素中无效

html - 输入数字最大属性调整字段大小

javascript - SO是如何动态获取它的Tag的呢?

javascript - 在 promise 中有多个异步等待