Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 525|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-6-23 12:10:33 | 显示全部楼层 |阅读模式

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

     

    这种问题,我们一般会使用的方法是一个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>
    整体代码

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 18:44 , Processed in 0.074090 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表