React-视窗滚动改变DOM

一开始我想实现一个办法
就是在滑鼠滚动到指定位置时
我指定的区块会浮现出来
滑鼠往上滚时,区块会一起消失

於是此处是一开始的程序

const About=document.getElementsByClassName('about')[0];
const [scroll,setScroll]=useState(
  document.body.offsetTop>About.offsetTop?true:false
);

window.onscroll=()=>{			
  setScroll(
  document.body.offsetTop>About.offsetTop?true:false
);

const scrollFade={opacity:scroll?'1':'0',paddingTop:scroll?'100px':'300px'};

想当然尔
开始出现报错

TypeError: Cannot read properties of undefined (reading 'offsetTop')

(因为我还是个react小白...这边我还是不知道为什麽会报错)

甚至是以为前面的document.body.offsetTop有问题
改为window.scrollY
(後来测试是两种方法都可以用)

於是我把这段的逻辑改成false

const [scroll,setScroll]=useState(false);

让网页一开始读取时
区块是隐藏的
一开始的想法逻辑是
不管我在网页何处重新读取
都会先经过useState的三元判断式先判断
来达成区块是否隐藏的目的
但改为false因为後面的状态改变
一样有达到同样的目的

再来是第二段window.onscroll碰到的问题
在这边我忘了这个方法重复使用的话
前面使用的方法会被覆盖过去
於是後来使用addEventLisener
後来完整的写法为

const [scroll,setScroll]=useState(false);

window.addEventListener('scroll',()=>{
  const About=document.getElementsByClassName('about')[0];
  setScroll(
  window.scrollY>About.getBoundingClientRect().top?true:false
  ); 
});

这边为什麽会使用getBoundingClientRect()这个方法呢?
是因为发现offsetTop会比getBoundingClientRect().top
感应到的距离来的更远
offsetTop必须在指定目标过了视窗才会感应
於是选择使用getBoundingClientRect().top这个方法
更能贴近我所想要的效果


<<:  2021/11/28更新

>>:  【Vue】帮元件加上样式啦|修改 bootstrap 变数供全域样式共用 失败

【HTML】为何用<p>包<div>会出错?

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...

[Day - 11] - Spring 注入式之Resource原理与开发

Abstract 在第八天我们已得知既有的Autowird与Qualifier等常用的注入方式,今天...

radio vs checkbox

延续昨天的v-model绑定,昨天我们知道他可以绑定input, textarea和select e...

D15. 学习基础C、C++语言

D15. 字元阵列(2) 前一篇有讲到字元的输出是printf("%c",a[i...

Re: 新手让网页 act 起来: Day10 - React Hooks 之 useState (1)

前言 React hooks 是在 React 16.8 版本才加进来的功能。那到底什麽是 Hook...