<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Web移動端實(shí)現(xiàn)自適應(yīng)縮放界面的方法匯總

          共 5911字,需瀏覽 12分鐘

           ·

          2020-07-28 16:09

          作者 |?唐宋元明清2188
          來源 | http://www.cnblogs.com/kybs0/

          在開發(fā)App端的網(wǎng)頁時,要適配iphone、ipad、ipod、安卓等各種機(jī)型,一般是直接使用em、px轉(zhuǎn)em、界面縮放。
          本章是通過將界面縮放,等比例顯示在各機(jī)型上。過程中遇到了些問題和大坑~
          然后下面是具體的自適應(yīng)實(shí)現(xiàn)方式的嘗試~

          方案一: 設(shè)置tranform/scale

          首先設(shè)置內(nèi)容固定寬度、自動高度(以下舉例)

            width: 375px;  height: auto;
          通過獲取窗口的寬度與固定寬度相除,獲得縮放比例
          const scaleValue=window.innerWidth / 375
          在html層,添加一段script:
          添加一段設(shè)置zoom值的函數(shù):
           getScript() {    return `      const zoomValue=window.innerWidth / 375;      document.documentElement.style.transform="scale("+zoomValue+")";      document.documentElement.style.transformOrigin="left top";?????;  }
          注:
          以上也可以直接寫script,我上面返回一段html是因?yàn)轫?xiàng)目是通過服務(wù)端渲染的。
          樣式的設(shè)置必須在界面加載之前,否則會因界面顯示變更出現(xiàn)閃現(xiàn)問題。
          因?yàn)樘砑恿朔?wù)端渲染,所以無法在界面一開始初始時,無法獲取window、document等對象。而上面html的注入,對服務(wù)端渲染機(jī)制的一個黑科技~
          上面的方案完成后,看看效果。然后坑出來了:
          1. 項(xiàng)目設(shè)置的absolue元素width 100%失效了 -- 可以設(shè)置固定的寬度解決

          2. 彈框position=fixed位置飛到天邊去了 -- 這個無法規(guī)避。

          網(wǎng)上找到了一篇文章?CSS3 transform對普通元素的N多渲染影響?,介紹了transform的一堆坑。
          我這個項(xiàng)目一些布局需要position=fixed,所以tranform不適合~放棄
          這個坑的其它介紹可以參考下:
          • transform限制position:fixed的跟隨效果

          • 關(guān)于在transform下的子元素設(shè)置fixed無效的困惑

          總結(jié):
          1. position:fixed不支持,所以想做標(biāo)題欄置頂,上面方案是無法實(shí)現(xiàn)的。

          2. ipad有遺留問題:微信瀏覽器,橫豎屏切換時,有些機(jī)型在打開一瞬間,橫向拖動有空白問題。這個問題無法處理~

          3. 以上方案因?yàn)槭褂昧藄cale,同時窗口的寬高window.innerHeight無法準(zhǔn)確獲取,需要除以比例,比如: window.innerHeight?/?(window.innerWidth?/ 375)

          方案二: 設(shè)置zoom

          在上一個方案的基礎(chǔ)上,嘗試zoom縮放:
           getScript() {return `const zoomValue=window.innerWidth / 375;document.documentElement.style.zoom = zoomValue;;}
          emmm,很簡單,調(diào)試效果看起來很不錯。模擬機(jī)上,看起來都正常~
          但是坑來了:真機(jī)有問題,發(fā)現(xiàn)在ipad的safari上,頁面是放大了,但是字段根本就沒變化!
          原因竟然是:蘋果在ipad的網(wǎng)頁,改動渲染方面的相關(guān)規(guī)則。有點(diǎn)坑~
          https://apple.stackexchange.com/questions/377216/css-zoom-does-not-work-ipad-os-v13-latest-safari
          https://stackoverflow.com/questions/7907760/why-the-font-size-wont-change-with-browser-zoom-in
          實(shí)現(xiàn)沒辦法,我后面嘗試,通過userAgent對ipad機(jī)型(ipad、macintosh)特殊處理,直接獲取所有包含了文字的div、p、span等元素,放大font-size。
          發(fā)現(xiàn)可以處理,沒毛?。〉且灿行┤毕?,沒辦法在一開始處理字體,因?yàn)樵剡€沒有初始化,而等界面加載后再刷字體大小,界面會閃現(xiàn)一次。

          方案三: 設(shè)置viewport-scare

          在html中添加默認(rèn)viewport:
          ps:minimal-ui 與本文無關(guān),它可以在safari加載網(wǎng)頁時隱藏地址欄與導(dǎo)航欄
          添加viewport更新:
          getScript() { return `const zoomValue=window.innerWidth / 375;var viewport = document.querySelector("meta[name=viewport]");viewport.content="width=device-width,initial-scale="+zoomValue+", maximum-scale="+zoomValue+", minimum-scale="+zoomValue+",user-scalable=no, minimal-ui"?; }
          運(yùn)行代碼,emmm,有一些小問題。
          • margin:auto,在某些布局下會讓頁面偏移 --?刪除就好

          • 設(shè)置background-image的區(qū)域,背景圖片并沒有填充滿 --?添加width:100%解決

          • position:fixed,寬高顯示有問題 --?設(shè)置固定寬度,比如375px,固定高度;如果需要全屏,可以使用height:?100vh。

          fixed布局建議:以彈框?yàn)槔?/span>
          添加fixed布局的容器,水平豎直方向靠邊距離分別設(shè)置一個就行了,left:0,bottom:0。
          然后添加absolute布局的內(nèi)容容器.如果需要居中,可以在js中設(shè)置bottom=window.innerHeight?/?2?-?元素的高度/2
          總結(jié):
          • 以上方案不支持fixed布局,修改完成后,ipad的水平滾動條依然存在,無法解決

          兼容適配

          采用第二個zoom縮放方案,同時對ipad機(jī)型特殊處理,另外采用scale縮放方案。
          完整代碼如下:
          1. 初始化適配(支持服務(wù)端渲染)
          html-header添加script
          {/* app contentAutoFit */} 
          自適應(yīng)可執(zhí)行代碼文本。
            //返回自適應(yīng)html字符串  getZoomScript() {   return `      const zoomValue = window.innerWidth / 375;      const userAgentInfo = window.clientInformation.appVersion;      //如果是ipad      if (userAgentInfo.indexOf("iPad") != -1 || userAgentInfo.indexOf("Macintosh") != -1) {       //內(nèi)容自適應(yīng) - 設(shè)置transform-scale。        //fixed布局時需要修改下left/margin-left等,同時窗口的寬高無法準(zhǔn)確獲取,需要除以比例,詳見windowSizeWithScaleHelper       //ipad有遺留問題:微信瀏覽器加載時,橫豎屏切換一瞬間,有空白問題。不過可以忽略~       document.documentElement.style.transform = "scale(" + zoomValue + "," + (zoomValue < 1 ? 1 : zoomValue) + ")";       document.documentElement.style.transformOrigin = "left top";       var html = document.querySelector("html");       html.style.width = '375px';      html.style.overflow = 'hidden';       html.style.overflowY = 'auto';     } else {       //內(nèi)容自適應(yīng) - 設(shè)置zoom。通過zoom來縮放界面,在ipad的safari瀏覽器等會存在字體無法縮放的兼容問題。       document.documentElement.style.zoom = zoomValue;     }     // 內(nèi)容自適應(yīng) - 設(shè)置viewport,整體okay。但是ipad的水平滾動條無法解決     // var viewport = document.querySelector("meta[name=viewport]");     // viewport.content = "width=device-width,initial-scale=" + zoomValue + ", maximum-scale=" + zoomValue + ", minimum-scale=" + zoomValue + ",user-scalable=no, minimal-ui"    `; }
          2. 添加加載及界面變更刷新機(jī)制
          • 微信瀏覽器橫豎屏切換時,某些機(jī)型不會觸發(fā)窗口大小變更,所以需要額外添加orientationchange監(jiān)聽

          • 加載過程中,微信瀏覽器切換橫豎屏?xí)酗@示問題,需要加載完成后適配

           componentDidMount() {      //window.onresize = this.adjustContentAutoFit;      //解決微信橫豎屏問題      window.addEventListener("orientationchange", this.adjustContentAutoFit);     //解決加載過程中,切換橫豎屏,導(dǎo)致界面沒有適配的問題      this.adjustContentAutoFit();    }    componentWillUnmount() {      window.removeEventListener("orientationchange", this.adjustContentAutoFit);   }   //監(jiān)聽窗口尺寸變更,刷新自適應(yīng)   adjustContentAutoFit() {    const zoomValue = window.innerWidth / 375;     const userAgentInfo = window.clientInformation.appVersion;     //如果是ipad     if (userAgentInfo.indexOf("iPad") != -1 || userAgentInfo.indexOf("Macintosh") != -1) {       //內(nèi)容自適應(yīng) - 設(shè)置transform-scale。      //fixed布局時需要修改下left/margin-left等,同時窗口的寬高無法準(zhǔn)確獲取,需要除以比例,詳見windowSizeWithScaleHelper       //ipad有遺留問題:微信瀏覽器,橫豎屏切換時,有些機(jī)型在打開一瞬間,有空白問題。不過可以忽略~       document.documentElement.style.transform = "scale(" + zoomValue + "," + (zoomValue < 1 ? 1 : zoomValue) + ")";       document.documentElement.style.transformOrigin = "left top";     var html = document.querySelector("html") as HTMLElement;      html.style.width = '375px';       html.style.overflow = 'hidden';      html.style.overflowY = 'auto';     } else {       // 內(nèi)容自適應(yīng) - 設(shè)置zoom。通過zoom來縮放界面,在ipad的safari瀏覽器等會存在字體無法縮放的兼容問題。       document.documentElement.style.zoom = zoomValue;    }    // 內(nèi)容自適應(yīng) - 設(shè)置viewport,整體okay。但是ipad的水平滾動條無法解決     // var viewport = document.querySelector("meta[name=viewport]");     // viewport.content = "width=device-width,initial-scale=" + zoomValue + ", maximum-scale=" + zoomValue + ", minimum-scale=" + zoomValue + ",user-scalable=no, minimal-ui"  }
          此方案的一些小遺留問題:
          • ipad不支持position:fixed,所以無法實(shí)現(xiàn)標(biāo)題欄置頂?shù)裙δ?/span>

          • 微信瀏覽器,橫豎屏切換時,有些機(jī)型在打開一瞬間,有空白問題

          參考:
          • IOS環(huán)境下固定定位position:fixed帶來的問題與解決方案

          • 小技巧css解決移動端ios不兼容position:fixed屬性,無需插件

          • 踩坑路上——IOS Safari瀏覽器下固定定位position:fixed帶來的問題與解決方案

          • iphone safari不支持position fixed的解決辦法

          • orientationchange事件、監(jiān)測微信移動端橫豎屏

          本文完~
          瀏覽 31
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码肏逼视频 | 超碰麻豆 | 欧美另类色图 | 无码一区二区三区四区精品 | 在线你懂得 |