react中实现滚动到指定位置固定显示导航栏,反之浸入背景

摘要:
{//定义handleScroll事件函数letheader=document.getElementById('header');向定义的变量添加新样式“nav-header-change”header.classList.add('nav-headerchange');

  需求描述

  当导航栏置顶时,导航栏沉浸在背景图里;当鼠标滑动滚轮到一定位置时,显示导航栏

  用原生JS实现

  window添加scroll滚动事件并执行对应方法,这里执行方法为handleScroll

  react中实现滚动到指定位置固定显示导航栏,反之浸入背景第1张

  react中实现

  react中如果要使用上面的代码,需要使用生命周期函数componentDidMount添加scroll滚动事件

  react中实现滚动到指定位置固定显示导航栏,反之浸入背景第2张

    注:componentDidMount周期函数是在页面加载完,DOM都生成后执行

  定义handleScroll()
//定义handleScroll事件函数
    handleScroll = (e) => {
        //定义handleScroll事件函数
        let header = document.getElementById('header');
        let footerfreeclass = document.getElementById('FooterFreeClass');
        if (window.pageYOffset >= 600) { //if语句判断window页面Y方向的位移是否大于或者400px
            //当Y方向位移大于400px时,定义的变量增加一个新的样式'nav-header-change'
            header.classList.add('nav-header-change');
            footerfreeclass.classList.add('footer-freeclass-block');
        }
        if (window.pageYOffset >= 6000 || window.pageYOffset === 0) {
            //否则就移除样式
            header.classList.remove('nav-header-change');
            footerfreeclass.classList.remove('footer-freeclass-block');
        }
    }

   上面代码一般没什么问题,但偶然发现在mac某些尺寸下会失效,经测试,

   在分辨率为宽1792 高1120及以下尺寸就会失效,即滚动后无法显示要展示的内容

  所以用下面改良后的方法更稳妥

handleScroll(e) {
        //定义handleScroll事件函数
        let header = document.getElementById('header');
        let footerfreeclass = document.getElementById('FooterFreeClass');
       
        let wholeScrollHeight = document.documentElement.scrollHeight, // 能够滚动的总高度
            visiableHeight = document.documentElement.clientHeight, // 可视区域高度
            currentOffset = document.documentElement.scrollTop; // 滚动的距离
        if (currentOffset > 200) {
            header.classList.add('nav-header-change');
        } else {
            header.classList.remove('nav-header-change');
        }
        if (footerfreeclass !== undefined && footerfreeclass !== null) {
            if (currentOffset > 200 && wholeScrollHeight - currentOffset - visiableHeight > 400) {
                footerfreeclass.classList.add('footer-freeclass-block');
            } else {
                footerfreeclass.classList.remove('footer-freeclass-block');
            }
        }

    }

   注意事项

   1. PC上为了兼容性,获取滚动距离的2种方式都要写,document.documentElement.scrollTop || document.body.scrollTop;

   2. 移动端获取滚动的距离要用document.body.scrollTop,document.documentElement.scrollTop不起作用

   参考原文

  

免责声明:文章转载自《react中实现滚动到指定位置固定显示导航栏,反之浸入背景》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇64位Windows操作系统中的注冊表DIV居中问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[LINUX-04]linux进程、调度、线程、进程上下文等几点理解

1、信号来自进程或内核2、线程共享进程的代码空间和数据空间(全局变量或静态变量),文件描述符,信号,以及malloc分配的内存,每个线程拥有独立的栈空间和程序计数器,在创建线程时,调用pthread_create函数的线程和新建线程的执行顺序随机 3、在linux中,使用轻量级进程来模拟线程,线程操作的相关函数通过第三方线程库 (Linuxthreads...

__attribute__的一些相关属性

__attribute__((format()))  这个format有3个参数。 int my(NSString *str,NSString *str1,NSArray*str2,...) __attribute__((format(__NSString__,2,4)));   三个参数告诉编译器,第二个参数必须是NSString类型,且可变参数从第4位...

Python——常用模块

模块,就是一堆实现了某个功能的代码的集合。 一、time & datetime time.time() 返回当前时间的时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。 1473344512.2949986 time.sleep(秒数) 使用该方法可以让程序休眠n秒,n可以是小数。 time.clock() 计算CPU...

Highcharts制作图片表设置线条颜色和粗细

Chart:图表区选项 Chart图表区选项用于设置图表区相关属性。 参数 描述 默认值 backgroundColor 设置图表区背景色 #FFFFFF borderWidth 设置图表边框宽度 0 borderRadius 设置图表边框圆角角度 5 renderTo 图表放置的容器,一般在html中放置一个DIV,获取DIV的id属...

bootstrap-switch使用,small、mini设置

1.首先需要引用https://www.bootcss.com/p/bootstrap-switch/。 bootstrap-switch插件库 2.先引用jquery文件,在引用bootstrap.css样式 、bootstrap-switch.css样式  、bootstrap-switch.js样式 3.代码编码单选控件    <input n...

MFC中Carray的使用

CArray   需要包含的头文件 <afxtempl.h>   CArray类支持与C arrays相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。   和C arrays一样,CArray索引元素的访问时间是不变的,与数组大...