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 media 响应式布局的简单实例
Aug 03 HTML / CSS
CSS3 animation实现简易幻灯片轮播特效
Sep 27 HTML / CSS
Html5画布_动力节点Java学院整理
Jul 13 HTML / CSS
HTML5边玩边学(1)画布实现方法
Sep 21 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
Jan 30 HTML / CSS
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
Jan 31 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
Sep 11 HTML / CSS
深入浅析HTML5中的SVG
Nov 27 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
Mar 13 HTML / CSS
Html5之自定义属性(data-,dataset)
Nov 19 HTML / CSS
AmazeUI 折叠面板的实现代码
Aug 17 HTML / CSS
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
Jul 16 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脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
pjblog中的UBBCode.js
2007/04/25 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
python同时给两个收件人发送邮件的方法
2015/04/30 Python
python实现自动更换ip的方法
2015/05/05 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
计算机专业求职信
2014/06/02 职场文书
班级口号大全
2014/06/09 职场文书
好的促销活动方案
2014/08/21 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
JavaScript 数组去重详解
2021/09/15 Javascript