Javascript 使屏幕不透明度在滚动顶部为0.1,但在底部为0.95,并根据当前滚动位置计算两者之间的所有内容

Javascript 使屏幕不透明度在滚动顶部为0.1,但在底部为0.95,并根据当前滚动位置计算两者之间的所有内容,javascript,css,reactjs,math,Javascript,Css,Reactjs,Math,我知道这可能更像是一个数学问题,而不是一个编程问题,但值得在这里试试我的运气:我有一个应用程序,它的屏幕不透明度的一部分取决于滚动的位置 向下滚动越远,不透明度越大。起点(在scrollTop0)是将不透明度设置为0.1,当在页面底部时,我们希望不透明度设置为0.95,中间有一个连续的滚动 目前,我使用以下公式: const calculateOpacityOnScroll = (evt) => { const { scrollHeight, scrollTop, clientHeig

我知道这可能更像是一个数学问题,而不是一个编程问题,但值得在这里试试我的运气:我有一个应用程序,它的屏幕不透明度的一部分取决于滚动的位置

向下滚动越远,不透明度越大。起点(在
scrollTop
0)是将不透明度设置为0.1,当在页面底部时,我们希望不透明度设置为0.95,中间有一个连续的滚动

目前,我使用以下公式:

const calculateOpacityOnScroll = (evt) => {
  const { scrollHeight, scrollTop, clientHeight } = evt.target;
  const opacityValue = (0.95*clientHeight)/(scrollHeight - scrollTop);
  setOpacity(opacityValue);
};
这很好,但是如果我回到顶部,不透明度将不会达到所需的0.1

我还知道,如果
scrollTop
为0,则可以简单地手动将其设置为0.1,例如:

const calculateOpacityOnScroll = (evt) => {
  const { scrollHeight, scrollTop, clientHeight } = evt.target;
  const opacityValue = (0.95*clientHeight)/(scrollHeight - scrollTop);
  if (scrollTop) {
    setOpacity(opacityValue);
  } else {
    setOpacity(0.1)
  }
};
然而,这消除了过渡的平滑性,因此我希望避免它

那么,在这种情况下,计算不透明度的正确方法是什么,滚动顶部设置为0.1,底部设置为0.95

以下是一个示例应用程序,我目前已将所有内容按预期运行:

const-App=()=>{
const[opacity,setOpacity]=React.useState(0.1);
const[params,setParams]=React.useState({})
常量CalculatePocityOnScroll=(evt)=>{
const{scrollHeight,scrollTop,clientHeight}=evt.target;
常数opacityValue=(0.95*clientHeight)/(scrollHeight-scrollTop);
设置不透明度(不透明值);
setParams({scrollHeight,scrollTop,clientHeight})
};
const incorrectMessage=opacity!==0.1&¶ms.scrollTop==0
?这是不正确的!在顶部,它必须是0.1!
:null
返回(
样品
不透明度:{Opacity}{incorrectMessage}
scrollTop:{params.scrollTop | | 0}
scrollHeight:{params.scrollHeight | |'?'}
clientHeight:{params.clientHeight | |'?'}
滚动这里!

知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,如果你不自以为是,就必须为自己的行为负责。

这是一种很好的治疗方法,它可以治疗多种疾病,如:癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症,癌症等阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿勒苏阿在欧洲,狮子座或虎鲸的发酵液中有一种猫科动物的权杖。在欧洲,奥纳雷·马萨·埃吉斯塔斯·普鲁斯·维韦拉·阿利克特·威尼纳提斯·卡斯特·埃吉斯·埃吉斯·埃吉斯特·阿利克特·阿利克特。在狮子座或虎鲸门的发酵液中有一种猫科动物的权杖。在发酵液中有一种常见的精英存在于无生命中。

) } ReactDOM.render( , document.getElementById('app') );
.params{
位置:固定;
排名:0;
左:250px;
}
.样品{
宽度:100px;
高度:100px;
}
.内容{
边框:实心1px红色;
z指数:200;
宽度:200px;
高度:300px;
溢出:滚动;
}

我要做的第一件事是将不透明度从0缩放到1,然后我可以找出如何将范围从0.1调整到0.95

scrollHeight
clientHeight
是固定值,而
scrollTop
会发生变化。我看到:

scrollHeight: 1155
clientHeight: 283
scrollTop: from 0 to 872
请注意
scrollTop
的最大值为872。这是
scrollHeight
clientHeight
之间的差异(1155-283=872)

现在我们可以根据
scrollTop
位于0和
scrollHeight-clientHeight
之间的位置,从0到1进行计算

const opacityValue = scrollTop / (scrollHeight - clientHeight);
接下来我们需要将其从0.1调整到0.95。价差是0.85,所以我们可以乘以0.85,然后再加上0.1

const opacityValue = 0.1 + (0.85 * scrollTop) / (scrollHeight - clientHeight);

下面是修改后的演示:

const-App=()=>{
const[opacity,setOpacity]=React.useState(0.1);
const[params,setParams]=React.useState({})
常量CalculatePocityOnScroll=(evt)=>{
const{scrollHeight,scrollTop,clientHeight}=evt.target;
常数opacityValue=0.1+(0.85*scrollTop)/(scrollHeight-clientHeight);
设置不透明度(不透明值);
setParams({scrollHeight,scrollTop,clientHeight})
};
const incorrectMessage=opacity!==0.1&¶ms.scrollTop==0
?这是不正确的!在顶部,它必须是0.1!
:null
返回(
样品
不透明度:{Opacity}{incorrectMessage}
scrollTop:{params.scrollTop | | 0}
scrollHeight:{params.scrollHeight | |'?'}
clientHeight:{params.clientHeight | |'?'}
滚动这里!

知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,如果你不自以为是,就必须为自己的行为负责。