ITPub博客

首页 > 应用开发 > Html/css > 好程序员web前端学习路线分享滚动穿透方法

好程序员web前端学习路线分享滚动穿透方法

原创 Html/css 作者:好程序员IT 时间:2019-09-03 17:03:09 0 删除 编辑

   好程序员web 前端学习路线分享 滚动穿透方法 , 这篇文章主要介绍Html5 滚动穿透的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着一起学习学习吧。

   网站需要在移动端完成适配, 针对移动端 H5 以及 web 端采用的都是 bluma 这种 flex 布局解决方案

   在H5 中使用的列表采用的是 react-virtualized 来绘制表格

   为了展示表格中单行数据的具体详情,通常的解决方案是采用新页面或者是弹窗来完成。

   这里采用的是弹窗的方案,点击单行数据后的数据详情用的是bluma 的 modal-card 。

   在点击单行数据后,弹窗显示详情数据,整个modal-card 设置成 position:fixed;

   没有footer 部分,设置 modal-card 的高度为整个屏幕的高度 : 100vh

   表现:

 

  1 、 在chrome 浏览器中显示,整个 modal-card 占满整个屏幕

  2 、 在手机端显示也是占满,但是问题是,根据手势移动,会将浏览器的搜索框部分往上顶,此时弹窗下面的数据列表页能够进行滑动,之后弹窗的标题覆盖浏览器原搜索框部分,但这之间有延迟,能清晰看到下面页面的数据

  3 、 在其他手 - 机上会有另外一种显示,如果滑动速度比较快,弹窗出现后立即滑动,就会看到在弹窗的底部就会出现一个小的空白,同样弹窗下面的页面能够滚动,并且有明显延迟和数据滚动显示。

   解决方案:

  modal-card 自身解决方案:

JS + CSS overflow:hidden

通过JS动态给弹窗下面的页面html添加css类

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

if ($modalButtons.length > 0) {

    $modalButtons.forEach(function ($el) {

        $el.addEventListener('click', function () {

        var target = $el.dataset.target;

        openModal(target);

        });

    });

}

 

function openModal(target) {

    var $target = document.getElementById(target);

    rootEl.classList.add('is-clipped');

    $target.classList.add('is-active');

}

 

通过 overflow:hidden 来禁止页面的滚动

1

2

3

is-clipped {

    overflow:hidden!important

}

当弹窗关闭时,通过JS删除掉页面的 css 类:is-clipped

1

2

3

4

5

6

function closeModals() {

    rootEl.classList.remove('is-clipped');

    $modals.forEach(function ($el) {

        $el.classList.remove('is-active');

    });

}

 

但是这种方案在应用中测试过后,发现并不能解决问题,上面的问题还是出现

position:fixed 方案

JS + CSS Position:fixed + scrollTop

方案思路:

1.  弹窗时,将html的position 设置为 fixed,将弹窗关闭后,将html的postion 属性取消。

2.  因为列表页会出现滚动的情况,而点击的行有可能是在滚动发生后,所以需要计算html页面本身的scrollTop 值。

3.  因为弹窗时设置position为fixed后,html页面的 scrollTop 值会变成0,会回到页面顶部,所以在关闭弹窗后,需要手动设置html页面的scrollTop 值,让其滚动到html页面原来的位置。

4.  对于兼容性,需要设置不同属性的 scrollTop 值

弹窗之前:

1

2

3

const scrollTop = global.document.documentElement.scrollTop || global.pageYOffset || global.document.body.scrollTop;

global.document.documentElement.style.position = 'fixed';

this.scrollTop = scrollTop;

 

关闭弹窗:

1

2

3

4

5

6

7

8

closeModalHandler = () => {

    const { closeOrderHistoryModal } = this.props;

    global.document.documentElement.style.position = '';

    global.pageYOffset = this.scrollTop;

    global.document.documentElement.scrollTop = this.scrollTop;

    global.document.body.scrollTop = this.scrollTop;

    closeOrderHistoryModal();

}

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913892/viewspace-2655880/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
欢迎关注公众号:好程序员特训营 web前端教程分享 723729549 大数据教程分享 703503210

注册时间:2019-03-20

  • 博文量
    539
  • 访问量
    410788