解决input获取焦点时底部菜单被顶上来问题

 1 <div class="search-box">
 2
 3     <input class="search-input" type="text" placeholder="请输入名称">
 4 </div>
 5 <!--底部-->
 6 <div id="mini_nav" class="nav bt-nav">
 7     <div>
 8         <ul>
 9             <li><a href="#"><span class="ico-home"></span>
10                     主页
11                 </a>
12             </li>
13             <li><a class="selected-menu" href="#"><span class="ico-shop"></span>
14                     商城
15                 </a>
16             </li>
17             <li><a href="#"><span class="ico-service"></span>
18                     服务
19                 </a>
20             </li>
21             <li><a href="#"><span class="ico-me"></span>
22                     我的
23                 </a>
24             </li>
25         </ul>
26     </div>
27 </div>

当input获取焦点时底部菜单被顶上来问题解决方案:

1.如果是短页面,比如登录页,上部的登录表单div与底部的菜单div不会重合(两个div是同级的),可以通过设置登录表单div的z-index比底部菜单div的z-index大,这样在页面加载完成后,两个div不会重叠,其层级设置也不会受影响。而在input获取焦点之后,软键盘弹出,两个div发生重叠,因为设置了上部登录表单div的z-index比底部菜单div的z-index大,所以底部菜单div会被挡住,也就是看不到被顶上来的底部菜单,问题自然就迎刃而解了。

注意:z-index在position属性值为默认值static时不生效。
2.如果是长页面,比如商品展示页,上部的商品展示div肯定会与底部菜单div发生重叠,那么设置层级(z-index)肯定是行不通的,于是,可以使用js来控制底部菜单div的position的值来解决:

1 $(‘.search-input‘).bind(‘focus‘,function(){
2     $(‘#mini_nav‘).css(‘position‘,‘static‘);
3 }).bind(‘blur‘,function(){
4     $(‘#mini_nav‘).css({‘position‘:‘fixed‘,‘bottom‘:‘0‘});
5 });

说明:在input获取焦点时,改变底部菜单div的position值为static(默认值,不会脱离文档流),会被放置到document的最后,不会出现在软键盘上面,而当input失去焦点时,再把底部菜单div的position改回fixed,底部菜单div再次回到视口底部,这样问题就解决了。

到这里,我们又有一个疑问了,若软键盘是点击收起键收起的,input不会失去焦点,所以blur事件不会触发,底部菜单div的position也不会改回fixed,于是,我们可以通过捕捉键盘收起事件去改变底部菜单div的position。
那么如何捕捉到软键盘收起事件呢?在网上搜索了很久,终于找到了一个解决方案:根据视口的大小变化判断。
js代码如下:

 1 var wHeight = window.innerHeight; //获取初始可视窗口高度
 2 window.addEventListener(‘resize‘, function(){ //监测窗口大小的变化事件
 3     var hh = window.innerHeight; //当前可视窗口高度
 4     var viewTop = $(window).scrollTop(); //可视窗口高度顶部距离网页顶部的距离
 5     if(wHeight > hh){ //可以作为虚拟键盘弹出事件
 6         $(".content").animate({scrollTop:viewTop+100}); //调整可视页面的位置
 7         //do something...
 8     }else{ //可以作为虚拟键盘关闭事件
 9         //$("content").animate({scrollTop:viewTop-100});
10         $(‘#mini_nav‘).css({‘position‘:‘fixed‘,‘bottom‘:‘0‘});//软键盘关闭时改变底部菜单div的position
11     }
12     wHeight = hh;
13 });

OK,完成。

其实在用户滚动页面时会使input失去焦点触发blur事件,如果要求不是特别严格,这个小问题可以忽略。

时间: 2024-08-05 23:41:00

解决input获取焦点时底部菜单被顶上来问题的相关文章

去除input边框 input去除边框 去除input获取焦点时的蓝色外边框

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>去除input的边框</title> 6 <style> 7 input{text-indent: 1em;} 8 #search1{ } 9 #search2{ border-width: 0; } 10 #search3{ border:1px solid re

移动端input输入居底部所引起的问题及解决方法

刚工作不久,第一次接到要让input输入框居底部的页面的时候,最初的想法是用fixed方式,但在手机上明显的出现了问题.之后公司里面的带我的前辈发给了我这篇文章“Web移动端fixed布局的解决方案”.由于页面中并不需要文章中讲到的布局,参考文章中提供的思路:”由于fixed在软键盘唤起后会失效,导致页面可以滚动时,会跟随页面一起滚动.因此如果页面无法滚动,那么fixed元素即使失效,也不会滚动”,结合自己页面中顶部区域的高度是缩放的情况,选择使用js在页面初始化时动态的计算设置显示评论的区域高

移动端input获取焦点弹出输入框时影响fixed布局的问题

最近在做移动端项目的时候遇到的一个问题,在点击input获取焦点弹出输入框进行输入后,再次点击input输入框时,意外的事情发生了, 页面突然跳转到确定按钮跳转的页面了,刚开始以为是点击穿透导致的,朝着这个方向一直没有等到解决... 经过反复研究,发现第二次点击input 时,上面有一个隐形的按钮,这是怎么回事,确定按钮怎么就跑到上面去了呢,原来是由于最外层 使用了fixed布局,而第一次点击input获取焦点时,移动端默认弹出的输入框会将fixed布局的元素顶上去. 解决办法: 1.如果使用的

底部菜单被输入法顶上去的解决方案

安卓手机输入法弹出,消失会触发 window.onresize事件,我们一般的解决方法是获取焦点,底部隐藏,失去焦点,底部菜单出现,但是,有些人会点击这个按钮收起键牌 那么,这个时候你的失去焦点无效,还有一种方法呢,是把position:fixed;改成position:absoult;这样底部菜单就不会顶上去,但是这种方法,经过我的实验,还是会被输入法顶上去,这两种方法都不要完全解决问题,还有一种是布局的问题,主页面:position:relative,底部菜单:position:absoul

底部菜单中用fragment,fragment中套用PagerSlidingTabStrip,切换底部时viewpager消失

今天在开发时遇上一个问题,我用的框架是底部菜单四个按钮+fragment,然后主页中的fragment套用了PagerSlidingTabStrip,PagerSlidingTabStrip中是用Viewpager+Tab组合进行点击切换页面或者滑动切换菜单,就这样实现了我想要的功能,可是当我在底部菜单中相互切换时,PagerSlidingTabStrip中的Viewpeger消失了,这是怎么产生的呢?官方的Demo没有组合起来使用,所以没有问题,现在组合后问题就出来了,我换用了几个方法都没有解

js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法

HTML结构:很简单,就一个input,一个div,能说明问题就OK了: <input type="text" value="默认值"><br/><br/><div>搜索</div> 想要实现的结果: 1.input框获取焦点时value为“”,失去焦点时value为“默认值”:-----这个很好实现: 2.当在input框中输入要搜素的内容后,点击div搜索,要求控制台打印输出要搜素的内容(当然每个项目的

解决input输入光标不一致粗细!

今天有人问了谷歌和火狐下input输入框中的光标大小显示不一致,之前都没遇到过这~把人家的解决方法转过来先~~~以前在项目里碰到过一个问题input输入框用一个背景图模拟,设置height和line-height一样的高度,使里面的输入文字能够居中, 在FF下出现的情况是:点击input时,输入光标其实上跟input的height一样高,但当开始输入文字时,光标又变得跟文字一样高, chrome下光标跟input的height一样高, 而IE下光标跟文字的大小一致. 一直没弄明白为什么这样子,今

Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug

DOM的滚动 DOM规范中并没有规定各浏览器需要实现怎样的滚动页面区域,各浏览器实现了相应的方法,可以使用不同的方式控制页面区域的滚动.这些方法作为HTMLElement类型的扩展存在,所以它能在所有元素上使用. 1.scrollIntoView(alignWithTop)  滚动浏览器窗口或容器元素,以便在当前视窗的可见范围看见当前元素.如果alignWithTop为true,或者省略它,窗口会尽可能滚动到自身顶部与元素顶部平齐.-------目前各浏览器均支持 2.scrollIntoVie

转-TabHost组件(二)(实现底部菜单导航)

http://www.cnblogs.com/lichenwei/p/3975095.html 上面文章<安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航)>中提到了利用自定义View(ImageView+TextView)来设置一个底部菜单的样式 这边再补充一种更为灵活的方法,可以把TabWidget隐藏,用(RadioGroup+RadioButton)来代替,并利用监听器的方式来实现监听点击点击跳转Activity. 在讲解之前,先补充几点: 1.当我们取得TabHost的