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 相关文章推荐
CSS中一些@规则的用法小结
Mar 09 HTML / CSS
灵活运用CSS3特性绘制简易版围棋效果
Sep 28 HTML / CSS
深入CSS3 动画效果的总结详解
May 09 HTML / CSS
使用css3实现超炫的loading加载动画效果
May 07 HTML / CSS
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
Nov 16 HTML / CSS
css3实现书本翻页效果的示例代码
Mar 08 HTML / CSS
HTML5的结构和语义(4):语义性的内联元素
Oct 17 HTML / CSS
HTML5上传文件显示进度的实现代码
Aug 30 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
Jan 30 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
Apr 08 HTML / CSS
video.js支持m3u8格式直播的实现示例
May 20 HTML / CSS
Html5获取用户当前位置的几种方式
Jan 18 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
python网络编程之文件下载实例分析
2015/05/20 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
详解python里的命名规范
2018/07/16 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
工程安全员岗位职责
2014/03/09 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
地震慰问信
2015/02/14 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
小学运动会报道稿
2015/07/22 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL