【前端开发】解决ios设备上fixed浮动的input输入框兼容问题

我们在开发移动端页面时,经常会存在这种需求,在页面顶部或底部有一个输入框,一直浮动在顶部或底部位置,中间部分的内容是可以滚动的。比如底部输入框的搜索功能,或底部输入框的写评论功能。

这种问题,我们一般会使用的方法是一个position:fixed;的div,在里面放一个input,浮动在顶部或底部,其他的内容可以滚动。

这种方法在安卓设备中肯定是没问题的。但是在ios设备中就会有问题了。

问题1:滚动页面内容部分时,浮动部分可能会消失,滚动结束后才展示出来

问题2:点击输入框进行输入时,呼出键盘后,输入框位置漂移了。

如视频效果:

这两个问题,之前在网上确实找过很多方法,也试过,但是都不太理想。

之前因为时间问题,所以就只使用了这种方法:

输入框获取焦点时,得到页面的滚动高度,将输入框div使用absolute绝对定位到当前滚动高度处,并禁止滚动。失去焦点后,将输入框div变回fixed,回到原来样子。

但此方法并不是很理想。只能勉强解决顶部浮动输入框的输入问题,但是页面滚动时,浮动区域消失和底部输入框问题无法得到解决。所以此方法就不适应了。

我们来看看新的方法。(此方法的原理是不适应fixed,全内容的高度就是body的整体高度,这样滚动起来就可以处理这些问题了,关键就是用到了有滚动条的div)

首先我们结构还是一样。页面3个外层div,有顶部input与底部input,中间的可滚动内容通过js计算出来。(这里注意,要关联计算当前页面的所有高度,让内容正好充满一屏)

<div class="fixedTop" alt="顶部不动的div">
    <input type="text" name="" value="输入框1">
</div>
<div class="centerContent">
    1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>
</div>
<div class="fixedBottom" alt="底部不动的div">
    <input type="text" name="" value="输入框2">
</div>

css

     *{
            margin:0;
            padding: 0;
        }

        .fixedTop{
            height: 30px;
            width:100%;
            background-color: red;
        }
        .fixedBottom{
            height: 30px;
            width:100%;
            background-color: red;
        }
        .centerContent{
            overflow: auto;/*让div存在滚动条*/
            /*解决ios中滚动div的卡顿问题*/
            -webkit-overflow-scroll:touch;
            -webkit-overflow-scrolling: touch;
        }
        .fixedTop input,.fixedBottom input{
            width: 100%;
            height:30px;
        }

.centerContent的高度通过页面整体高度-顶部div高度-底部div高度获得

js操作:

    var centerContentH=window.innerHeight-$(".fixedTop").height()-$(".fixedBottom").height();//可滚动区域高度
    $(".centerContent").css({"height":centerContentH});
    //底部输入框操作 输入框获取焦点时,将页面滚到最底部去
    $(".fixedBottom input").focus(function(){
        setTimeout(function(){
            $(window).scrollTop(window.innerHeight);
        },500);
    });

用这种方法,我们来看下效果:

看,是不是就实现了

我们来看看全部代码

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta charset="UTF-8">
    <title>解决</title>
    <script type="text/javascript" src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
    <style type="text/css">
        *{
            margin:0;
            padding: 0;
        }

        .fixedTop{
            height: 30px;
            width:100%;
            background-color: red;
        }
        .fixedBottom{
            height: 30px;
            width:100%;
            background-color: red;
        }
        .centerContent{
            overflow: auto;/*让div存在滚动条*/
            /*解决ios中滚动div的卡顿问题*/
            -webkit-overflow-scroll:touch;
            -webkit-overflow-scrolling: touch;
        }
        .fixedTop input,.fixedBottom input{
            width: 100%;
            height:30px;
        }
    </style>
</head>
<body>
<div class="fixedTop" alt="顶部不动的div">
    <input type="text" name="" value="输入框1">
</div>
<div class="centerContent">
    1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>1<br>
</div>
<div class="fixedBottom" alt="底部不动的div">
    <input type="text" name="" value="输入框2">
</div>
<script type="text/javascript">
    var centerContentH=window.innerHeight-$(".fixedTop").height()-$(".fixedBottom").height();//可滚动区域高度
    $(".centerContent").css({"height":centerContentH});
    //底部输入框操作 输入框获取焦点时,将页面滚到最底部去
    $(".fixedBottom input").focus(function(){
        setTimeout(function(){
            $(window).scrollTop(window.innerHeight);
        },500);
    });
</script>
</body>
</html>

整体代码

原文地址:https://www.cnblogs.com/wuhairui/p/ios-fixed.html

时间: 2024-10-16 19:58:13

【前端开发】解决ios设备上fixed浮动的input输入框兼容问题的相关文章

使IFRAME在iOS设备上支持滚动

原文链接: Scroll IFRAMEs on iOS原文日期: 2014年07月02日 翻译日期: 2014年07月10日翻译人员: 铁锚 很长时间以来, iOS设备上Safari中超出边界的元素将不能滚动,处理这种问题对开发人员来说一直是种折磨. 对原文作者的博客来说,这特别让人无奈,因为demo程序都是在沙箱IFRAMEs中运行的,这是为了不影响博客网站的AJAX页面加载策略.  通过一些研究发现,只要设置两个CSS属性,以及加上一个元素,这个问题就解决了. Here we go!(译者注

【转】使IFRAME在iOS设备上支持滚动

原文链接: Scroll IFRAMEs on iOS原文日期: 2014年07月02日 翻译日期: 2014年07月10日翻译人员: 铁锚 很长时间以来, iOS设备上Safari中超出边界的元素将不能滚动,处理这种问题对开发人员来说一直是种折磨. 对原文作者的博客来说,这特别让人无奈,因为demo程序都是在沙箱IFRAMEs中运行的,这是为了不影响博客网站的AJAX页面加载策略.  通过一些研究发现,只要设置两个CSS属性,以及加上一个元素,这个问题就解决了. Here we go!(译者注

web前端开发与iOS终端开发的异同[转]

* {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-family: Arial, Helvetica, sans-serif;margin: 0;color: #333;word-wrap: break-word;}h1, h2, h3, h4, h5, h6 {line-height: 1.1;}img {max-width: 100% !importan

Safari 前端开发调试 iOS 完美解决方案

在日趋现代化的 Web 网络中,各种现代浏览器和移动终端设备的用户百分比越来越高.对于我们 Web 前端开发者来说,运行 iOS Safari 浏览器的苹果移动设备对我们来说更是不容忽视的.然而当我们需要对前端页面进行测试调试时,桌面版 Safari 的表现并不是与移动版 Safari 一模一样的(主要缘起 CSS 中 device-width 的判断),因此我们只能直接在 iOS 设备上对 Safari 进行测试与调试. 本文主要介绍由苹果官方提供的 iOS 设备上 Safari 浏览器的前端

在ios设备上调试

ZJAppleID2014 1.创建开发者证书 每个开发者人员一次仅允许使用一个开发者证书,证书的管理可以登录 ios开发中心的配置门户网站(https://developer.apple.com/devcenter/ios/manage/overview/index.action) 登录该网站时,需要苹果的ios开发者帐号,登录成功后的界面如下: 点击IOS Apps下的Certificates(证书)导航菜单,得到的证书管理界面如下图所示,在此处下载证书和删除证书. 创建证书的过程分成两部:

如何在Android和iOS设备上录制游戏?

内容简介 如何在Android和iOS设备上录制游戏? 如何在Android和iOS设备上录制游戏? Xbox One,PS4,Windows 10等都集成了游戏录制功能,而且可以把录制的视频分享到网上. 现在,Android和iOS设备也可以实现游戏录制了. 怎么做呢?我们分为Android和iOS平台来介绍. Android平台 首先下载安装一个App,叫做<Google Play Games>. 运行此App,在菜单中点击<My Game>(英语<我的游戏>的意思

怎样将游戏从Unity导到iOS设备上

当我开始开发自己的iOS游戏时,我会考虑的第一件事便是如何将其导出到设备中,如此有效地测试我的游戏.最初,该过程看似很长且复杂,我所遇到的主要问题是,尽管存在许多资源,但是它们并非完全来自同样的地方,所以我不得不通过各种教程将其组合并匹配在一起.所以我决定通过本文一步步地总结这一过程.这是我到目前为止所遵循的一些方式;希望这也能够带给处于同样开发阶段的人更多帮助. 1.获得unity和iOS导出器 如果你还未这么做,你首先需要在官网下载最新版本的Unity.已经出现了2个版本,分别是免费版(ht

不通过AppStore,在iOS设备上直接安装应用程序的原理

本文转载至  http://mobile.51cto.com/hot-439095.htm 通过itms-services协议,可以通过safari浏览器直接在iOS设备上安装应用程序.利用这种方式,只要在内网布置一个服务器,测试人员只需要通过测试设备的safari浏览器访问特定的url既可以实现安装,然后测试了. AD:WOT2015 互联网运维与开发者大会 热销抢票 通过itms-services协议,可以通过safari浏览器直接在iOS设备上安装应用程序.利用这种方式,只要在内网布置一个

在Android和iOS设备上调用C++代码

不少Android和iOS项目中,因为种种原因不得不调用C/C++代码.这篇文章主要讲述如何通过Objective-C++.NDK技术在iOS及Android设备上调用C/C++代码. 主要工作原理 主要工作原理,如上图所示.Google Android提供NDK以便支持C/C++代码,而iOS可以通过Objective-C++(*.mm)来支持C/C++代码的编译运行.如果有朋友钻研过Cocos2d-x的话,应该对上述这些内容非常熟悉.好了,废话不多说,开始提供干货. 需要调用的C++代码 我