1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【W(wǎng)eb技術(shù)】706- 移動(dòng)端實(shí)現(xiàn)自適應(yīng)縮放界面的方法匯總

        共 6120字,需瀏覽 13分鐘

         ·

        2020-09-06 04:10

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

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

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

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

          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è)置必須在界面加載之前,否則會(huì)因界面顯示變更出現(xiàn)閃現(xiàn)問題。
        因?yàn)樘砑恿朔?wù)端渲染,所以無法在界面一開始初始時(shí),無法獲取window、document等對(duì)象。而上面html的注入,對(duì)服務(wù)端渲染機(jī)制的一個(gè)黑科技~
        上面的方案完成后,看看效果。然后坑出來了:
        1. 項(xiàng)目設(shè)置的absolue元素width 100%失效了 -- 可以設(shè)置固定的寬度解決

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

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

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

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

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

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

        方案二:設(shè)置zoom

        在上一個(gè)方案的基礎(chǔ)上,嘗試zoom縮放:
         getScript() {return `const zoomValue=window.innerWidth / 375;document.documentElement.style.zoom = zoomValue;;}
        emmm,很簡單,調(diào)試效果看起來很不錯(cuò)。模擬機(jī)上,看起來都正常~
        但是坑來了:真機(jī)有問題,發(fā)現(xiàn)在ipad的safari上,頁面是放大了,但是字段根本就沒變化!
        原因竟然是:蘋果在ipad的網(wǎng)頁,改動(dò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對(duì)ipad機(jī)型(ipad、macintosh)特殊處理,直接獲取所有包含了文字的div、p、span等元素,放大font-size。
        發(fā)現(xiàn)可以處理,沒毛病!但是也有些缺陷,沒辦法在一開始處理字體,因?yàn)樵剡€沒有初始化,而等界面加載后再刷字體大小,界面會(huì)閃現(xiàn)一次。

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

        在html中添加默認(rèn)viewport:
        ps:minimal-ui 與本文無關(guān),它可以在safari加載網(wǎng)頁時(shí)隱藏地址欄與導(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,在某些布局下會(huì)讓頁面偏移 --?刪除就好

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

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

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

        兼容適配

        采用第二個(gè)zoom縮放方案,同時(shí)對(duì)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布局時(shí)需要修改下left/margin-left等,同時(shí)窗口的寬高無法準(zhǔn)確獲取,需要除以比例,詳見windowSizeWithScaleHelper       //ipad有遺留問題:微信瀏覽器加載時(shí),橫豎屏切換一瞬間,有空白問題。不過可以忽略~       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瀏覽器等會(huì)存在字體無法縮放的兼容問題。       document.documentElement.style.zoom = zoomValue;     }     // 內(nèi)容自適應(yīng) - 設(shè)置viewport,整體okay。但是ipad的水平滾動(dòng)條無法解決     // 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ī)制
        • 微信瀏覽器橫豎屏切換時(shí),某些機(jī)型不會(huì)觸發(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布局時(shí)需要修改下left/margin-left等,同時(shí)窗口的寬高無法準(zhǔn)確獲取,需要除以比例,詳見windowSizeWithScaleHelper       //ipad有遺留問題:微信瀏覽器,橫豎屏切換時(shí),有些機(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瀏覽器等會(huì)存在字體無法縮放的兼容問題。       document.documentElement.style.zoom = zoomValue;    }    // 內(nèi)容自適應(yīng) - 設(shè)置viewport,整體okay。但是ipad的水平滾動(dòng)條無法解決     // 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>

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

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

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

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

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

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

        本文完~



        1. JavaScript 重溫系列(22篇全)
        2. ECMAScript 重溫系列(10篇全)
        3. JavaScript設(shè)計(jì)模式 重溫系列(9篇全)
        4.?正則 / 框架 / 算法等 重溫系列(16篇全)
        5.?Webpack4 入門(上)||?Webpack4 入門(下)
        6.?MobX 入門(上)?||??MobX 入門(下)
        7.?70+篇原創(chuàng)系列匯總

        回復(fù)“加群”與大佬們一起交流學(xué)習(xí)~

        點(diǎn)擊“閱讀原文”查看70+篇原創(chuàng)文章

        瀏覽 39
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人在线免费观看网站 | 91无码人妻精品一区二区三区四 | 99re亚洲 | 最新国产在线拍揄自揄视频 | 色哟哟一区二区三区 | 免费成人色情视频 | 日韩黄毛片 | 欧美极品jizzhd高清 | 奶罩伸进揉捏高中h双性h | 少妇被躁到高潮无码A片游戏 |