专栏名称: tenor
目录
相关文章推荐
潇湘晨报  ·  麻六记紧急回应! ·  昨天  
新闻株洲  ·  3月1日起,领“红包”! ·  昨天  
湖南日报  ·  突发7.6级地震,震源深度10公里 ·  2 天前  
湖南日报  ·  张兰名下7家公司均已吊销或注销 ·  3 天前  
潇湘晨报  ·  被批吃软饭!具俊晔惊人资产公开 ·  3 天前  
51好读  ›  专栏  ›  tenor

H5 滚动穿透

tenor  · 掘金  ·  · 2019-05-10 10:55

正文

阅读 36

H5 滚动穿透

问题背景:

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

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

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

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

具体细节和实例可以参考: bulma.io/documentati…

问题详情:

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

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

表现:

  1. 在chrome浏览器中显示,整个modal-card占满整个屏幕
  2. 在手机端显示也是占满,但是问题是,根据手势移动,会将浏览器的搜索框部分往上顶,此时弹窗下面的数据列表页能够进行滑动,之后弹窗的标题覆盖浏览器原搜索框部分,但这之间有延迟,能清晰看到下面页面的数据
  3. 在其他手机上会有另外一种显示,如果滑动速度比较快,弹窗出现后立即滑动,就会看到在弹窗的底部就会出现一个小的空白,同样弹窗下面的页面能够滚动,并且有明显延迟和数据滚动显示。

解决方案:

modal-card 自身解决方案:

JS + CSS overflow:hidden

  1. 通过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');
}
复制代码

  1. 通过 overflow:hidden 来禁止页面的滚动
is-clipped {
    overflow:hidden!important
}
复制代码
  1. 当弹窗关闭时,通过JS删除掉页面的 css 类:is-clipped
function closeModals() {
    rootEl.classList.remove('is-clipped');
    $modals.forEach(function ($el) {
        $el.classList.remove('is-active');
    });
}
复制代码

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







请到「今天看啥」查看全文