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 icon font完全指南(CSS3 font 会取代icon图标)
Jan 06 HTML / CSS
css3教程之倾斜页面
Jan 27 HTML / CSS
使用CSS3的appearance属性改变元素的外观的方法
Dec 12 HTML / CSS
css3遮罩层镂空效果的多种实现方法
May 11 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
Jun 01 HTML / CSS
HTML高亮关键字的实现代码
Oct 22 HTML / CSS
突袭HTML5之Javascript API扩展3—本地存储全新体验
Jan 31 HTML / CSS
HTML5 创建canvas元素示例代码
Jun 04 HTML / CSS
Html5大文件断点续传实现方法
Dec 05 HTML / CSS
html5实现移动端适配完美写法
Nov 16 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
Feb 05 HTML / CSS
HTML5拖拽文件上传的示例代码
Mar 04 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
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
js验证密码强度解析
2020/03/18 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
Python找出9个连续的空闲端口
2016/02/01 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
python元组拆包实现方法
2021/02/28 Python
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
音乐专业自荐信
2014/02/07 职场文书
遗嘱继承公证书
2014/04/09 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL