如何根据位置更改粘性向上箭头按钮的属性?

How to change the properties of a sticky up arrow button based on its position?

我的网页有一个向上的粘性箭头图像,如下所示:

HTML:

<a href = "#navbar-scroll"><img src = "images/sticky-btn-light.png" id = "myBtn" alt = "sticky-up-button"></a>

和CSS:

#myBtn {
    visibility: hidden;
    position: fixed;
    bottom: 50px; 
    right: 30px; 
    z-index: 99; 
    cursor: pointer;
    padding: 15px; 
    border-radius: 10px;
    width: 5%;
    opacity: 0.5 ;
}

根据这段JS代码,当用户向下滚动时按钮消失,当用户向上滚动时出现。

window.onscroll = function(e) {
    console.log(this.oldScroll > this.scrollY);
    if((this.scrollY == 0) || (this.oldScroll < this.scrollY)  ){
        document.getElementById('myBtn').style.visibility = 'hidden';
    }
    else if(this.oldScroll > this.scrollY){
        document.getElementById('myBtn').style.visibility = 'visible';
    }
    this.oldScroll = this.scrollY;
}

现在,我想根据按钮在屏幕上不断变化的位置来更改按钮的颜色。当我滚动页面时,粘滞按钮将位于不同的部分,如下所示。 如果粘滞按钮在 A 部分,它应该是红色的。如果它在 B 部分,它应该是蓝色的。 请注意,移动的是页面,而不是按钮。按钮处于固定位置。

为此,我需要粘性按钮在任何给定时刻重叠的部分的 ID。有什么方法可以通过 JavaScript 获取该信息吗?

PS: 我已经调整了细节,使事情更清楚。这是正在移动的页面。因此,如果我将 Element.getBoundingClientRect() 用于 #myBtn,我是否会在页面上的任何位置滚动时获得该元素的相同 top/y 值?

您可以使用 getBoundingClientRect() 方法获取 html 元素的坐标,调用此函数您将获得元素(像素)的 Y 坐标,然后您可以使用 if 条件

function getCoords(elem) {
  let box = elem.getBoundingClientRect();
  let body = document.body;
  let docEl = document.documentElement;
  let scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
  let clientTop = docEl.clientTop || body.clientTop || 0;
  return Math.round(box.top +  scrollTop - clientTop);
}

if(getCoords(elem) > 100){
    elem.className = 'your_class_name'
}

.your_class_name{
            color: red;
        }

您可以使用 element.getBoundingClientRect() 获取元素左上角的 x,y 和右下角的 x,y。

var arrow     = document.getElementById('myBtn');
var arrowRect = arrow.getBoundingClientRect();
console.log(arrowRect.top, arrowRect.right, arrowRect.bottom, arrowRect.left);

var section     = document.getElementById('section1');
var sectionRect = section.getBoundingClientRect();
console.log(sectionRect.top, sectionRect.right, sectionRect.bottom, sectionRect.left);

然后你可以检查箭头和截面的碰撞。在您的情况下,x 轴无关紧要:

// This checks if the arrow is touching the section
( arrowRect.bottom > sectionRect.top && arrowRect.top < sectionRect.bottom  )

// This checks if the arrow isn't touching the section, then inverts it (faster)
!( arrowRect.bottom < sectionRect.top || arrowRect.top > sectionRect.bottom )

这里我做了一个例子,供大家测试实现。

即使位置固定

,这也有助于理解getBoundingClientRect

var arrow= document.getElementById('myBtn');
window.onscroll = function(e) {
    var arrowBound = arrow.getBoundingClientRect();
    var divs = document.querySelectorAll(".container > div");
    divs.forEach(function(item){
      var divBound = item.getBoundingClientRect();
      var color= item.getAttribute("arrowColor");
      if ( arrowBound.bottom > divBound.top && arrowBound.top < divBound.bottom  )
      {
        arrow.style.borderTopColor  = color
      }
    })
}
#myBtn {
    position: fixed;
    top: 10px; 
    left:270px;
    z-index: 99; 
    cursor: pointer;
  width: 0; 
  height: 0; 
  border-left: 20px solid transparent;
  border-right: 20px solid transparent;
  
  border-top: 20px solid #f00;
}

.container{
width:300px;
height:800px;
  z-index: 81;
}

.container > div {
width:300px;
height:100px;
border:1px solid black;
}
<div class="container">
<a  id = "myBtn" href = "#navbar-scroll"></a>

<div arrowColor="red"> box red </div>

<div arrowColor="blue"> box blue </div>


<div arrowColor="green"> box green </div>
</div>