精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

WEB前端開發(fā)社區(qū) 昨天

在開發(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:

<script dangerouslySetInnerHTML={{ __html: this.getScript() }}></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不適合~放棄
總結(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)坑~
實(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:
<meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, minimum-scale=1,user-scalable=no, minimal-ui"></meta>
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 */} <script dangerouslySetInnerHTML={{ __html: this.getZoomScript() }}></script>
自適應(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;//如果是ipadif (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ī)型在打開一瞬間,有空白問題
本文完~


聲明:
本文于網(wǎng)絡(luò)整理,版權(quán)歸原作者所有,如來源信息有誤或侵犯權(quán)益,請(qǐng)聯(lián)系我們刪除或授權(quán)事宜。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
淺談h5移動(dòng)端頁面的適配問題
從網(wǎng)易與淘寶的font
也談多終端屏幕適配
移動(dòng)端自適應(yīng)
html 常用代碼
學(xué)習(xí)之響應(yīng)式Web設(shè)計(jì):Media Queries和Viewports
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 麻江县| 阳原县| 潍坊市| 来安县| 民权县| 收藏| 西乡县| 从化市| 鄂伦春自治旗| 濉溪县| 蓝田县| 揭东县| 望都县| 周宁县| 兴化市| 巫山县| 抚宁县| 沾化县| 伊吾县| 富民县| 抚顺县| 阳江市| 石景山区| 三明市| 南宁市| 富源县| 淳化县| 定兴县| 牙克石市| 蓬莱市| 六盘水市| 长白| 伊通| 嘉义市| 行唐县| 顺平县| 库车县| 英超| 托克托县| 新余市| 梨树县|