中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

html5如何實現輸入框fixed定位在屏幕最底部兼容性

發布時間:2021-03-20 13:57:50 來源:億速云 閱讀:166 作者:小新 欄目:web開發

小編給大家分享一下html5如何實現輸入框fixed定位在屏幕最底部兼容性,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1、問題由來

做h6 已經有很長一段時間了,現在做的工作h6比pc上的更多,曾經解決pc端IE各個版本的兼容性也是傷透腦筋,原以為h6的會更好,殊不知,還有更頭疼的問題,當設計師要設計一個聊天窗口,把輸入框定位在最底部,這是再常見不過的問題了吧,舉例:

html5如何實現輸入框fixed定位在屏幕最底部兼容性

上圖就是我最近做的一個功能,原以為是很簡單的一個定位功能,但是沒想到牛逼的測試居然用各種iphone,各種安卓,各種瀏覽器(qq瀏覽器、safari、opera等瀏覽器),各種輸入法(系統自帶、搜狗輸入法),測出來一大堆問題,最后經過千辛萬苦,終于做到了能大致兼容。

2、初步解決

1)、結構布局于第一次解決

html5如何實現輸入框fixed定位在屏幕最底部兼容性

//1部分css
.header {
    width: 100%;
    height: 40px;
}
//2部分
.body {
   width: 100%;
   overflow: auto;
}
//3部分
.footer {
    width: 100%;
    height: 30px;position: fixed; bottom:0;left:0;right:0;
}
 <div class="header" id="header">會話問診</div>
 <div class="body" id="body"></div>
 <div class="footer" id="footer">
      <input type="text" id="input">
 </div>
$('.body').css('height', $(window).height() - 39);
$('#input').on('focus', function () {
   setTimeout(function () {
                 window.scrollTo(0, 1000000);
    }, 200);
 });

這種布局方法就讓中間".body"中的內容在".body"中滾動,對整個html中的body產生了1px的滾動,此處滾動的目的是為了執行"window.scrollTo(0, 1000000);",經過測試,若body沒有產生滾動,則這個方法是不會執行的。 

相信很多人都會以 以上的方法解決input在彈出鍵盤時候的問題,當鍵盤彈出來后,就讓滾動條一直往下面滾直到滾動到最下面,沒錯,這種措施之后能保證大部分的正常,但是在safari瀏覽器中就出現了問題,由于safari瀏覽器下部有一塊

html5如何實現輸入框fixed定位在屏幕最底部兼容性

圖中是safari瀏覽器自帶的一塊標簽,當使用以上滾動時,你會發現,他雖然是滾動上去了,但是也會出現一塊空白,沒錯,相當于給你的感覺是滾動上去過多,那么此時,也會被測試打回,是不是感覺很傷心無助,(safari瀏覽器把下面那塊當作了body的東西,他自己實現了一塊,把我們的html內容裝在了他自己實現的容器里面)

2)、進一步解決

經過大量的比較與測試,我發現了一個問題,safari下面的自帶輸入法根本不用處理,鍵盤依然可以正常彈出與收起。(ps:safari瀏覽器沒有特別的判斷,因此此處判斷過于復雜,如有更好的判斷,請留言,謝謝!此處之所以判斷safari瀏覽器并不是判斷QQ瀏覽器,是因為測試了opera瀏覽器的展示等跟QQ瀏覽器一樣,因此此處就判斷safari瀏覽器)

 $('input').on('focus', function () {  var agent = navigator.userAgent.toLowerCase();
    setTimeout(function () {
                  if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
                      && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
                      && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) 
                         {
			 //safari瀏覽器
                          } else {//其他瀏覽器
                               window.scrollTo(0, 1000000);
                  }
             }, 200);
 });

3)、再次優化與解決

經過以上幾步驟,原以為完美無缺的解決方案,可以達到很好的兼容了,可是意外又發生了,測試們用了搜狗輸入法來做測試,問題又來了,蘋果手機自帶的輸入法的實現是把body擠上去,搜狗則是在得到focus之后,直接彈出的一塊遮罩層,這就導致了問題,此時我們的輸入框被擋在了輸入法之后,因此又增加了下面的判斷與處理,

$('input').on('focus', function () {
setTimeout(function () {
                if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
                    && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
                    && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari瀏覽器
                    if(scope.$txtWrap.offset().top-winobj.scrollTop() > document.body.offsetHeight/2) { //說明軟鍵盤遮蓋頁面
                        window.scrollTo(0, winobj.height() - 270);
                    }
                } else {//其他瀏覽器
                    window.scrollTo(0, 1000000);
                }
            }, 200);
});

3、解決

經過幾次測試,看似幾乎沒問題,最后又在iphone5上面的QQ瀏覽器中用搜狗輸入法又測試出了問題,它在第一次點擊當input獲取到第一次focus事件的時候,window執行了scrollTo方法,第二次,他不再執行,不難發現,系統是以為已經滾動到了下方,因此便不再執行,那么我又增加了一個事件

$('input').on('blur', function () {
  window.scrollTo(0, 0);
});

終于大功告成,基本上解決了現在普遍瀏覽器中大部分搜狗和自帶輸入法對模擬fix的input定位問題。

總結最后解決js為:

$('input').on('focus', function () {
    var agent = navigator.userAgent.toLowerCase();
  setTimeout(function () {
                if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
                    && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
                    && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari瀏覽器
                    if(scope.$txtWrap.offset().top-winobj.scrollTop() > document.body.offsetHeight/2) { //說明軟鍵盤遮蓋頁面
                        window.scrollTo(0, winobj.height() - 270);
                    }
                } else {//其他瀏覽器
                    window.scrollTo(0, 1000000);
                }
            }, 200);
});

$('input').on('blur', function () {
    var agent = navigator.userAgent.toLowerCase();
     setTimeout(function () {
                if (!(agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
                    && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
                    && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1)) {//非safari瀏覽器
                        window.scrollTo(0, 0);
                }
            }, 0);
});

重中之重,一定要讓body產生滾動,不然以上方法依然無法解決。

最近同事又測出了我的方案對某些手機的不兼容性,所以他給出了另一個解決方案,經測試已經達到了幾乎所有手機的兼容,下面提供給大家:

inputFocus: function (e) {
            var winobj = $(window),
                scope = this,
                agent = navigator.userAgent.toLowerCase();
            setTimeout(function () {
                if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
                    && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
                    && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safra瀏覽器
                    window.scrollTo(0, 1000000);//先滾動到最底部,再用scrollY得到當前的值,必須延遲 否則拿到的就是1000000
                    setTimeout(function(){
                        window.scrollTo(0, window.scrollY - 45);//45像素 所有瀏覽器都是這么高
                    }, 50)
                } else {//其他瀏覽器
                    window.scrollTo(0, 1000000);
                    // window.scrollTo(0, ++this.scrollNum);
                }
            }, 200);
        },

這是我解決這個問題的過程與實踐,

以上是“html5如何實現輸入框fixed定位在屏幕最底部兼容性”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆安县| 大厂| 赤峰市| 伊川县| 大化| 连州市| 上栗县| 舟曲县| 卢氏县| 绥江县| 平乡县| 泰州市| 隆安县| 黄平县| 黄大仙区| 吉木乃县| 康平县| 邯郸县| 岢岚县| 容城县| 白朗县| 青神县| 延津县| 法库县| 盐源县| 利川市| 永定县| 博客| 祁东县| 咸宁市| 丰台区| 丹寨县| 漳浦县| 巩留县| 兖州市| 罗源县| 澄城县| 盖州市| 上饶市| 秭归县| 益阳市|