苹果手机对网页上样式为position:fixed的弹窗支持不好的解决办法
在Web页面上,如果想模拟对话框效果,一般会给div元素添加position:fixed的样式来实现,然后给背景添加一个半透明的遮罩。如:
.fixedDiv {
position: fixed;
top:;
right:;
left:;
margin: 0 auto;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.6);
z-index:;
}
.fixedDiv .fixedContent {
max-width: 26.5rem;
width: 85%;
background-color: #fff;
color: #333;
transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
position: absolute;
top: 50%;
left: 50%;
border-radius: 4px;
overflow: hidden;
}
HTML代码:
<div class="fixedDiv">
<div class="fixedContent"></div>
</div>
这种结构在大部分浏览器和移动设备上显示都没有问题,但是在苹果手机(safari mobile)上,当底部的键盘或者选择器(日期选择,下拉列表选择等)出现时,会将position:fixed的元素的初始位置改变,当键盘和选择器被关掉后,弹窗上原有的按钮和文本框无法被点中。
一个比较好的解决办法是尽量不用position:fixed的样式来定义对话框。但是这样一来就要求对话框的html代码在body中出现的位置不能随意。你可以使用position:absolute样式来定义对话框,但是position:relative的元素出现的位置决定了对话框在页面中的绝对位置。这显示很不灵活。
另外我也尝试过在网上去搜索一些其它的解决办法,但都不是特别有效。例如:https://dansajin.com/2012/12/07/fix-position-fixed/ 这篇文章介绍的方法就是给input元素添加focus和blur事件,在这两个事件中来切换对话框的样式,从而规避position:fixed样式所带来的问题。
还有一个办法是给body添加position:fixed样式,我试了一下好像并没有什么效果。
然后回到第一种解决方法,能不能使用position:absolute,然后通过其它样式来指定相对于哪个元素进行绝对定位呢?我查找了一下,貌似还真有这个提案,不过也仅仅只是提案,并没有被W3C广泛采纳,至少市面上绝大部分浏览器是不支持的。这里是一些相关介绍:
https://developer.mozilla.org/en-US/docs/Web/CSS/element
通过仔细观察,其实每次当对话框中的input(或者其它输入控件如select,textarea等)失去焦点后,手动上下滑动一下屏幕,然后再点击其它的控件,就没有问题。那么我们能够通过代码来模拟这一操作呢?答案是肯定的!
$("div.sqDetail").on('blur', 'input,select,textarea', function () {
setTimeout(function () {
// 当失去焦点的时候让滚动条滚动1次,
// 这个是为了兼容'position:fixed'样式在ios上的问题
window.scroll(0, $(window).scrollTop() + 1);
}, 50);
});
上面这段代码选择"div.sqDetail"元素里面的所有input,select和textarea,并添加blur事件,当失去焦点时,将页面滚动条滚动一下。随后我在iPhone上试了一下,发现有效果,再也不会为点不中弹框里的按钮和文本框而烦恼了!
苹果手机对网页上样式为position:fixed的弹窗支持不好的解决办法的更多相关文章
- IOS系统对fixed定位支持不好的解决方法
问题: IOS 中所有浏览器,当页面上的输入框获得焦点时,呼出键盘. 页面底部的导航栏(position:fixed)会被键盘顶到页面的中间. 而当输入框失去焦点时,导航栏停留在页面中间,造成页面错乱 ...
- 新手使用mac上的textedit写HTML时遇到的问题及解决办法
刚开始在mac上学习HTML,总结一下遇到的问题和解决办法 问题:使用textedit编写html,在网页上却仍然显示的是代码. 解决办法: 打开textedit后打开文本编辑 选择偏好设置 按如图所 ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 解决办法
最近在用Python处理中文字符串时,报出了如下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ...
- asp.net mvc 部署在IIS7.5上出现的[没有相关的源行]错误的解决办法
今天在IIS7.5上部署一个MVC小项目的时候出现以下错误:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET File ...
- 微信小程序上传后发布或者体验版测试无数据解决办法
在做微信小程序开发的过程中,发现小程序在本地调用接口的数据都显示,但是上传之后,发现手机体验没有数据.以下为解决办法: 1.先清除缓存试试. 2.打开微信小程序工具右上角的详情——项目设置,将“不校验 ...
- jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于<ajaxfileupload.js系列>的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏 ...
- 在安卓上,微信公众号无法分享到QQ的解决办法之一
今天做一个微信公众号分享功能,参考微信sdk,代码几乎没有任何问题,但就是分享到QQ失败,以下是我QQ分享部分的代码: wx.onMenuShareQQ({ title: '快来和我一起玩转大脑', ...
- 上传文件,经过Zuul,中文文件名乱码解决办法
转载请标明出处: http://blog.csdn.net/forezp/article/details/77170470 本文出自方志朋的博客 问题描述 在项目中又一个上传文件的oss服务,直接调用 ...
- zblog上传安装主题插件不成功的原因和解决办法
最近有不少zblog用户反映在后台上传安装主题或者插件的时候出现了问题.本文就来尝试说明下这类问题的原因和解决办法. 首先来说说zblog主题或者插件的安装方法,一共有三种方式: 第一种是直接在网站后 ...
随机推荐
- vscode创建net core控制台程序
vscode近来深受的开发人员的喜爱.在下的前端同事们也纷纷使用vscode.在下就想了我等后端程序员也可以用vscode写C#代码.毕竟是从宇宙第一IDE ----Visual Studio衍生的 ...
- 后端MVC和前端MVVC关系详解
MVC 是后端的分层开发概念: MVVM是前端视图层的概念,主要关注于 视图层分离,也就是说:MVVM把前端的视图层,分为了 三部分 Model, View , VM ViewModel
- python的进程与线程(二)
线程 之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是: 进程:本质上就是一段程序的运行过程(抽象的概念) 线程:最小的执行单元,是进程的实体 ...
- ASP.NET Core Web API 集成测试
本文需要您了解ASP.NET Core Web API 和 xUnit的相关知识. 这里有xUnit的介绍: https://www.cnblogs.com/cgzl/p/9178672.html#t ...
- [深度概念]·K-Fold 交叉验证 (Cross-Validation)的理解与应用
K-Fold 交叉验证 (Cross-Validation)的理解与应用 我的网站 1.K-Fold 交叉验证概念 在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集.测试集是与训练独立的 ...
- Python input保证输入为int类型
t = float(input("t(℃)="))
- 深入浅出NIO Socket实现机制
前言 Java NIO 由以下几个核心部分组成: Buffer Channel Selector 以前基于net包进行socket编程时,accept方法会一直阻塞,直到有客户端请求的到来,并返回so ...
- 无需***,轻松提速 Github
无需***,轻松提速 Github 众所周知,Github 是全球程序员最喜欢访问的网站之一,但是在国内,会很容易出现一个水土不服的局面 -- 下载不了(稍微大一点中途就报错了),下载速度慢 .... ...
- oracle锁表与解表
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...
- Concat
.net 对List使用Concat newlist=list.Concat(list2).ToList() JS的Concat则不用ToList(),一样要用个值去接 Concat返回是一个新数组, ...