Html5 滚动穿透的方法


Posted in HTML / CSS onMay 13, 2019

问题背景:

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

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

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

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

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

问题详情:

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

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

表现:

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

解决方案:

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

Html5 滚动穿透的方法 

通过 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');
    });
}

Html5 滚动穿透的方法

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

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;

Html5 滚动穿透的方法

关闭弹窗:

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 滚动穿透的方法

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

HTML / CSS 相关文章推荐
玩转CSS3色彩
Jan 16 HTML / CSS
用React加CSS3实现微信拆红包动画效果
Mar 13 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
May 07 HTML / CSS
CSS3 文字动画效果
Nov 12 HTML / CSS
HTML5混合开发二维码扫描以及调用本地摄像头
Dec 27 HTML / CSS
前端面试必备之html5的新特性
Sep 05 HTML / CSS
HTML5通用接口详解
Jun 12 HTML / CSS
详解html5 postMessage解决跨域通信的问题
Aug 17 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
Aug 17 HTML / CSS
canvas 绘图时位置偏离的问题解决
Sep 16 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
Dec 01 HTML / CSS
CSS SandBox应用场景及常见问题
Jun 25 HTML / CSS
JavaScript+Canvas实现自定义画板的示例代码
May 13 #HTML / CSS
使用html5实现表格实现标题合并的实例代码
May 13 #HTML / CSS
基于Html5实现的语音搜索功能
May 13 #HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
May 05 #HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
Apr 30 #HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
Apr 29 #HTML / CSS
浅谈HTML5新增和废弃的标签
Apr 28 #HTML / CSS
You might like
mysql5详细安装教程
2007/01/15 PHP
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP goto语句用法实例
2019/08/06 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
在校生党员自我评价
2013/09/25 职场文书
会计学应届毕业生推荐信
2013/11/04 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
网页美工求职信范文
2014/04/17 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
财务管理专业求职信
2014/06/11 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫