• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Html5 滚动穿透的方法

    问题背景:

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

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

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

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

    具体细节和实例可以参考:https://bulma.io/documentation/components/modal/

    问题详情:

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

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

    表现:

    解决方案:

     modal-card 自身解决方案:

    JS + CSS overflow:hidden

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

    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 来禁止页面的滚动

    is-clipped {
        overflow:hidden!important
    }

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

    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 值

    弹窗之前:

    const scrollTop = global.document.documentElement.scrollTop || global.pageYOffset || global.document.body.scrollTop;
    global.document.documentElement.style.position = 'fixed';
    this.scrollTop = scrollTop;

    关闭弹窗:

    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();
    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    上一篇:前端实现打印图像功能
    下一篇:HTML5新增form控件和表单属性实例代码详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    Html5 滚动穿透的方法 Html5,滚动,穿透,的,方法,